Skip to content

Commit 00efbf6

Browse files
committed
Introduce Modifiable interface to standardized modifiers API
1 parent e4e7a6f commit 00efbf6

File tree

7 files changed

+117
-88
lines changed

7 files changed

+117
-88
lines changed

kotlinpoet/api/kotlinpoet.api

+34-30
Large diffs are not rendered by default.

kotlinpoet/src/jvmMain/kotlin/com/squareup/kotlinpoet/FunSpec.kt

+6-12
Original file line numberDiff line numberDiff line change
@@ -42,13 +42,14 @@ public class FunSpec private constructor(
4242
OriginatingElementsHolder by delegateOriginatingElementsHolder,
4343
ContextReceivable by contextReceivers,
4444
Annotatable,
45-
Documentable {
45+
Documentable,
46+
Modifiable {
4647
public val name: String = builder.name
4748
override val kdoc: CodeBlock = builder.kdoc.build()
4849
public val returnKdoc: CodeBlock = builder.returnKdoc
4950
public val receiverKdoc: CodeBlock = builder.receiverKdoc
5051
override val annotations: List<AnnotationSpec> = builder.annotations.toImmutableList()
51-
public val modifiers: Set<KModifier> = builder.modifiers.toImmutableSet()
52+
override val modifiers: Set<KModifier> = builder.modifiers.toImmutableSet()
5253
public val typeVariables: List<TypeVariableName> = builder.typeVariables.toImmutableList()
5354
public val receiverType: TypeName? = builder.receiverType
5455

@@ -307,7 +308,8 @@ public class FunSpec private constructor(
307308
OriginatingElementsHolder.Builder<Builder>,
308309
ContextReceivable.Builder<Builder>,
309310
Annotatable.Builder<Builder>,
310-
Documentable.Builder<Builder> {
311+
Documentable.Builder<Builder>,
312+
Modifiable.Builder<Builder> {
311313
internal var returnKdoc = CodeBlock.EMPTY
312314
internal var receiverKdoc = CodeBlock.EMPTY
313315
internal var receiverType: TypeName? = null
@@ -317,7 +319,7 @@ public class FunSpec private constructor(
317319
internal val body = CodeBlock.builder()
318320
override val kdoc: CodeBlock.Builder = CodeBlock.builder()
319321
override val annotations: MutableList<AnnotationSpec> = mutableListOf()
320-
public val modifiers: MutableList<KModifier> = mutableListOf()
322+
override val modifiers: MutableSet<KModifier> = mutableSetOf()
321323
public val typeVariables: MutableList<TypeVariableName> = mutableListOf()
322324
public val parameters: MutableList<ParameterSpec> = mutableListOf()
323325
override val tags: MutableMap<KClass<*>, Any> = mutableMapOf()
@@ -326,14 +328,6 @@ public class FunSpec private constructor(
326328
@ExperimentalKotlinPoetApi
327329
override val contextReceiverTypes: MutableList<TypeName> = mutableListOf()
328330

329-
public fun addModifiers(vararg modifiers: KModifier): Builder = apply {
330-
this.modifiers += modifiers
331-
}
332-
333-
public fun addModifiers(modifiers: Iterable<KModifier>): Builder = apply {
334-
this.modifiers += modifiers
335-
}
336-
337331
public fun jvmModifiers(modifiers: Iterable<Modifier>) {
338332
var visibility = KModifier.INTERNAL
339333
for (modifier in modifiers) {
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,49 @@
1+
/*
2+
* Copyright (C) 2024 Square, Inc.
3+
*
4+
* Licensed under the Apache License, Version 2.0 (the "License");
5+
* you may not use this file except in compliance with the License.
6+
* You may obtain a copy of the License at
7+
*
8+
* https://www.apache.org/licenses/LICENSE-2.0
9+
*
10+
* Unless required by applicable law or agreed to in writing, software
11+
* distributed under the License is distributed on an "AS IS" BASIS,
12+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13+
* See the License for the specific language governing permissions and
14+
* limitations under the License.
15+
*/
16+
package com.squareup.kotlinpoet
17+
18+
/** A spec that has a set of [KModifier]s attached to it. */
19+
public interface Modifiable {
20+
public val modifiers: Set<KModifier>
21+
22+
public interface Builder<out T : Builder<T>> {
23+
public val modifiers: MutableSet<KModifier>
24+
25+
/**
26+
* Add one or multiple modifiers to this spec.
27+
*
28+
* Note that not all [KModifier]s can be applied to a specific spec, and specs may or may not
29+
* validate modifiers at runtime. Consult Kotlin documentation on which modifiers are allowed on
30+
* specific Kotlin constructs.
31+
*/
32+
@Suppress("UNCHECKED_CAST")
33+
public fun addModifiers(vararg modifiers: KModifier): T = apply {
34+
this.modifiers += modifiers
35+
} as T
36+
37+
/**
38+
* Add a collection of modifiers to this spec.
39+
*
40+
* Note that not all [KModifier]s can be applied to a specific spec, and specs may or may not
41+
* validate modifiers at runtime. Consult Kotlin documentation on which modifiers are allowed on
42+
* specific Kotlin constructs.
43+
*/
44+
@Suppress("UNCHECKED_CAST")
45+
public fun addModifiers(modifiers: Iterable<KModifier>): T = apply {
46+
this.modifiers += modifiers
47+
} as T
48+
}
49+
}

kotlinpoet/src/jvmMain/kotlin/com/squareup/kotlinpoet/ParameterSpec.kt

+7-12
Original file line numberDiff line numberDiff line change
@@ -29,11 +29,11 @@ import kotlin.reflect.KClass
2929
public class ParameterSpec private constructor(
3030
builder: Builder,
3131
private val tagMap: TagMap = builder.buildTagMap(),
32-
) : Taggable by tagMap, Annotatable, Documentable {
32+
) : Taggable by tagMap, Annotatable, Documentable, Modifiable {
3333
public val name: String = builder.name
3434
override val kdoc: CodeBlock = builder.kdoc.build()
3535
override val annotations: List<AnnotationSpec> = builder.annotations.toImmutableList()
36-
public val modifiers: Set<KModifier> = builder.modifiers
36+
override val modifiers: Set<KModifier> = builder.modifiers
3737
.also {
3838
LinkedHashSet(it).apply {
3939
removeAll(ALLOWED_PARAMETER_MODIFIERS)
@@ -94,22 +94,17 @@ public class ParameterSpec private constructor(
9494
public class Builder internal constructor(
9595
internal val name: String,
9696
internal val type: TypeName,
97-
) : Taggable.Builder<Builder>, Annotatable.Builder<Builder>, Documentable.Builder<Builder> {
97+
) : Taggable.Builder<Builder>,
98+
Annotatable.Builder<Builder>,
99+
Documentable.Builder<Builder>,
100+
Modifiable.Builder<Builder> {
98101
internal var defaultValue: CodeBlock? = null
99102

100-
public val modifiers: MutableList<KModifier> = mutableListOf()
103+
override val modifiers: MutableSet<KModifier> = mutableSetOf()
101104
override val kdoc: CodeBlock.Builder = CodeBlock.builder()
102105
override val tags: MutableMap<KClass<*>, Any> = mutableMapOf()
103106
override val annotations: MutableList<AnnotationSpec> = mutableListOf()
104107

105-
public fun addModifiers(vararg modifiers: KModifier): Builder = apply {
106-
this.modifiers += modifiers
107-
}
108-
109-
public fun addModifiers(modifiers: Iterable<KModifier>): Builder = apply {
110-
this.modifiers += modifiers
111-
}
112-
113108
@Deprecated(
114109
"There are no jvm modifiers applicable to parameters in Kotlin",
115110
ReplaceWith(""),

kotlinpoet/src/jvmMain/kotlin/com/squareup/kotlinpoet/PropertySpec.kt

+6-12
Original file line numberDiff line numberDiff line change
@@ -34,13 +34,14 @@ public class PropertySpec private constructor(
3434
OriginatingElementsHolder by delegateOriginatingElementsHolder,
3535
ContextReceivable by contextReceivers,
3636
Annotatable,
37-
Documentable {
37+
Documentable,
38+
Modifiable {
3839
public val mutable: Boolean = builder.mutable
3940
public val name: String = builder.name
4041
public val type: TypeName = builder.type
4142
override val kdoc: CodeBlock = builder.kdoc.build()
4243
override val annotations: List<AnnotationSpec> = builder.annotations.toImmutableList()
43-
public val modifiers: Set<KModifier> = builder.modifiers.toImmutableSet()
44+
override val modifiers: Set<KModifier> = builder.modifiers.toImmutableSet()
4445
public val typeVariables: List<TypeVariableName> = builder.typeVariables.toImmutableList()
4546
public val initializer: CodeBlock? = builder.initializer
4647
public val delegated: Boolean = builder.delegated
@@ -176,7 +177,8 @@ public class PropertySpec private constructor(
176177
OriginatingElementsHolder.Builder<Builder>,
177178
ContextReceivable.Builder<Builder>,
178179
Annotatable.Builder<Builder>,
179-
Documentable.Builder<Builder> {
180+
Documentable.Builder<Builder>,
181+
Modifiable.Builder<Builder> {
180182
internal var isPrimaryConstructorParameter = false
181183
internal var mutable = false
182184
internal var initializer: CodeBlock? = null
@@ -185,7 +187,7 @@ public class PropertySpec private constructor(
185187
internal var setter: FunSpec? = null
186188
internal var receiverType: TypeName? = null
187189

188-
public val modifiers: MutableList<KModifier> = mutableListOf()
190+
override val modifiers: MutableSet<KModifier> = mutableSetOf()
189191
public val typeVariables: MutableList<TypeVariableName> = mutableListOf()
190192
override val tags: MutableMap<KClass<*>, Any> = mutableMapOf()
191193
override val kdoc: CodeBlock.Builder = CodeBlock.builder()
@@ -200,14 +202,6 @@ public class PropertySpec private constructor(
200202
this.mutable = mutable
201203
}
202204

203-
public fun addModifiers(vararg modifiers: KModifier): Builder = apply {
204-
this.modifiers += modifiers
205-
}
206-
207-
public fun addModifiers(modifiers: Iterable<KModifier>): Builder = apply {
208-
this.modifiers += modifiers
209-
}
210-
211205
public fun addTypeVariables(typeVariables: Iterable<TypeVariableName>): Builder = apply {
212206
this.typeVariables += typeVariables
213207
}

kotlinpoet/src/jvmMain/kotlin/com/squareup/kotlinpoet/TypeAliasSpec.kt

+7-16
Original file line numberDiff line numberDiff line change
@@ -26,10 +26,10 @@ import kotlin.reflect.KClass
2626
public class TypeAliasSpec private constructor(
2727
builder: Builder,
2828
private val tagMap: TagMap = builder.buildTagMap(),
29-
) : Taggable by tagMap, Annotatable, Documentable {
29+
) : Taggable by tagMap, Annotatable, Documentable, Modifiable {
3030
public val name: String = builder.name
3131
public val type: TypeName = builder.type
32-
public val modifiers: Set<KModifier> = builder.modifiers.toImmutableSet()
32+
override val modifiers: Set<KModifier> = builder.modifiers.toImmutableSet()
3333
public val typeVariables: List<TypeVariableName> = builder.typeVariables.toImmutableList()
3434
override val kdoc: CodeBlock = builder.kdoc.build()
3535
override val annotations: List<AnnotationSpec> = builder.annotations.toImmutableList()
@@ -69,25 +69,16 @@ public class TypeAliasSpec private constructor(
6969
public class Builder internal constructor(
7070
internal val name: String,
7171
internal val type: TypeName,
72-
) : Taggable.Builder<Builder>, Annotatable.Builder<Builder>, Documentable.Builder<Builder> {
73-
public val modifiers: MutableSet<KModifier> = mutableSetOf()
72+
) : Taggable.Builder<Builder>,
73+
Annotatable.Builder<Builder>,
74+
Documentable.Builder<Builder>,
75+
Modifiable.Builder<Builder> {
76+
override val modifiers: MutableSet<KModifier> = mutableSetOf()
7477
public val typeVariables: MutableSet<TypeVariableName> = mutableSetOf()
7578
override val tags: MutableMap<KClass<*>, Any> = mutableMapOf()
7679
override val kdoc: CodeBlock.Builder = CodeBlock.builder()
7780
override val annotations: MutableList<AnnotationSpec> = mutableListOf()
7881

79-
public fun addModifiers(vararg modifiers: KModifier): Builder = apply {
80-
modifiers.forEach(this::addModifier)
81-
}
82-
83-
public fun addModifiers(modifiers: Iterable<KModifier>): Builder = apply {
84-
modifiers.forEach(this::addModifier)
85-
}
86-
87-
private fun addModifier(modifier: KModifier) {
88-
this.modifiers.add(modifier)
89-
}
90-
9182
public fun addTypeVariables(typeVariables: Iterable<TypeVariableName>): Builder = apply {
9283
this.typeVariables += typeVariables
9384
}

kotlinpoet/src/jvmMain/kotlin/com/squareup/kotlinpoet/TypeSpec.kt

+8-6
Original file line numberDiff line numberDiff line change
@@ -48,13 +48,14 @@ public class TypeSpec private constructor(
4848
ContextReceivable by contextReceivers,
4949
Annotatable,
5050
Documentable,
51+
Modifiable,
5152
TypeSpecHolder,
5253
MemberSpecHolder {
5354
public val kind: Kind = builder.kind
5455
public val name: String? = builder.name
5556
override val kdoc: CodeBlock = builder.kdoc.build()
5657
override val annotations: List<AnnotationSpec> = builder.annotations.toImmutableList()
57-
public val modifiers: Set<KModifier> = builder.modifiers.toImmutableSet()
58+
override val modifiers: Set<KModifier> = builder.modifiers.toImmutableSet()
5859
public val typeVariables: List<TypeVariableName> = builder.typeVariables.toImmutableList()
5960
public val primaryConstructor: FunSpec? = builder.primaryConstructor
6061
public val superclass: TypeName = builder.superclass
@@ -476,6 +477,7 @@ public class TypeSpec private constructor(
476477
ContextReceivable.Builder<Builder>,
477478
Annotatable.Builder<Builder>,
478479
Documentable.Builder<Builder>,
480+
Modifiable.Builder<Builder>,
479481
TypeSpecHolder.Builder<Builder>,
480482
MemberSpecHolder.Builder<Builder> {
481483
internal var primaryConstructor: FunSpec? = null
@@ -499,7 +501,7 @@ public class TypeSpec private constructor(
499501

500502
@ExperimentalKotlinPoetApi
501503
override val contextReceiverTypes: MutableList<TypeName> = mutableListOf()
502-
public val modifiers: MutableSet<KModifier> = mutableSetOf(*modifiers)
504+
override val modifiers: MutableSet<KModifier> = mutableSetOf(*modifiers)
503505
public val superinterfaces: MutableMap<TypeName, CodeBlock?> = mutableMapOf()
504506
public val enumConstants: MutableMap<String, TypeSpec> = mutableMapOf()
505507
public val typeVariables: MutableList<TypeVariableName> = mutableListOf()
@@ -511,14 +513,14 @@ public class TypeSpec private constructor(
511513
@Deprecated("Use annotations property", ReplaceWith("annotations"), ERROR)
512514
public val annotationSpecs: MutableList<AnnotationSpec> get() = annotations
513515

514-
public fun addModifiers(vararg modifiers: KModifier): Builder = apply {
516+
override fun addModifiers(vararg modifiers: KModifier): Builder {
515517
check(!isAnonymousClass) { "forbidden on anonymous types." }
516-
this.modifiers += modifiers
518+
return super.addModifiers(*modifiers)
517519
}
518520

519-
public fun addModifiers(modifiers: Iterable<KModifier>): Builder = apply {
521+
override fun addModifiers(modifiers: Iterable<KModifier>): Builder {
520522
check(!isAnonymousClass) { "forbidden on anonymous types." }
521-
this.modifiers += modifiers
523+
return super.addModifiers(modifiers)
522524
}
523525

524526
public fun addTypeVariables(typeVariables: Iterable<TypeVariableName>): Builder = apply {

0 commit comments

Comments
 (0)