Skip to content

Kmp Source Sets for gRPC #402

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 15 commits into from
Jul 23, 2025
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 2 additions & 1 deletion compiler-plugin/settings.gradle.kts
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
/*
* Copyright 2023-2024 JetBrains s.r.o and contributors. Use of this source code is governed by the Apache 2.0 license.
* Copyright 2023-2025 JetBrains s.r.o and contributors. Use of this source code is governed by the Apache 2.0 license.
*/

rootProject.name = "compiler-plugin"
Expand All @@ -15,6 +15,7 @@ plugins {
id("conventions-repositories")
id("conventions-version-resolution")
id("conventions-develocity")
id("org.gradle.toolchains.foojay-resolver-convention") version "1.0.0"
}

includeRootAsPublic()
Expand Down
3 changes: 2 additions & 1 deletion dokka-plugin/settings.gradle.kts
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
/*
* Copyright 2023-2024 JetBrains s.r.o and contributors. Use of this source code is governed by the Apache 2.0 license.
* Copyright 2023-2025 JetBrains s.r.o and contributors. Use of this source code is governed by the Apache 2.0 license.
*/

rootProject.name = "dokka-rpc-plugin"
Expand All @@ -15,4 +15,5 @@ plugins {
id("conventions-repositories")
id("conventions-version-resolution")
id("conventions-develocity")
id("org.gradle.toolchains.foojay-resolver-convention") version "1.0.0"
}
2 changes: 1 addition & 1 deletion gradle-conventions/src/main/kotlin/util/csm/template.kt
Original file line number Diff line number Diff line change
Expand Up @@ -145,7 +145,7 @@ object CsmTemplateProcessor {
throw GradleException("Wildcard is not allowed in 'from' part of kotlin version range: $from, $pattern")
}

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

Expand Down
241 changes: 241 additions & 0 deletions gradle-plugin/api/gradle-plugin.api
Original file line number Diff line number Diff line change
@@ -0,0 +1,241 @@
public abstract interface annotation class kotlinx/rpc/RpcDangerousApi : java/lang/annotation/Annotation {
}

public class kotlinx/rpc/RpcExtension {
public fun <init> (Lorg/gradle/api/model/ObjectFactory;Lorg/gradle/api/Project;)V
public final fun getAnnotationTypeSafetyEnabled ()Lorg/gradle/api/provider/Provider;
public final fun getGrpc ()Lkotlinx/rpc/grpc/GrpcExtension;
public final fun getStrict ()Lkotlinx/rpc/RpcStrictModeExtension;
public final fun grpc (Lorg/gradle/api/Action;)V
public static synthetic fun grpc$default (Lkotlinx/rpc/RpcExtension;Lorg/gradle/api/Action;ILjava/lang/Object;)V
public final fun strict (Lorg/gradle/api/Action;)V
}

public final class kotlinx/rpc/RpcGradlePlugin : org/gradle/api/Plugin {
public fun <init> ()V
public synthetic fun apply (Ljava/lang/Object;)V
public fun apply (Lorg/gradle/api/Project;)V
}

public final class kotlinx/rpc/RpcStrictMode : java/lang/Enum {
public static final field ERROR Lkotlinx/rpc/RpcStrictMode;
public static final field NONE Lkotlinx/rpc/RpcStrictMode;
public static final field WARNING Lkotlinx/rpc/RpcStrictMode;
public static fun valueOf (Ljava/lang/String;)Lkotlinx/rpc/RpcStrictMode;
public static fun values ()[Lkotlinx/rpc/RpcStrictMode;
}

public class kotlinx/rpc/RpcStrictModeExtension {
public fun <init> (Lorg/gradle/api/model/ObjectFactory;)V
public final fun getFields ()Lorg/gradle/api/provider/Property;
public final fun getNestedFlow ()Lorg/gradle/api/provider/Property;
public final fun getNotTopLevelServerFlow ()Lorg/gradle/api/provider/Property;
public final fun getSharedFlow ()Lorg/gradle/api/provider/Property;
public final fun getStateFlow ()Lorg/gradle/api/provider/Property;
public final fun getStreamScopedFunctions ()Lorg/gradle/api/provider/Property;
public final fun getSuspendingServerStreaming ()Lorg/gradle/api/provider/Property;
}

public final class kotlinx/rpc/VersionsKt {
public static final field BUF_TOOL_VERSION Ljava/lang/String;
public static final field GRPC_KOTLIN_VERSION Ljava/lang/String;
public static final field GRPC_VERSION Ljava/lang/String;
public static final field LIBRARY_VERSION Ljava/lang/String;
public static final field PLUGIN_VERSION Ljava/lang/String;
public static final field PROTOBUF_VERSION Ljava/lang/String;
}

public class kotlinx/rpc/buf/BufExtension {
public fun <init> (Lorg/gradle/api/model/ObjectFactory;)V
public final fun generate (Lorg/gradle/api/Action;)V
public final fun getConfigFile ()Lorg/gradle/api/provider/Property;
public final fun getGenerate ()Lkotlinx/rpc/buf/BufGenerateExtension;
public final fun getLogFormat ()Lorg/gradle/api/provider/Property;
public final fun getTasks ()Lkotlinx/rpc/buf/BufTasksExtension;
public final fun getTimeout ()Lorg/gradle/api/provider/Property;
public final fun tasks (Lorg/gradle/api/Action;)V
}

public final class kotlinx/rpc/buf/BufExtension$LogFormat : java/lang/Enum {
public static final field Color Lkotlinx/rpc/buf/BufExtension$LogFormat;
public static final field Default Lkotlinx/rpc/buf/BufExtension$LogFormat;
public static final field Json Lkotlinx/rpc/buf/BufExtension$LogFormat;
public static final field Text Lkotlinx/rpc/buf/BufExtension$LogFormat;
public static fun valueOf (Ljava/lang/String;)Lkotlinx/rpc/buf/BufExtension$LogFormat;
public static fun values ()[Lkotlinx/rpc/buf/BufExtension$LogFormat;
}

public class kotlinx/rpc/buf/BufGenerateExtension {
public fun <init> (Lorg/gradle/api/Project;)V
public final fun getErrorFormat ()Lorg/gradle/api/provider/Property;
public final fun getIncludeImports ()Lorg/gradle/api/provider/Property;
public final fun getIncludeWkt ()Lorg/gradle/api/provider/Property;
}

public final class kotlinx/rpc/buf/BufGenerateExtension$ErrorFormat : java/lang/Enum {
public static final field Default Lkotlinx/rpc/buf/BufGenerateExtension$ErrorFormat;
public static final field GithubActions Lkotlinx/rpc/buf/BufGenerateExtension$ErrorFormat;
public static final field Json Lkotlinx/rpc/buf/BufGenerateExtension$ErrorFormat;
public static final field Junit Lkotlinx/rpc/buf/BufGenerateExtension$ErrorFormat;
public static final field Msvs Lkotlinx/rpc/buf/BufGenerateExtension$ErrorFormat;
public static final field Text Lkotlinx/rpc/buf/BufGenerateExtension$ErrorFormat;
public static fun valueOf (Ljava/lang/String;)Lkotlinx/rpc/buf/BufGenerateExtension$ErrorFormat;
public static fun values ()[Lkotlinx/rpc/buf/BufGenerateExtension$ErrorFormat;
}

public class kotlinx/rpc/buf/BufTasksExtension {
public fun <init> (Lorg/gradle/api/Project;)V
public final fun registerWorkspaceTask (Lkotlin/reflect/KClass;Ljava/lang/String;Lorg/gradle/api/Action;)Lorg/gradle/api/provider/Provider;
}

public final class kotlinx/rpc/buf/ConstsKt {
public static final field BUF_EXECUTABLE_CONFIGURATION Ljava/lang/String;
public static final field BUF_GEN_YAML Ljava/lang/String;
public static final field BUF_YAML Ljava/lang/String;
}

public abstract class kotlinx/rpc/buf/tasks/BufExecTask : org/gradle/api/DefaultTask {
public fun <init> ()V
public abstract fun getArgs ()Lorg/gradle/api/provider/ListProperty;
public abstract fun getBufTimeoutInWholeSeconds ()Lorg/gradle/api/provider/Property;
public abstract fun getCommand ()Lorg/gradle/api/provider/Property;
public abstract fun getConfigFile ()Lorg/gradle/api/provider/Property;
public abstract fun getLogFormat ()Lorg/gradle/api/provider/Property;
public abstract fun getWorkingDir ()Lorg/gradle/api/provider/Property;
}

public final class kotlinx/rpc/buf/tasks/BufExecTaskKt {
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;
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;
}

public abstract class kotlinx/rpc/buf/tasks/BufGenerateTask : kotlinx/rpc/buf/tasks/BufExecTask {
public static final field NAME_PREFIX Ljava/lang/String;
public fun <init> ()V
public abstract fun getAdditionalArgs ()Lorg/gradle/api/provider/ListProperty;
public abstract fun getErrorFormat ()Lorg/gradle/api/provider/Property;
public abstract fun getIncludeImports ()Lorg/gradle/api/provider/Property;
public abstract fun getIncludeWkt ()Lorg/gradle/api/provider/Property;
public abstract fun getOutputDirectory ()Lorg/gradle/api/provider/Property;
}

public abstract class kotlinx/rpc/buf/tasks/GenerateBufGenYaml : org/gradle/api/DefaultTask {
public static final field NAME_PREFIX Ljava/lang/String;
public fun <init> ()V
public abstract fun getBufGenFile ()Lorg/gradle/api/provider/Property;
}

public final class kotlinx/rpc/buf/tasks/GenerateBufGenYamlKt$inlined$sam$i$org_gradle_api_Action$0 : org/gradle/api/Action {
public fun <init> (Lkotlin/jvm/functions/Function1;)V
public final synthetic fun execute (Ljava/lang/Object;)V
}

public abstract class kotlinx/rpc/buf/tasks/GenerateBufYaml : org/gradle/api/DefaultTask {
public static final field NAME_PREFIX Ljava/lang/String;
public fun <init> ()V
public abstract fun getBufFile ()Lorg/gradle/api/provider/Property;
}

public final class kotlinx/rpc/buf/tasks/GenerateBufYamlKt$inlined$sam$i$org_gradle_api_Action$0 : org/gradle/api/Action {
public fun <init> (Lkotlin/jvm/functions/Function1;)V
public final synthetic fun execute (Ljava/lang/Object;)V
}

public abstract interface class kotlinx/rpc/grpc/GrpcExtension {
public abstract fun buf (Lorg/gradle/api/Action;)V
public abstract fun getBuf ()Lkotlinx/rpc/buf/BufExtension;
public abstract fun getProtocPlugins ()Lorg/gradle/api/NamedDomainObjectContainer;
public abstract fun protocPlugins (Lorg/gradle/api/Action;)V
}

public final class kotlinx/rpc/proto/ConstsKt {
public static final field KXRPC_PLUGIN_JAR_CONFIGURATION Ljava/lang/String;
public static final field PROTO_BUILD_DIR Ljava/lang/String;
public static final field PROTO_BUILD_GENERATED Ljava/lang/String;
public static final field PROTO_BUILD_SOURCE_SETS Ljava/lang/String;
public static final field PROTO_FILES_DIR Ljava/lang/String;
public static final field PROTO_FILES_IMPORT_DIR Ljava/lang/String;
public static final field PROTO_GROUP Ljava/lang/String;
public static final field PROTO_SOURCE_DIRECTORY_NAME Ljava/lang/String;
public static final field PROTO_SOURCE_SETS Ljava/lang/String;
}

public final class kotlinx/rpc/proto/KxrpcPluginJarKt {
public static final fun getKxrpcProtocPluginJarPath (Lorg/gradle/api/Project;)Lorg/gradle/api/provider/Provider;
}

public abstract class kotlinx/rpc/proto/ProcessProtoFiles : org/gradle/api/tasks/Copy {
public fun <init> ()V
}

public final class kotlinx/rpc/proto/ProcessProtoFilesKt$inlined$sam$i$org_gradle_api_Action$0 : org/gradle/api/Action {
public fun <init> (Lkotlin/jvm/functions/Function1;)V
public final synthetic fun execute (Ljava/lang/Object;)V
}

public abstract interface class kotlinx/rpc/proto/ProtoSourceSet {
public abstract fun getName ()Ljava/lang/String;
public abstract fun getProto ()Lorg/gradle/api/file/SourceDirectorySet;
public fun proto (Lorg/gradle/api/Action;)V
public abstract fun protocPlugin (Lkotlinx/rpc/proto/ProtocPlugin;)V
public abstract fun protocPlugin (Lorg/gradle/api/NamedDomainObjectProvider;)V
}

public class kotlinx/rpc/proto/ProtocPlugin {
public static final field Companion Lkotlinx/rpc/proto/ProtocPlugin$Companion;
public static final field GRPC_JAVA Ljava/lang/String;
public static final field GRPC_KOTLIN Ljava/lang/String;
public static final field KXRPC Ljava/lang/String;
public static final field PROTOBUF_JAVA Ljava/lang/String;
public fun <init> (Ljava/lang/String;Lorg/gradle/api/Project;)V
public final fun getArtifact ()Lorg/gradle/api/provider/Property;
public final fun getExcludeTypes ()Lorg/gradle/api/provider/ListProperty;
public final fun getIncludeImports ()Lorg/gradle/api/provider/Property;
public final fun getIncludeWkt ()Lorg/gradle/api/provider/Property;
public final fun getName ()Ljava/lang/String;
public final fun getOptions ()Lorg/gradle/api/provider/MapProperty;
public final fun getStrategy ()Lorg/gradle/api/provider/Property;
public final fun getTypes ()Lorg/gradle/api/provider/ListProperty;
public final fun isJava ()Lorg/gradle/api/provider/Property;
public final fun local (Lorg/gradle/api/Action;)V
public final fun remote (Lorg/gradle/api/Action;)V
}

public abstract class kotlinx/rpc/proto/ProtocPlugin$Artifact {
}

public final class kotlinx/rpc/proto/ProtocPlugin$Artifact$Local : kotlinx/rpc/proto/ProtocPlugin$Artifact {
public fun <init> (Lorg/gradle/api/Project;)V
public final fun executor (Lorg/gradle/api/provider/Provider;)V
public final fun getExecutor ()Lorg/gradle/api/provider/ListProperty;
public final fun javaJar (Ljava/lang/String;)V
public final fun javaJar (Lorg/gradle/api/provider/Provider;Lorg/gradle/api/provider/Provider;)V
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
}

public final class kotlinx/rpc/proto/ProtocPlugin$Artifact$Remote : kotlinx/rpc/proto/ProtocPlugin$Artifact {
public fun <init> (Lorg/gradle/api/Project;)V
public final fun getLocator ()Lorg/gradle/api/provider/Property;
}

public final class kotlinx/rpc/proto/ProtocPlugin$Companion {
}

public final class kotlinx/rpc/proto/ProtocPlugin$Strategy : java/lang/Enum {
public static final field All Lkotlinx/rpc/proto/ProtocPlugin$Strategy;
public static final field Directory Lkotlinx/rpc/proto/ProtocPlugin$Strategy;
public static fun valueOf (Ljava/lang/String;)Lkotlinx/rpc/proto/ProtocPlugin$Strategy;
public static fun values ()[Lkotlinx/rpc/proto/ProtocPlugin$Strategy;
}

public final class kotlinx/rpc/proto/ProtocPluginKt {
public static final fun getGrpcJava (Lorg/gradle/api/NamedDomainObjectContainer;)Lorg/gradle/api/NamedDomainObjectProvider;
public static final fun getGrpcKotlin (Lorg/gradle/api/NamedDomainObjectContainer;)Lorg/gradle/api/NamedDomainObjectProvider;
public static final fun getKxrpc (Lorg/gradle/api/NamedDomainObjectContainer;)Lorg/gradle/api/NamedDomainObjectProvider;
public static final fun getProtobufJava (Lorg/gradle/api/NamedDomainObjectContainer;)Lorg/gradle/api/NamedDomainObjectProvider;
public static final fun grpcJava (Lorg/gradle/api/NamedDomainObjectContainer;Lorg/gradle/api/Action;)V
public static final fun grpcKotlin (Lorg/gradle/api/NamedDomainObjectContainer;Lorg/gradle/api/Action;)V
public static final fun kxrpc (Lorg/gradle/api/NamedDomainObjectContainer;Lorg/gradle/api/Action;)V
public static final fun protobufJava (Lorg/gradle/api/NamedDomainObjectContainer;Lorg/gradle/api/Action;)V
}

56 changes: 42 additions & 14 deletions gradle-plugin/build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -16,10 +16,11 @@ version = rootProject.libs.versions.kotlinx.rpc.get()

kotlin {
explicitApi()

jvmToolchain(11)
}

dependencies {
implementation(libs.protobuf.gradle.plugin)
compileOnly(libs.kotlin.gradle.plugin)
}

Expand Down Expand Up @@ -50,6 +51,7 @@ abstract class GeneratePluginVersionTask @Inject constructor(
@get:Input val protobufVersion: String,
@get:Input val grpcVersion: String,
@get:Input val grpcKotlinVersion: String,
@get:Input val bufToolVersion: String,
@get:OutputDirectory val sourcesDir: File
) : DefaultTask() {
@TaskAction
Expand All @@ -58,30 +60,56 @@ abstract class GeneratePluginVersionTask @Inject constructor(

sourceFile.writeText(
"""
package kotlinx.rpc
// This file is generated by a $NAME gradle task. Do not modify manually.

package kotlinx.rpc

public const val LIBRARY_VERSION: String = "$libraryVersion"
/**
* The version of the kotlinx.rpc library.
*/
public const val LIBRARY_VERSION: String = "$libraryVersion"

@Deprecated("Use kotlinx.rpc.LIBRARY_VERSION instead", ReplaceWith("kotlinx.rpc.LIBRARY_VERSION"))
public const val PLUGIN_VERSION: String = LIBRARY_VERSION
@Deprecated("Use kotlinx.rpc.LIBRARY_VERSION instead", ReplaceWith("kotlinx.rpc.LIBRARY_VERSION"))
public const val PLUGIN_VERSION: String = LIBRARY_VERSION

public const val PROTOBUF_VERSION: String = "$protobufVersion"
public const val GRPC_VERSION: String = "$grpcVersion"
public const val GRPC_KOTLIN_VERSION: String = "$grpcKotlinVersion"

""".trimIndent()
/**
* The version of the protobuf library.
*/
public const val PROTOBUF_VERSION: String = "$protobufVersion"

/**
* The version of the grpc java library.
*/
public const val GRPC_VERSION: String = "$grpcVersion"

/**
* The version of the grpc kotlin library.
*/
public const val GRPC_KOTLIN_VERSION: String = "$grpcKotlinVersion"

/**
* The version of the buf tool used to generate protobuf.
*/
public const val BUF_TOOL_VERSION: String = "$bufToolVersion"

""".trimIndent()
)
}

companion object {
const val NAME = "generatePluginVersion"
}
}

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

val generatePluginVersionTask = tasks.register<GeneratePluginVersionTask>(
"generatePluginVersion",
GeneratePluginVersionTask.NAME,
version.toString(),
libs.versions.protobuf.asProvider().get().toString(),
libs.versions.grpc.asProvider().get().toString(),
libs.versions.grpc.kotlin.get().toString(),
libs.versions.protobuf.asProvider().get(),
libs.versions.grpc.asProvider().get(),
libs.versions.grpc.kotlin.get(),
libs.versions.buf.tool.get(),
sourcesDir,
)

Expand Down
3 changes: 2 additions & 1 deletion gradle-plugin/settings.gradle.kts
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
/*
* Copyright 2023-2024 JetBrains s.r.o and contributors. Use of this source code is governed by the Apache 2.0 license.
* Copyright 2023-2025 JetBrains s.r.o and contributors. Use of this source code is governed by the Apache 2.0 license.
*/

rootProject.name = "gradle-plugin"
Expand All @@ -14,6 +14,7 @@ pluginManagement {
plugins {
id("conventions-repositories")
id("conventions-version-resolution")
id("org.gradle.toolchains.foojay-resolver-convention") version "1.0.0"
}

includeRootAsPublic()
Loading