Skip to content

Commit b20c38b

Browse files
authored
Added full KMP support for the Gradle Plugin (#534)
1 parent aec2a0b commit b20c38b

File tree

87 files changed

+3246
-628
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

87 files changed

+3246
-628
lines changed

gradle-conventions/src/main/kotlin/conventions-jvm.gradle.kts

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,10 @@ java {
2020
withSourcesJar()
2121
}
2222

23-
configureJavaCompatibility(8)
23+
if (project.name != "gradle-plugin") {
24+
configureJavaCompatibility(8)
25+
}
26+
2427
configureKotlinCompatibility("2.0.0")
2528

2629
kotlin {

gradle-conventions/src/main/kotlin/util/other/generateSource.kt

Lines changed: 19 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -40,20 +40,28 @@ fun Project.generateSource(
4040
text: String,
4141
chooseSourceSet: NamedDomainObjectContainer<KotlinSourceSet>.() -> NamedDomainObjectProvider<KotlinSourceSet>,
4242
) {
43-
val sourcesDir = File(project.layout.buildDirectory.asFile.get(), "generated-sources/kotlin")
44-
45-
val generatePluginVersionTask =
46-
tasks.register<GenerateSourceTask>("generateSources_$name", name, text, sourcesDir)
47-
4843
withKotlinJvmExtension {
49-
chooseSourceSet(sourceSets).configure {
50-
kotlin.srcDir(generatePluginVersionTask.map { it.sourcesDir })
51-
}
44+
generateSource(sourceSets, name, text, chooseSourceSet)
5245
}
5346

5447
withKotlinKmpExtension {
55-
chooseSourceSet(sourceSets).configure {
56-
kotlin.srcDir(generatePluginVersionTask.map { it.sourcesDir })
57-
}
48+
generateSource(sourceSets, name, text, chooseSourceSet)
49+
}
50+
}
51+
52+
private fun Project.generateSource(
53+
sourceSets: NamedDomainObjectContainer<KotlinSourceSet>,
54+
name: String,
55+
text: String,
56+
chooseSourceSet: NamedDomainObjectContainer<KotlinSourceSet>.() -> NamedDomainObjectProvider<KotlinSourceSet>,
57+
) {
58+
val sourceSet = chooseSourceSet(sourceSets)
59+
val sourcesDir = File(project.layout.buildDirectory.asFile.get(), "generated-sources/kotlin/${sourceSet.name}")
60+
61+
val generatePluginVersionTask =
62+
tasks.register<GenerateSourceTask>("generateSources_$name", name, text, sourcesDir)
63+
64+
sourceSet.configure {
65+
kotlin.srcDir(generatePluginVersionTask.map { it.sourcesDir })
5866
}
5967
}

gradle-plugin/api/gradle-plugin.api

Lines changed: 67 additions & 42 deletions
Original file line numberDiff line numberDiff line change
@@ -2,9 +2,8 @@ public abstract interface annotation class kotlinx/rpc/RpcDangerousApi : java/la
22
}
33

44
public class kotlinx/rpc/RpcExtension {
5-
public fun <init> (Lorg/gradle/api/model/ObjectFactory;Lorg/gradle/api/Project;)V
65
public final fun getAnnotationTypeSafetyEnabled ()Lorg/gradle/api/provider/Provider;
7-
public final fun getProtoc ()Lkotlinx/rpc/protoc/ProtocExtension;
6+
public final fun getProtoc ()Lorg/gradle/api/provider/Provider;
87
public final fun getStrict ()Lkotlinx/rpc/RpcStrictModeExtension;
98
public final fun protoc (Lorg/gradle/api/Action;)V
109
public static synthetic fun protoc$default (Lkotlinx/rpc/RpcExtension;Lorg/gradle/api/Action;ILjava/lang/Object;)V
@@ -27,7 +26,6 @@ public final class kotlinx/rpc/RpcStrictMode : java/lang/Enum {
2726
}
2827

2928
public class kotlinx/rpc/RpcStrictModeExtension {
30-
public fun <init> (Lorg/gradle/api/model/ObjectFactory;)V
3129
public final fun getFields ()Lorg/gradle/api/provider/Property;
3230
public final fun getNestedFlow ()Lorg/gradle/api/provider/Property;
3331
public final fun getNotTopLevelServerFlow ()Lorg/gradle/api/provider/Property;
@@ -43,13 +41,11 @@ public final class kotlinx/rpc/VersionsKt {
4341
}
4442

4543
public class kotlinx/rpc/buf/BufCommentsExtension {
46-
public fun <init> (Lorg/gradle/api/Project;)V
4744
public final fun getCopyComments ()Lorg/gradle/api/provider/Property;
4845
public final fun getIncludeFileLevelComments ()Lorg/gradle/api/provider/Property;
4946
}
5047

5148
public class kotlinx/rpc/buf/BufExtension {
52-
public fun <init> (Lorg/gradle/api/model/ObjectFactory;)V
5349
public final fun generate (Lorg/gradle/api/Action;)V
5450
public final fun getConfigFile ()Lorg/gradle/api/provider/Property;
5551
public final fun getGenerate ()Lkotlinx/rpc/buf/BufGenerateExtension;
@@ -70,7 +66,7 @@ public final class kotlinx/rpc/buf/BufExtension$LogFormat : java/lang/Enum {
7066
}
7167

7268
public class kotlinx/rpc/buf/BufGenerateExtension {
73-
public fun <init> (Lorg/gradle/api/Project;)V
69+
public final fun allTasks ()Lkotlinx/rpc/buf/tasks/BufTasks;
7470
public final fun comments (Lorg/gradle/api/Action;)V
7571
public final fun getComments ()Lkotlinx/rpc/buf/BufCommentsExtension;
7672
public final fun getErrorFormat ()Lorg/gradle/api/provider/Property;
@@ -92,13 +88,9 @@ public final class kotlinx/rpc/buf/BufGenerateExtension$ErrorFormat : java/lang/
9288
}
9389

9490
public class kotlinx/rpc/buf/BufTasksExtension {
95-
public fun <init> (Lorg/gradle/api/Project;)V
96-
public final fun registerWorkspaceTask (Lkotlin/reflect/KClass;Ljava/lang/String;Lorg/gradle/api/Action;)Lkotlinx/rpc/buf/BufTasksExtension$TaskProvider;
97-
}
98-
99-
public abstract interface class kotlinx/rpc/buf/BufTasksExtension$TaskProvider {
100-
public abstract fun getMainTask ()Lorg/gradle/api/provider/Provider;
101-
public abstract fun getTestTask ()Lorg/gradle/api/provider/Provider;
91+
public final fun all ()Lkotlinx/rpc/buf/tasks/BufAllTasks;
92+
public final fun registerWorkspaceTask (Lkotlin/reflect/KClass;Ljava/lang/String;Lorg/gradle/api/Action;)Lkotlinx/rpc/buf/tasks/BufTasks;
93+
public static synthetic fun registerWorkspaceTask$default (Lkotlinx/rpc/buf/BufTasksExtension;Lkotlin/reflect/KClass;Ljava/lang/String;Lorg/gradle/api/Action;ILjava/lang/Object;)Lkotlinx/rpc/buf/tasks/BufTasks;
10294
}
10395

10496
public final class kotlinx/rpc/buf/ConstsKt {
@@ -107,24 +99,39 @@ public final class kotlinx/rpc/buf/ConstsKt {
10799
public static final field BUF_YAML Ljava/lang/String;
108100
}
109101

102+
public abstract interface class kotlinx/rpc/buf/tasks/BufAllTasks : kotlinx/rpc/buf/tasks/BufTasks {
103+
public abstract fun matchingType (Lkotlin/reflect/KClass;)Lkotlinx/rpc/buf/tasks/BufTasks;
104+
}
105+
110106
public abstract class kotlinx/rpc/buf/tasks/BufExecTask : org/gradle/api/DefaultTask {
111-
public fun <init> ()V
107+
public fun <init> (Lkotlinx/rpc/buf/tasks/BufExecTask$Properties;)V
112108
public abstract fun getArgs ()Lorg/gradle/api/provider/ListProperty;
113109
public abstract fun getBufTimeoutInWholeSeconds ()Lorg/gradle/api/provider/Property;
114110
public abstract fun getCommand ()Lorg/gradle/api/provider/Property;
115111
public abstract fun getConfigFile ()Lorg/gradle/api/provider/Property;
116112
public abstract fun getLogFormat ()Lorg/gradle/api/provider/Property;
113+
public final fun getProperties ()Lkotlinx/rpc/buf/tasks/BufExecTask$Properties;
117114
public abstract fun getWorkingDir ()Lorg/gradle/api/provider/Property;
118115
}
119116

117+
public final class kotlinx/rpc/buf/tasks/BufExecTask$AndroidProperties : kotlinx/rpc/buf/tasks/BufExecTask$Properties {
118+
public final fun getBuildType ()Ljava/lang/String;
119+
public final fun getFlavor ()Ljava/lang/String;
120+
public final fun getVariant ()Ljava/lang/String;
121+
}
122+
123+
public class kotlinx/rpc/buf/tasks/BufExecTask$Properties {
124+
public final fun getSourceSetName ()Ljava/lang/String;
125+
public final fun isTest ()Z
126+
}
127+
120128
public final class kotlinx/rpc/buf/tasks/BufExecTaskKt {
121-
public static final fun registerBufExecTask (Lorg/gradle/api/Project;Lkotlin/reflect/KClass;Ljava/lang/String;Lorg/gradle/api/provider/Provider;Lkotlin/jvm/functions/Function1;)Lorg/gradle/api/tasks/TaskProvider;
122-
public static synthetic fun registerBufExecTask$default (Lorg/gradle/api/Project;Lkotlin/reflect/KClass;Ljava/lang/String;Lorg/gradle/api/provider/Provider;Lkotlin/jvm/functions/Function1;ILjava/lang/Object;)Lorg/gradle/api/tasks/TaskProvider;
129+
public static final fun registerBufExecTask (Lorg/gradle/api/Project;Lkotlin/reflect/KClass;Ljava/lang/String;Lorg/gradle/api/provider/Provider;Lkotlinx/rpc/buf/tasks/BufExecTask$Properties;Lkotlin/jvm/functions/Function1;)Lorg/gradle/api/tasks/TaskProvider;
130+
public static synthetic fun registerBufExecTask$default (Lorg/gradle/api/Project;Lkotlin/reflect/KClass;Ljava/lang/String;Lorg/gradle/api/provider/Provider;Lkotlinx/rpc/buf/tasks/BufExecTask$Properties;Lkotlin/jvm/functions/Function1;ILjava/lang/Object;)Lorg/gradle/api/tasks/TaskProvider;
123131
}
124132

125133
public abstract class kotlinx/rpc/buf/tasks/BufGenerateTask : kotlinx/rpc/buf/tasks/BufExecTask {
126134
public static final field NAME_PREFIX Ljava/lang/String;
127-
public fun <init> ()V
128135
public abstract fun getAdditionalArgs ()Lorg/gradle/api/provider/ListProperty;
129136
public abstract fun getErrorFormat ()Lorg/gradle/api/provider/Property;
130137
public abstract fun getExecutableFiles ()Lorg/gradle/api/provider/ListProperty;
@@ -133,28 +140,38 @@ public abstract class kotlinx/rpc/buf/tasks/BufGenerateTask : kotlinx/rpc/buf/ta
133140
public abstract fun getOutputDirectory ()Lorg/gradle/api/provider/Property;
134141
}
135142

143+
public abstract interface class kotlinx/rpc/buf/tasks/BufTasks : org/gradle/api/tasks/TaskCollection {
144+
public abstract fun executedForKotlinSourceSet (Lorg/gradle/api/NamedDomainObjectProvider;)Lkotlinx/rpc/buf/tasks/BufTasks;
145+
public abstract fun executedForKotlinSourceSet (Lorg/jetbrains/kotlin/gradle/plugin/KotlinSourceSet;)Lkotlinx/rpc/buf/tasks/BufTasks;
146+
public abstract fun executedForSourceSet (Ljava/lang/String;)Lkotlinx/rpc/buf/tasks/BufTasks;
147+
public abstract fun executedForSourceSet (Lorg/gradle/api/NamedDomainObjectProvider;)Lkotlinx/rpc/buf/tasks/BufTasks;
148+
public abstract fun executedForSourceSet (Lorg/gradle/api/tasks/SourceSet;)Lkotlinx/rpc/buf/tasks/BufTasks;
149+
public abstract fun matchingBuildType (Ljava/lang/String;)Lkotlinx/rpc/buf/tasks/BufTasks;
150+
public abstract fun matchingFlavor (Ljava/lang/String;)Lkotlinx/rpc/buf/tasks/BufTasks;
151+
public abstract fun matchingKotlinSourceSet (Lorg/gradle/api/NamedDomainObjectProvider;)Lkotlinx/rpc/buf/tasks/BufTasks;
152+
public abstract fun matchingKotlinSourceSet (Lorg/jetbrains/kotlin/gradle/plugin/KotlinSourceSet;)Lkotlinx/rpc/buf/tasks/BufTasks;
153+
public abstract fun matchingSourceSet (Ljava/lang/String;)Lkotlinx/rpc/buf/tasks/BufTasks;
154+
public abstract fun matchingSourceSet (Lorg/gradle/api/NamedDomainObjectProvider;)Lkotlinx/rpc/buf/tasks/BufTasks;
155+
public abstract fun matchingSourceSet (Lorg/gradle/api/tasks/SourceSet;)Lkotlinx/rpc/buf/tasks/BufTasks;
156+
public abstract fun matchingVariant (Ljava/lang/String;)Lkotlinx/rpc/buf/tasks/BufTasks;
157+
public abstract fun nonTestTasks ()Lkotlinx/rpc/buf/tasks/BufTasks;
158+
public abstract fun testTasks ()Lkotlinx/rpc/buf/tasks/BufTasks;
159+
}
160+
161+
public final class kotlinx/rpc/buf/tasks/BufTasksKt {
162+
public static final fun bufDependsOn (Lkotlinx/rpc/buf/tasks/BufExecTask;Lkotlin/reflect/KClass;)Lkotlinx/rpc/buf/tasks/BufTasks;
163+
}
164+
136165
public abstract class kotlinx/rpc/buf/tasks/GenerateBufGenYaml : org/gradle/api/DefaultTask {
137166
public static final field NAME_PREFIX Ljava/lang/String;
138-
public fun <init> ()V
139167
public abstract fun getBufGenFile ()Lorg/gradle/api/provider/Property;
140168
}
141169

142-
public final class kotlinx/rpc/buf/tasks/GenerateBufGenYamlKt$inlined$sam$i$org_gradle_api_Action$0 : org/gradle/api/Action {
143-
public fun <init> (Lkotlin/jvm/functions/Function1;)V
144-
public final synthetic fun execute (Ljava/lang/Object;)V
145-
}
146-
147170
public abstract class kotlinx/rpc/buf/tasks/GenerateBufYaml : org/gradle/api/DefaultTask {
148171
public static final field NAME_PREFIX Ljava/lang/String;
149-
public fun <init> ()V
150172
public abstract fun getBufFile ()Lorg/gradle/api/provider/Property;
151173
}
152174

153-
public final class kotlinx/rpc/buf/tasks/GenerateBufYamlKt$inlined$sam$i$org_gradle_api_Action$0 : org/gradle/api/Action {
154-
public fun <init> (Lkotlin/jvm/functions/Function1;)V
155-
public final synthetic fun execute (Ljava/lang/Object;)V
156-
}
157-
158175
public final class kotlinx/rpc/protoc/ConstsKt {
159176
public static final field PROTOC_GEN_GRPC_KOTLIN_MULTIPLATFORM_JAR_CONFIGURATION Ljava/lang/String;
160177
public static final field PROTOC_GEN_KOTLIN_MULTIPLATFORM_JAR_CONFIGURATION Ljava/lang/String;
@@ -166,6 +183,7 @@ public final class kotlinx/rpc/protoc/ConstsKt {
166183
public static final field PROTO_GROUP Ljava/lang/String;
167184
public static final field PROTO_SOURCE_DIRECTORY_NAME Ljava/lang/String;
168185
public static final field PROTO_SOURCE_SETS Ljava/lang/String;
186+
public static final field PROTO_SOURCE_SET_EXTENSION_NAME Ljava/lang/String;
169187
}
170188

171189
public final class kotlinx/rpc/protoc/PluginJarsKt {
@@ -174,32 +192,41 @@ public final class kotlinx/rpc/protoc/PluginJarsKt {
174192
}
175193

176194
public abstract class kotlinx/rpc/protoc/ProcessProtoFiles : org/gradle/api/tasks/Copy {
177-
public fun <init> ()V
178195
}
179196

180-
public final class kotlinx/rpc/protoc/ProcessProtoFilesKt$inlined$sam$i$org_gradle_api_Action$0 : org/gradle/api/Action {
181-
public fun <init> (Lkotlin/jvm/functions/Function1;)V
182-
public final synthetic fun execute (Ljava/lang/Object;)V
197+
public abstract interface class kotlinx/rpc/protoc/ProtoSourceSet : org/gradle/api/file/SourceDirectorySet {
198+
public abstract fun plugin (Lkotlinx/rpc/protoc/ProtocPlugin;Lorg/gradle/api/Action;)V
199+
public abstract fun plugin (Lorg/gradle/api/Action;Lkotlin/jvm/functions/Function1;)V
200+
public abstract fun plugin (Lorg/gradle/api/NamedDomainObjectProvider;Lorg/gradle/api/Action;)V
201+
public abstract fun plugin (Lorg/gradle/api/provider/Provider;Lorg/gradle/api/Action;)V
202+
public static synthetic fun plugin$default (Lkotlinx/rpc/protoc/ProtoSourceSet;Lkotlinx/rpc/protoc/ProtocPlugin;Lorg/gradle/api/Action;ILjava/lang/Object;)V
203+
public static synthetic fun plugin$default (Lkotlinx/rpc/protoc/ProtoSourceSet;Lorg/gradle/api/Action;Lkotlin/jvm/functions/Function1;ILjava/lang/Object;)V
204+
public static synthetic fun plugin$default (Lkotlinx/rpc/protoc/ProtoSourceSet;Lorg/gradle/api/NamedDomainObjectProvider;Lorg/gradle/api/Action;ILjava/lang/Object;)V
205+
public static synthetic fun plugin$default (Lkotlinx/rpc/protoc/ProtoSourceSet;Lorg/gradle/api/provider/Provider;Lorg/gradle/api/Action;ILjava/lang/Object;)V
183206
}
184207

185-
public abstract interface class kotlinx/rpc/protoc/ProtoSourceSet {
186-
public abstract fun getName ()Ljava/lang/String;
187-
public abstract fun getPlugins ()Lorg/gradle/api/NamedDomainObjectContainer;
188-
public abstract fun getProto ()Lorg/gradle/api/file/SourceDirectorySet;
189-
public abstract fun plugins (Lorg/gradle/api/Action;)V
190-
public fun proto (Lorg/gradle/api/Action;)V
208+
public final class kotlinx/rpc/protoc/ProtoSourceSetKt {
209+
public static final fun getProto (Lorg/gradle/api/NamedDomainObjectProvider;)Lorg/gradle/api/provider/Provider;
210+
public static final fun getProto (Lorg/gradle/api/tasks/SourceSet;)Lkotlinx/rpc/protoc/ProtoSourceSet;
211+
public static final fun getProto (Lorg/jetbrains/kotlin/gradle/plugin/KotlinSourceSet;)Lkotlinx/rpc/protoc/ProtoSourceSet;
212+
public static final fun proto (Lorg/gradle/api/NamedDomainObjectProvider;Lorg/gradle/api/Action;)V
213+
public static final fun proto (Lorg/gradle/api/tasks/SourceSet;Lorg/gradle/api/Action;)V
214+
public static final fun proto (Lorg/jetbrains/kotlin/gradle/plugin/KotlinSourceSet;Lorg/gradle/api/Action;)V
215+
public static final fun proto_kotlin (Lorg/gradle/api/NamedDomainObjectProvider;)Lorg/gradle/api/provider/Provider;
216+
public static final fun proto_kotlin (Lorg/gradle/api/NamedDomainObjectProvider;Lorg/gradle/api/Action;)V
191217
}
192218

193219
public abstract interface class kotlinx/rpc/protoc/ProtocExtension {
194220
public abstract fun buf (Lorg/gradle/api/Action;)V
195221
public abstract fun getBuf ()Lkotlinx/rpc/buf/BufExtension;
222+
public abstract fun getPlugins ()Lorg/gradle/api/NamedDomainObjectContainer;
223+
public abstract fun plugins (Lorg/gradle/api/Action;)V
196224
}
197225

198226
public class kotlinx/rpc/protoc/ProtocPlugin {
199227
public static final field Companion Lkotlinx/rpc/protoc/ProtocPlugin$Companion;
200228
public static final field GRPC_KOTLIN_MULTIPLATFORM Ljava/lang/String;
201229
public static final field KOTLIN_MULTIPLATFORM Ljava/lang/String;
202-
public fun <init> (Ljava/lang/String;Lorg/gradle/api/Project;)V
203230
public final fun getArtifact ()Lorg/gradle/api/provider/Property;
204231
public final fun getExcludeTypes ()Lorg/gradle/api/provider/ListProperty;
205232
public final fun getIncludeImports ()Lorg/gradle/api/provider/Property;
@@ -217,7 +244,6 @@ public abstract class kotlinx/rpc/protoc/ProtocPlugin$Artifact {
217244
}
218245

219246
public final class kotlinx/rpc/protoc/ProtocPlugin$Artifact$Local : kotlinx/rpc/protoc/ProtocPlugin$Artifact {
220-
public fun <init> (Lorg/gradle/api/Project;)V
221247
public final fun executor (Lorg/gradle/api/provider/Provider;)V
222248
public final fun executor ([Ljava/lang/String;)V
223249
public final fun getExecutableFiles ()Lorg/gradle/api/provider/ListProperty;
@@ -228,7 +254,6 @@ public final class kotlinx/rpc/protoc/ProtocPlugin$Artifact$Local : kotlinx/rpc/
228254
}
229255

230256
public final class kotlinx/rpc/protoc/ProtocPlugin$Artifact$Remote : kotlinx/rpc/protoc/ProtocPlugin$Artifact {
231-
public fun <init> (Lorg/gradle/api/Project;)V
232257
public final fun getLocator ()Lorg/gradle/api/provider/Property;
233258
}
234259

gradle-plugin/build.gradle.kts

Lines changed: 1 addition & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -5,10 +5,6 @@
55
import org.jetbrains.kotlin.gradle.tasks.KotlinCompile
66
import util.other.generateSource
77

8-
/*
9-
* Copyright 2023-2025 JetBrains s.r.o and contributors. Use of this source code is governed by the Apache 2.0 license.
10-
*/
11-
128
plugins {
139
`kotlin-dsl`
1410
alias(libs.plugins.conventions.jvm)
@@ -22,7 +18,7 @@ version = rootProject.libs.versions.kotlinx.rpc.get()
2218
kotlin {
2319
explicitApi()
2420

25-
jvmToolchain(11)
21+
jvmToolchain(17)
2622
}
2723

2824
tasks.withType<KotlinCompile>().configureEach {

gradle-plugin/src/main/kotlin/kotlinx/rpc/Extensions.kt

Lines changed: 44 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@ internal fun Project.rpcExtensionOrNull(): RpcExtension? = extensions.findByType
2424
internal fun Project.rpcExtension(): RpcExtension = rpcExtensionOrNull()
2525
?: error("Rpc extension not found. Please apply the plugin to the project")
2626

27-
public open class RpcExtension @Inject constructor(objects: ObjectFactory, private val project: Project) {
27+
public open class RpcExtension @Inject internal constructor(objects: ObjectFactory, project: Project) {
2828
/**
2929
* Controls `@Rpc` [annotation type-safety](https://github.com/Kotlin/kotlinx-rpc/pull/240) compile-time checkers.
3030
*
@@ -48,29 +48,64 @@ public open class RpcExtension @Inject constructor(objects: ObjectFactory, priva
4848
configure.execute(strict)
4949
}
5050

51-
internal val protocApplied = AtomicBoolean(false)
5251

5352
/**
5453
* Protoc settings.
54+
*
55+
* Can't be called in a lazy context if not initialized.
5556
*/
56-
public val protoc: ProtocExtension by lazy {
57-
if (protocApplied.get()) {
58-
error("Illegal access to protoc extension during DefaultProtocExtension.init")
57+
public val protoc: Provider<ProtocExtension> = project.provider {
58+
if (!protocApplied.get()) {
59+
error("""
60+
Protoc extension was not initialized.
61+
Please, apply the plugin by using the following declaration:
62+
63+
rpc {
64+
protoc()
65+
}
66+
67+
If the error persists, check if you are using this property lazily,
68+
i.e. by calling 'protoc.map { }' and not 'protoc.get()',
69+
otherwise the order of initialization may be wrong.
70+
""".trimIndent())
5971
}
6072

61-
protocApplied.set(true)
62-
objects.newInstance<DefaultProtocExtension>()
73+
protocInternal
6374
}
6475

6576
/**
6677
* Protoc settings.
6778
*/
6879
public fun protoc(configure: Action<ProtocExtension> = Action {}) {
69-
configure.execute(protoc)
80+
configure.execute(protocInternal)
81+
}
82+
83+
internal val protocApplied = AtomicBoolean(false)
84+
85+
internal val protocInternal by lazy {
86+
if (protocApplied.get()) {
87+
error("Illegal access to protoc extension during DefaultProtocExtension.init")
88+
}
89+
90+
protocApplied.set(true)
91+
objects.newInstance<DefaultProtocExtension>().apply {
92+
callbacks.forEach { it.execute(this) }
93+
}
94+
}
95+
96+
private val callbacks = mutableListOf<Action<ProtocExtension>>()
97+
98+
internal fun whenProtocApplied(action: Action<ProtocExtension>) {
99+
if (protocApplied.get()) {
100+
action.execute(protoc.get())
101+
return
102+
}
103+
104+
callbacks.add(action)
70105
}
71106
}
72107

73-
public open class RpcStrictModeExtension @Inject constructor(objects: ObjectFactory) {
108+
public open class RpcStrictModeExtension @Inject internal constructor(objects: ObjectFactory) {
74109
/**
75110
* `StateFlow`s in RPC services are deprecated,
76111
* due to their error-prone nature.

0 commit comments

Comments
 (0)