Skip to content

Commit 3a09a64

Browse files
committed
Kmp Source Sets for gRPC (#402)
1 parent 516d260 commit 3a09a64

Some content is hidden

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

48 files changed

+2529
-365
lines changed

gradle-conventions/src/main/kotlin/util/csm/template.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -145,7 +145,7 @@ object CsmTemplateProcessor {
145145
throw GradleException("Wildcard is not allowed in 'from' part of kotlin version range: $from, $pattern")
146146
}
147147

148-
if (to.contains("-") || to.contains("-")) {
148+
if (from.contains("-") || to.contains("-")) {
149149
throw GradleException("Non stable versions are not allowed in kotlin version range: $pattern")
150150
}
151151

gradle-plugin/api/gradle-plugin.api

Lines changed: 241 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,241 @@
1+
public abstract interface annotation class kotlinx/rpc/RpcDangerousApi : java/lang/annotation/Annotation {
2+
}
3+
4+
public class kotlinx/rpc/RpcExtension {
5+
public fun <init> (Lorg/gradle/api/model/ObjectFactory;Lorg/gradle/api/Project;)V
6+
public final fun getAnnotationTypeSafetyEnabled ()Lorg/gradle/api/provider/Provider;
7+
public final fun getGrpc ()Lkotlinx/rpc/grpc/GrpcExtension;
8+
public final fun getStrict ()Lkotlinx/rpc/RpcStrictModeExtension;
9+
public final fun grpc (Lorg/gradle/api/Action;)V
10+
public static synthetic fun grpc$default (Lkotlinx/rpc/RpcExtension;Lorg/gradle/api/Action;ILjava/lang/Object;)V
11+
public final fun strict (Lorg/gradle/api/Action;)V
12+
}
13+
14+
public final class kotlinx/rpc/RpcGradlePlugin : org/gradle/api/Plugin {
15+
public fun <init> ()V
16+
public synthetic fun apply (Ljava/lang/Object;)V
17+
public fun apply (Lorg/gradle/api/Project;)V
18+
}
19+
20+
public final class kotlinx/rpc/RpcStrictMode : java/lang/Enum {
21+
public static final field ERROR Lkotlinx/rpc/RpcStrictMode;
22+
public static final field NONE Lkotlinx/rpc/RpcStrictMode;
23+
public static final field WARNING Lkotlinx/rpc/RpcStrictMode;
24+
public static fun valueOf (Ljava/lang/String;)Lkotlinx/rpc/RpcStrictMode;
25+
public static fun values ()[Lkotlinx/rpc/RpcStrictMode;
26+
}
27+
28+
public class kotlinx/rpc/RpcStrictModeExtension {
29+
public fun <init> (Lorg/gradle/api/model/ObjectFactory;)V
30+
public final fun getFields ()Lorg/gradle/api/provider/Property;
31+
public final fun getNestedFlow ()Lorg/gradle/api/provider/Property;
32+
public final fun getNotTopLevelServerFlow ()Lorg/gradle/api/provider/Property;
33+
public final fun getSharedFlow ()Lorg/gradle/api/provider/Property;
34+
public final fun getStateFlow ()Lorg/gradle/api/provider/Property;
35+
public final fun getStreamScopedFunctions ()Lorg/gradle/api/provider/Property;
36+
public final fun getSuspendingServerStreaming ()Lorg/gradle/api/provider/Property;
37+
}
38+
39+
public final class kotlinx/rpc/VersionsKt {
40+
public static final field BUF_TOOL_VERSION Ljava/lang/String;
41+
public static final field GRPC_KOTLIN_VERSION Ljava/lang/String;
42+
public static final field GRPC_VERSION Ljava/lang/String;
43+
public static final field LIBRARY_VERSION Ljava/lang/String;
44+
public static final field PLUGIN_VERSION Ljava/lang/String;
45+
public static final field PROTOBUF_VERSION Ljava/lang/String;
46+
}
47+
48+
public class kotlinx/rpc/buf/BufExtension {
49+
public fun <init> (Lorg/gradle/api/model/ObjectFactory;)V
50+
public final fun generate (Lorg/gradle/api/Action;)V
51+
public final fun getConfigFile ()Lorg/gradle/api/provider/Property;
52+
public final fun getGenerate ()Lkotlinx/rpc/buf/BufGenerateExtension;
53+
public final fun getLogFormat ()Lorg/gradle/api/provider/Property;
54+
public final fun getTasks ()Lkotlinx/rpc/buf/BufTasksExtension;
55+
public final fun getTimeout ()Lorg/gradle/api/provider/Property;
56+
public final fun tasks (Lorg/gradle/api/Action;)V
57+
}
58+
59+
public final class kotlinx/rpc/buf/BufExtension$LogFormat : java/lang/Enum {
60+
public static final field Color Lkotlinx/rpc/buf/BufExtension$LogFormat;
61+
public static final field Default Lkotlinx/rpc/buf/BufExtension$LogFormat;
62+
public static final field Json Lkotlinx/rpc/buf/BufExtension$LogFormat;
63+
public static final field Text Lkotlinx/rpc/buf/BufExtension$LogFormat;
64+
public static fun valueOf (Ljava/lang/String;)Lkotlinx/rpc/buf/BufExtension$LogFormat;
65+
public static fun values ()[Lkotlinx/rpc/buf/BufExtension$LogFormat;
66+
}
67+
68+
public class kotlinx/rpc/buf/BufGenerateExtension {
69+
public fun <init> (Lorg/gradle/api/Project;)V
70+
public final fun getErrorFormat ()Lorg/gradle/api/provider/Property;
71+
public final fun getIncludeImports ()Lorg/gradle/api/provider/Property;
72+
public final fun getIncludeWkt ()Lorg/gradle/api/provider/Property;
73+
}
74+
75+
public final class kotlinx/rpc/buf/BufGenerateExtension$ErrorFormat : java/lang/Enum {
76+
public static final field Default Lkotlinx/rpc/buf/BufGenerateExtension$ErrorFormat;
77+
public static final field GithubActions Lkotlinx/rpc/buf/BufGenerateExtension$ErrorFormat;
78+
public static final field Json Lkotlinx/rpc/buf/BufGenerateExtension$ErrorFormat;
79+
public static final field Junit Lkotlinx/rpc/buf/BufGenerateExtension$ErrorFormat;
80+
public static final field Msvs Lkotlinx/rpc/buf/BufGenerateExtension$ErrorFormat;
81+
public static final field Text Lkotlinx/rpc/buf/BufGenerateExtension$ErrorFormat;
82+
public static fun valueOf (Ljava/lang/String;)Lkotlinx/rpc/buf/BufGenerateExtension$ErrorFormat;
83+
public static fun values ()[Lkotlinx/rpc/buf/BufGenerateExtension$ErrorFormat;
84+
}
85+
86+
public class kotlinx/rpc/buf/BufTasksExtension {
87+
public fun <init> (Lorg/gradle/api/Project;)V
88+
public final fun registerWorkspaceTask (Lkotlin/reflect/KClass;Ljava/lang/String;Lorg/gradle/api/Action;)Lorg/gradle/api/provider/Provider;
89+
}
90+
91+
public final class kotlinx/rpc/buf/ConstsKt {
92+
public static final field BUF_EXECUTABLE_CONFIGURATION Ljava/lang/String;
93+
public static final field BUF_GEN_YAML Ljava/lang/String;
94+
public static final field BUF_YAML Ljava/lang/String;
95+
}
96+
97+
public abstract class kotlinx/rpc/buf/tasks/BufExecTask : org/gradle/api/DefaultTask {
98+
public fun <init> ()V
99+
public abstract fun getArgs ()Lorg/gradle/api/provider/ListProperty;
100+
public abstract fun getBufTimeoutInWholeSeconds ()Lorg/gradle/api/provider/Property;
101+
public abstract fun getCommand ()Lorg/gradle/api/provider/Property;
102+
public abstract fun getConfigFile ()Lorg/gradle/api/provider/Property;
103+
public abstract fun getLogFormat ()Lorg/gradle/api/provider/Property;
104+
public abstract fun getWorkingDir ()Lorg/gradle/api/provider/Property;
105+
}
106+
107+
public final class kotlinx/rpc/buf/tasks/BufExecTaskKt {
108+
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;
109+
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;
110+
}
111+
112+
public abstract class kotlinx/rpc/buf/tasks/BufGenerateTask : kotlinx/rpc/buf/tasks/BufExecTask {
113+
public static final field NAME_PREFIX Ljava/lang/String;
114+
public fun <init> ()V
115+
public abstract fun getAdditionalArgs ()Lorg/gradle/api/provider/ListProperty;
116+
public abstract fun getErrorFormat ()Lorg/gradle/api/provider/Property;
117+
public abstract fun getIncludeImports ()Lorg/gradle/api/provider/Property;
118+
public abstract fun getIncludeWkt ()Lorg/gradle/api/provider/Property;
119+
public abstract fun getOutputDirectory ()Lorg/gradle/api/provider/Property;
120+
}
121+
122+
public abstract class kotlinx/rpc/buf/tasks/GenerateBufGenYaml : org/gradle/api/DefaultTask {
123+
public static final field NAME_PREFIX Ljava/lang/String;
124+
public fun <init> ()V
125+
public abstract fun getBufGenFile ()Lorg/gradle/api/provider/Property;
126+
}
127+
128+
public final class kotlinx/rpc/buf/tasks/GenerateBufGenYamlKt$inlined$sam$i$org_gradle_api_Action$0 : org/gradle/api/Action {
129+
public fun <init> (Lkotlin/jvm/functions/Function1;)V
130+
public final synthetic fun execute (Ljava/lang/Object;)V
131+
}
132+
133+
public abstract class kotlinx/rpc/buf/tasks/GenerateBufYaml : org/gradle/api/DefaultTask {
134+
public static final field NAME_PREFIX Ljava/lang/String;
135+
public fun <init> ()V
136+
public abstract fun getBufFile ()Lorg/gradle/api/provider/Property;
137+
}
138+
139+
public final class kotlinx/rpc/buf/tasks/GenerateBufYamlKt$inlined$sam$i$org_gradle_api_Action$0 : org/gradle/api/Action {
140+
public fun <init> (Lkotlin/jvm/functions/Function1;)V
141+
public final synthetic fun execute (Ljava/lang/Object;)V
142+
}
143+
144+
public abstract interface class kotlinx/rpc/grpc/GrpcExtension {
145+
public abstract fun buf (Lorg/gradle/api/Action;)V
146+
public abstract fun getBuf ()Lkotlinx/rpc/buf/BufExtension;
147+
public abstract fun getProtocPlugins ()Lorg/gradle/api/NamedDomainObjectContainer;
148+
public abstract fun protocPlugins (Lorg/gradle/api/Action;)V
149+
}
150+
151+
public final class kotlinx/rpc/proto/ConstsKt {
152+
public static final field KXRPC_PLUGIN_JAR_CONFIGURATION Ljava/lang/String;
153+
public static final field PROTO_BUILD_DIR Ljava/lang/String;
154+
public static final field PROTO_BUILD_GENERATED Ljava/lang/String;
155+
public static final field PROTO_BUILD_SOURCE_SETS Ljava/lang/String;
156+
public static final field PROTO_FILES_DIR Ljava/lang/String;
157+
public static final field PROTO_FILES_IMPORT_DIR Ljava/lang/String;
158+
public static final field PROTO_GROUP Ljava/lang/String;
159+
public static final field PROTO_SOURCE_DIRECTORY_NAME Ljava/lang/String;
160+
public static final field PROTO_SOURCE_SETS Ljava/lang/String;
161+
}
162+
163+
public final class kotlinx/rpc/proto/KxrpcPluginJarKt {
164+
public static final fun getKxrpcProtocPluginJarPath (Lorg/gradle/api/Project;)Lorg/gradle/api/provider/Provider;
165+
}
166+
167+
public abstract class kotlinx/rpc/proto/ProcessProtoFiles : org/gradle/api/tasks/Copy {
168+
public fun <init> ()V
169+
}
170+
171+
public final class kotlinx/rpc/proto/ProcessProtoFilesKt$inlined$sam$i$org_gradle_api_Action$0 : org/gradle/api/Action {
172+
public fun <init> (Lkotlin/jvm/functions/Function1;)V
173+
public final synthetic fun execute (Ljava/lang/Object;)V
174+
}
175+
176+
public abstract interface class kotlinx/rpc/proto/ProtoSourceSet {
177+
public abstract fun getName ()Ljava/lang/String;
178+
public abstract fun getProto ()Lorg/gradle/api/file/SourceDirectorySet;
179+
public fun proto (Lorg/gradle/api/Action;)V
180+
public abstract fun protocPlugin (Lkotlinx/rpc/proto/ProtocPlugin;)V
181+
public abstract fun protocPlugin (Lorg/gradle/api/NamedDomainObjectProvider;)V
182+
}
183+
184+
public class kotlinx/rpc/proto/ProtocPlugin {
185+
public static final field Companion Lkotlinx/rpc/proto/ProtocPlugin$Companion;
186+
public static final field GRPC_JAVA Ljava/lang/String;
187+
public static final field GRPC_KOTLIN Ljava/lang/String;
188+
public static final field KXRPC Ljava/lang/String;
189+
public static final field PROTOBUF_JAVA Ljava/lang/String;
190+
public fun <init> (Ljava/lang/String;Lorg/gradle/api/Project;)V
191+
public final fun getArtifact ()Lorg/gradle/api/provider/Property;
192+
public final fun getExcludeTypes ()Lorg/gradle/api/provider/ListProperty;
193+
public final fun getIncludeImports ()Lorg/gradle/api/provider/Property;
194+
public final fun getIncludeWkt ()Lorg/gradle/api/provider/Property;
195+
public final fun getName ()Ljava/lang/String;
196+
public final fun getOptions ()Lorg/gradle/api/provider/MapProperty;
197+
public final fun getStrategy ()Lorg/gradle/api/provider/Property;
198+
public final fun getTypes ()Lorg/gradle/api/provider/ListProperty;
199+
public final fun isJava ()Lorg/gradle/api/provider/Property;
200+
public final fun local (Lorg/gradle/api/Action;)V
201+
public final fun remote (Lorg/gradle/api/Action;)V
202+
}
203+
204+
public abstract class kotlinx/rpc/proto/ProtocPlugin$Artifact {
205+
}
206+
207+
public final class kotlinx/rpc/proto/ProtocPlugin$Artifact$Local : kotlinx/rpc/proto/ProtocPlugin$Artifact {
208+
public fun <init> (Lorg/gradle/api/Project;)V
209+
public final fun executor (Lorg/gradle/api/provider/Provider;)V
210+
public final fun getExecutor ()Lorg/gradle/api/provider/ListProperty;
211+
public final fun javaJar (Ljava/lang/String;)V
212+
public final fun javaJar (Lorg/gradle/api/provider/Provider;Lorg/gradle/api/provider/Provider;)V
213+
public static synthetic fun javaJar$default (Lkotlinx/rpc/proto/ProtocPlugin$Artifact$Local;Lorg/gradle/api/provider/Provider;Lorg/gradle/api/provider/Provider;ILjava/lang/Object;)V
214+
}
215+
216+
public final class kotlinx/rpc/proto/ProtocPlugin$Artifact$Remote : kotlinx/rpc/proto/ProtocPlugin$Artifact {
217+
public fun <init> (Lorg/gradle/api/Project;)V
218+
public final fun getLocator ()Lorg/gradle/api/provider/Property;
219+
}
220+
221+
public final class kotlinx/rpc/proto/ProtocPlugin$Companion {
222+
}
223+
224+
public final class kotlinx/rpc/proto/ProtocPlugin$Strategy : java/lang/Enum {
225+
public static final field All Lkotlinx/rpc/proto/ProtocPlugin$Strategy;
226+
public static final field Directory Lkotlinx/rpc/proto/ProtocPlugin$Strategy;
227+
public static fun valueOf (Ljava/lang/String;)Lkotlinx/rpc/proto/ProtocPlugin$Strategy;
228+
public static fun values ()[Lkotlinx/rpc/proto/ProtocPlugin$Strategy;
229+
}
230+
231+
public final class kotlinx/rpc/proto/ProtocPluginKt {
232+
public static final fun getGrpcJava (Lorg/gradle/api/NamedDomainObjectContainer;)Lorg/gradle/api/NamedDomainObjectProvider;
233+
public static final fun getGrpcKotlin (Lorg/gradle/api/NamedDomainObjectContainer;)Lorg/gradle/api/NamedDomainObjectProvider;
234+
public static final fun getKxrpc (Lorg/gradle/api/NamedDomainObjectContainer;)Lorg/gradle/api/NamedDomainObjectProvider;
235+
public static final fun getProtobufJava (Lorg/gradle/api/NamedDomainObjectContainer;)Lorg/gradle/api/NamedDomainObjectProvider;
236+
public static final fun grpcJava (Lorg/gradle/api/NamedDomainObjectContainer;Lorg/gradle/api/Action;)V
237+
public static final fun grpcKotlin (Lorg/gradle/api/NamedDomainObjectContainer;Lorg/gradle/api/Action;)V
238+
public static final fun kxrpc (Lorg/gradle/api/NamedDomainObjectContainer;Lorg/gradle/api/Action;)V
239+
public static final fun protobufJava (Lorg/gradle/api/NamedDomainObjectContainer;Lorg/gradle/api/Action;)V
240+
}
241+

gradle-plugin/build.gradle.kts

Lines changed: 42 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,8 @@ version = rootProject.libs.versions.kotlinx.rpc.get()
2121

2222
kotlin {
2323
explicitApi()
24+
25+
jvmToolchain(11)
2426
}
2527

2628
tasks.withType<KotlinCompile>().configureEach {
@@ -31,7 +33,6 @@ tasks.withType<KotlinCompile>().configureEach {
3133
}
3234

3335
dependencies {
34-
implementation(libs.protobuf.gradle.plugin)
3536
compileOnly(libs.kotlin.gradle.plugin)
3637
}
3738

@@ -62,6 +63,7 @@ abstract class GeneratePluginVersionTask @Inject constructor(
6263
@get:Input val protobufVersion: String,
6364
@get:Input val grpcVersion: String,
6465
@get:Input val grpcKotlinVersion: String,
66+
@get:Input val bufToolVersion: String,
6567
@get:OutputDirectory val sourcesDir: File
6668
) : DefaultTask() {
6769
@TaskAction
@@ -70,30 +72,56 @@ abstract class GeneratePluginVersionTask @Inject constructor(
7072

7173
sourceFile.writeText(
7274
"""
73-
package kotlinx.rpc
75+
// This file is generated by a $NAME gradle task. Do not modify manually.
76+
77+
package kotlinx.rpc
7478
75-
public const val LIBRARY_VERSION: String = "$libraryVersion"
79+
/**
80+
* The version of the kotlinx.rpc library.
81+
*/
82+
public const val LIBRARY_VERSION: String = "$libraryVersion"
7683
77-
@Deprecated("Use kotlinx.rpc.LIBRARY_VERSION instead", ReplaceWith("kotlinx.rpc.LIBRARY_VERSION"))
78-
public const val PLUGIN_VERSION: String = LIBRARY_VERSION
84+
@Deprecated("Use kotlinx.rpc.LIBRARY_VERSION instead", ReplaceWith("kotlinx.rpc.LIBRARY_VERSION"))
85+
public const val PLUGIN_VERSION: String = LIBRARY_VERSION
7986
80-
public const val PROTOBUF_VERSION: String = "$protobufVersion"
81-
public const val GRPC_VERSION: String = "$grpcVersion"
82-
public const val GRPC_KOTLIN_VERSION: String = "$grpcKotlinVersion"
83-
84-
""".trimIndent()
87+
/**
88+
* The version of the protobuf library.
89+
*/
90+
public const val PROTOBUF_VERSION: String = "$protobufVersion"
91+
92+
/**
93+
* The version of the grpc java library.
94+
*/
95+
public const val GRPC_VERSION: String = "$grpcVersion"
96+
97+
/**
98+
* The version of the grpc kotlin library.
99+
*/
100+
public const val GRPC_KOTLIN_VERSION: String = "$grpcKotlinVersion"
101+
102+
/**
103+
* The version of the buf tool used to generate protobuf.
104+
*/
105+
public const val BUF_TOOL_VERSION: String = "$bufToolVersion"
106+
107+
""".trimIndent()
85108
)
86109
}
110+
111+
companion object {
112+
const val NAME = "generatePluginVersion"
113+
}
87114
}
88115

89116
val sourcesDir = File(project.layout.buildDirectory.asFile.get(), "generated-sources/pluginVersion")
90117

91118
val generatePluginVersionTask = tasks.register<GeneratePluginVersionTask>(
92-
"generatePluginVersion",
119+
GeneratePluginVersionTask.NAME,
93120
version.toString(),
94-
libs.versions.protobuf.asProvider().get().toString(),
95-
libs.versions.grpc.asProvider().get().toString(),
96-
libs.versions.grpc.kotlin.get().toString(),
121+
libs.versions.protobuf.asProvider().get(),
122+
libs.versions.grpc.asProvider().get(),
123+
libs.versions.grpc.kotlin.get(),
124+
libs.versions.buf.tool.get(),
97125
sourcesDir,
98126
)
99127

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

Lines changed: 12 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,8 @@
66

77
package kotlinx.rpc
88

9+
import kotlinx.rpc.grpc.DefaultGrpcExtension
10+
import kotlinx.rpc.grpc.GrpcExtension
911
import org.gradle.api.Action
1012
import org.gradle.api.Project
1113
import org.gradle.api.model.ObjectFactory
@@ -14,11 +16,12 @@ import org.gradle.kotlin.dsl.findByType
1416
import org.gradle.api.provider.Provider
1517
import org.gradle.kotlin.dsl.newInstance
1618
import org.gradle.kotlin.dsl.property
19+
import java.util.concurrent.atomic.AtomicBoolean
1720
import javax.inject.Inject
1821

19-
public fun Project.rpcExtension(): RpcExtension = extensions.findByType<RpcExtension>() ?: RpcExtension(objects)
22+
internal fun Project.rpcExtension(): RpcExtension = extensions.findByType<RpcExtension>() ?: RpcExtension(objects, this)
2023

21-
public open class RpcExtension @Inject constructor(objects: ObjectFactory) {
24+
public open class RpcExtension @Inject constructor(objects: ObjectFactory, private val project: Project) {
2225
/**
2326
* Controls `@Rpc` [annotation type-safety](https://github.com/Kotlin/kotlinx-rpc/pull/240) compile-time checkers.
2427
*
@@ -42,15 +45,20 @@ public open class RpcExtension @Inject constructor(objects: ObjectFactory) {
4245
configure.execute(strict)
4346
}
4447

48+
internal val grpcApplied = AtomicBoolean(false)
49+
4550
/**
4651
* Grpc settings.
4752
*/
48-
public val grpc: GrpcExtension = objects.newInstance<GrpcExtension>()
53+
public val grpc: GrpcExtension by lazy {
54+
grpcApplied.set(true)
55+
objects.newInstance<DefaultGrpcExtension>()
56+
}
4957

5058
/**
5159
* Grpc settings.
5260
*/
53-
public fun grpc(configure: Action<GrpcExtension>) {
61+
public fun grpc(configure: Action<GrpcExtension> = Action {}) {
5462
configure.execute(grpc)
5563
}
5664
}

0 commit comments

Comments
 (0)