From 858ce178b768ef41facd936bdcdc1f3ef3f8f2d4 Mon Sep 17 00:00:00 2001 From: Alexander Sysoev Date: Thu, 6 Feb 2025 19:22:22 +0100 Subject: [PATCH 1/3] Kotlin 2.1.10 --- versions-root/kotlin-versions-lookup.csv | 1 + versions-root/libs.versions.toml | 6 +++--- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/versions-root/kotlin-versions-lookup.csv b/versions-root/kotlin-versions-lookup.csv index 4695aab06..13d90da2d 100644 --- a/versions-root/kotlin-versions-lookup.csv +++ b/versions-root/kotlin-versions-lookup.csv @@ -1,4 +1,5 @@ Kotlin,atomicfu,serialization,detekt-gradle-plugin,gradle-kotlin-dsl,binary-compatibility-validator,kover +2.1.10,0.27.0,1.8.0,1.23.7,5.1.2,0.17.0,0.9.1 2.1.0,0.27.0,1.8.0,1.23.7,5.1.2,0.17.0,0.9.1 2.0.21,0.26.0,1.7.3,1.23.7,5.1.2,0.16.3,0.8.3 2.0.20,0.26.0,1.7.3,1.23.7,5.1.2,0.16.3,0.8.3 diff --git a/versions-root/libs.versions.toml b/versions-root/libs.versions.toml index 904b18318..2df349e96 100644 --- a/versions-root/libs.versions.toml +++ b/versions-root/libs.versions.toml @@ -1,9 +1,9 @@ [versions] # core library version -kotlinx-rpc = "0.5.0" +kotlinx-rpc = "0.6.0-SNAPSHOT" # kotlin -kotlin-lang = "2.1.0" # or env.KOTLIN_VERSION +kotlin-lang = "2.1.10" # or env.KOTLIN_VERSION kotlin-compiler = "0.0.0" # default to kotlin-lang or env.KOTLIN_COMPILER_VERSION # kotlin independent versions @@ -31,7 +31,7 @@ shadow-jar = "9.0.0-beta4" atomicfu = "0.27.0" serialization = "1.8.0" detekt-gradle-plugin = "1.23.7" -gradle-kotlin-dsl = "5.2.0" +gradle-kotlin-dsl = "5.1.2" binary-compatibility-validator = "0.17.0" kover = "0.9.1" From c0888a3b93300338ad196d9a88353e5ea747f853 Mon Sep 17 00:00:00 2001 From: Alexander Sysoev Date: Thu, 6 Feb 2025 19:22:58 +0100 Subject: [PATCH 2/3] Fix KRPC-137 --- krpc/krpc-client/build.gradle.kts | 5 ---- krpc/krpc-core/build.gradle.kts | 3 --- .../krpc-ktor-client/build.gradle.kts | 4 ---- .../krpc-ktor/krpc-ktor-core/build.gradle.kts | 4 ---- krpc/krpc-server/build.gradle.kts | 5 ---- .../test/runners/BoxTestGenerated.java | 3 --- .../test/runners/DiagnosticTestGenerated.java | 3 +-- .../kotlinx/rpc/codegen/test/GenerateTests.kt | 15 ++++++------ .../test/services/RpcClasspathProviders.kt | 6 ++--- .../testData/diagnostics/rpcChecked.fir.txt | 20 ++++++++++++++++ .../src/testData/diagnostics/rpcChecked.kt | 24 +++++++++---------- 11 files changed, 44 insertions(+), 48 deletions(-) diff --git a/krpc/krpc-client/build.gradle.kts b/krpc/krpc-client/build.gradle.kts index 2f338be67..21673c7f4 100644 --- a/krpc/krpc-client/build.gradle.kts +++ b/krpc/krpc-client/build.gradle.kts @@ -18,11 +18,6 @@ kotlin { dependencies { api(projects.krpc.krpcCore) - // KRPC-137 Remove temporary explicit dependencies in 2.1.10 and unmute compiler tests - implementation(projects.core) - implementation(projects.utils) - implementation(projects.krpc.krpcSerialization.krpcSerializationCore) - implementation(libs.serialization.core) implementation(libs.kotlin.reflect) diff --git a/krpc/krpc-core/build.gradle.kts b/krpc/krpc-core/build.gradle.kts index 84055d510..b869df5dc 100644 --- a/krpc/krpc-core/build.gradle.kts +++ b/krpc/krpc-core/build.gradle.kts @@ -20,9 +20,6 @@ kotlin { api(projects.krpc.krpcSerialization.krpcSerializationCore) implementation(projects.krpc.krpcLogging) - // KRPC-137 Remove temporary explicit dependencies in 2.1.10 and unmute compiler tests - implementation(projects.utils) - api(libs.coroutines.core) implementation(libs.serialization.core) implementation(libs.kotlin.reflect) diff --git a/krpc/krpc-ktor/krpc-ktor-client/build.gradle.kts b/krpc/krpc-ktor/krpc-ktor-client/build.gradle.kts index c7aaef9a7..bc6ccd0a9 100644 --- a/krpc/krpc-ktor/krpc-ktor-client/build.gradle.kts +++ b/krpc/krpc-ktor/krpc-ktor-client/build.gradle.kts @@ -14,10 +14,6 @@ kotlin { api(projects.krpc.krpcClient) api(projects.krpc.krpcKtor.krpcKtorCore) - // KRPC-137 Remove temporary explicit dependencies in 2.1.10 and unmute compiler tests - implementation(projects.krpc.krpcCore) - implementation(projects.core) - api(libs.ktor.client.core) api(libs.ktor.client.websockets) diff --git a/krpc/krpc-ktor/krpc-ktor-core/build.gradle.kts b/krpc/krpc-ktor/krpc-ktor-core/build.gradle.kts index b3c8081c5..89bf807cd 100644 --- a/krpc/krpc-ktor/krpc-ktor-core/build.gradle.kts +++ b/krpc/krpc-ktor/krpc-ktor-core/build.gradle.kts @@ -14,10 +14,6 @@ kotlin { dependencies { api(projects.krpc.krpcCore) - // KRPC-137 Remove temporary explicit dependencies in 2.1.10 and unmute compiler tests - implementation(projects.core) - implementation(projects.utils) - implementation(libs.ktor.websockets) implementation(libs.coroutines.core) implementation(libs.serialization.core) diff --git a/krpc/krpc-server/build.gradle.kts b/krpc/krpc-server/build.gradle.kts index facbe73ce..7d37f1c56 100644 --- a/krpc/krpc-server/build.gradle.kts +++ b/krpc/krpc-server/build.gradle.kts @@ -18,11 +18,6 @@ kotlin { dependencies { api(projects.krpc.krpcCore) - // KRPC-137 Remove temporary explicit dependencies in 2.1.10 and unmute compiler tests - implementation(projects.core) - implementation(projects.utils) - implementation(projects.krpc.krpcSerialization.krpcSerializationCore) - implementation(projects.krpc.krpcLogging) implementation(libs.serialization.core) diff --git a/tests/compiler-plugin-tests/src/test-gen/kotlinx/rpc/codegen/test/runners/BoxTestGenerated.java b/tests/compiler-plugin-tests/src/test-gen/kotlinx/rpc/codegen/test/runners/BoxTestGenerated.java index ea1dbe626..176ee2b49 100644 --- a/tests/compiler-plugin-tests/src/test-gen/kotlinx/rpc/codegen/test/runners/BoxTestGenerated.java +++ b/tests/compiler-plugin-tests/src/test-gen/kotlinx/rpc/codegen/test/runners/BoxTestGenerated.java @@ -10,8 +10,6 @@ import org.jetbrains.kotlin.test.util.KtTestUtil; import org.jetbrains.kotlin.test.TargetBackend; import org.jetbrains.kotlin.test.TestMetadata; -import org.junit.Ignore; -import org.junit.jupiter.api.Disabled; import org.junit.jupiter.api.Test; import java.io.File; @@ -21,7 +19,6 @@ @SuppressWarnings("all") @TestMetadata("src/testData/box") @TestDataPath("$PROJECT_ROOT") -@Disabled("KRPC-137") public class BoxTestGenerated extends AbstractBoxTest { @Test public void testAllFilesPresentInBox() { diff --git a/tests/compiler-plugin-tests/src/test-gen/kotlinx/rpc/codegen/test/runners/DiagnosticTestGenerated.java b/tests/compiler-plugin-tests/src/test-gen/kotlinx/rpc/codegen/test/runners/DiagnosticTestGenerated.java index 94cdb9319..d32e8b6d5 100644 --- a/tests/compiler-plugin-tests/src/test-gen/kotlinx/rpc/codegen/test/runners/DiagnosticTestGenerated.java +++ b/tests/compiler-plugin-tests/src/test-gen/kotlinx/rpc/codegen/test/runners/DiagnosticTestGenerated.java @@ -9,8 +9,8 @@ import com.intellij.testFramework.TestDataPath; import org.jetbrains.kotlin.test.util.KtTestUtil; import org.jetbrains.kotlin.test.TestMetadata; -import org.junit.jupiter.api.Disabled; import org.junit.jupiter.api.Test; + import java.io.File; import java.util.regex.Pattern; @@ -18,7 +18,6 @@ @SuppressWarnings("all") @TestMetadata("src/testData/diagnostics") @TestDataPath("$PROJECT_ROOT") -@Disabled("KRPC-137") public class DiagnosticTestGenerated extends AbstractDiagnosticTest { @Test public void testAllFilesPresentInDiagnostics() { diff --git a/tests/compiler-plugin-tests/src/test/kotlin/kotlinx/rpc/codegen/test/GenerateTests.kt b/tests/compiler-plugin-tests/src/test/kotlin/kotlinx/rpc/codegen/test/GenerateTests.kt index 7aba04105..bdd48caef 100644 --- a/tests/compiler-plugin-tests/src/test/kotlin/kotlinx/rpc/codegen/test/GenerateTests.kt +++ b/tests/compiler-plugin-tests/src/test/kotlin/kotlinx/rpc/codegen/test/GenerateTests.kt @@ -4,19 +4,20 @@ package kotlinx.rpc.codegen.test +import kotlinx.rpc.codegen.test.runners.AbstractBoxTest +import kotlinx.rpc.codegen.test.runners.AbstractDiagnosticTest import org.jetbrains.kotlin.generators.generateTestGroupSuiteWithJUnit5 fun main() { generateTestGroupSuiteWithJUnit5 { testGroup(testDataRoot = "src/testData", testsRoot = "src/test-gen") { - // KRPC-137 Remove temporary explicit dependencies in 2.1.10 and unmute compiler tests -// testClass { -// model("diagnostics") -// } + testClass { + model("diagnostics") + } -// testClass { -// model("box") -// } + testClass { + model("box") + } } } } diff --git a/tests/compiler-plugin-tests/src/test/kotlin/kotlinx/rpc/codegen/test/services/RpcClasspathProviders.kt b/tests/compiler-plugin-tests/src/test/kotlin/kotlinx/rpc/codegen/test/services/RpcClasspathProviders.kt index 9cc14f0bc..6c7f03403 100644 --- a/tests/compiler-plugin-tests/src/test/kotlin/kotlinx/rpc/codegen/test/services/RpcClasspathProviders.kt +++ b/tests/compiler-plugin-tests/src/test/kotlin/kotlinx/rpc/codegen/test/services/RpcClasspathProviders.kt @@ -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. */ package kotlinx.rpc.codegen.test.services @@ -22,12 +22,12 @@ private class RuntimeDependency( val name: String, ) { val filter = FilenameFilter { _, filename -> - filename.startsWith(name) && filename.endsWith(".jar") + filename.startsWith(name) && filename.endsWith(".jar") && !filename.contains("sources") } } private object RpcClasspathProvider { - private val TEST_RUNTIME = RuntimeDependency("build/libs/", "compiler-plugin-test") + private val TEST_RUNTIME = RuntimeDependency("build/libs/", "compiler-plugin-tests") private val KRPC_CORE_JVM = RuntimeDependency("$globalRootDir/krpc/krpc-core/build/libs/", "krpc-core-jvm") private val CORE_JVM = RuntimeDependency("$globalRootDir/core/build/libs/", "core-jvm") private val UTILS_JVM = RuntimeDependency("$globalRootDir/utils/build/libs/", "utils-jvm") diff --git a/tests/compiler-plugin-tests/src/testData/diagnostics/rpcChecked.fir.txt b/tests/compiler-plugin-tests/src/testData/diagnostics/rpcChecked.fir.txt index 4b07b807d..67db05178 100644 --- a/tests/compiler-plugin-tests/src/testData/diagnostics/rpcChecked.fir.txt +++ b/tests/compiler-plugin-tests/src/testData/diagnostics/rpcChecked.fir.txt @@ -85,3 +85,23 @@ FILE: rpcChecked.kt R|kotlinx/rpc/descriptor/serviceDescriptorOf|() R|kotlinx/rpc/descriptor/serviceDescriptorOf|() } + @R|kotlinx/rpc/annotations/Rpc|() public final annotation class Grpc : R|kotlin/Annotation| { + public constructor(): R|Grpc| { + super() + } + + } + @R|Grpc|() public abstract interface MyGrpcService : R|kotlin/Any| { + } + @R|Grpc|() public final class WrongGrpcTarget : R|kotlin/Any| { + public constructor(): R|WrongGrpcTarget| { + super() + } + + } + @R|kotlinx/rpc/annotations/Rpc|() public final class WrongRpcTarget : R|kotlin/Any| { + public constructor(): R|WrongRpcTarget| { + super() + } + + } diff --git a/tests/compiler-plugin-tests/src/testData/diagnostics/rpcChecked.kt b/tests/compiler-plugin-tests/src/testData/diagnostics/rpcChecked.kt index a478a8309..08770caae 100644 --- a/tests/compiler-plugin-tests/src/testData/diagnostics/rpcChecked.kt +++ b/tests/compiler-plugin-tests/src/testData/diagnostics/rpcChecked.kt @@ -29,11 +29,11 @@ inline suspend fun <@Rpc reified T : Any> ok(client: RpcClient, server: RpcServe server.registerService { MyServiceImpl(it) } server.registerService { impl } - myServiceImpl.awaitFieldInitialization() - myServiceImpl.awaitFieldInitialization { 1 } + myServiceImpl.awaitFieldInitialization() + myServiceImpl.awaitFieldInitialization { 1 } - impl.awaitFieldInitialization() - impl.awaitFieldInitialization { 1 } + impl.awaitFieldInitialization() + impl.awaitFieldInitialization { 1 } serviceDescriptorOf() serviceDescriptorOf() @@ -48,14 +48,14 @@ inline suspend fun fail(client: RpcClient, server: RpcServer, server.registerService<NotAService> { NotAService(it) } server.registerService<T> { impl } - myServiceImpl.awaitFieldInitialization<MyServiceImpl>() - myServiceImpl.awaitFieldInitialization<MyServiceImpl, Int> { 1 } + myServiceImpl.awaitFieldInitialization<MyServiceImpl>() + myServiceImpl.awaitFieldInitialization<MyServiceImpl, Int> { 1 } - notAServiceImpl.awaitFieldInitialization<NotAService>() - notAServiceImpl.awaitFieldInitialization<NotAService, Int> { 1 } + notAServiceImpl.awaitFieldInitialization<NotAService>() + notAServiceImpl.awaitFieldInitialization<NotAService, Int> { 1 } - impl.awaitFieldInitialization<T>() - impl.awaitFieldInitialization<T, Int> { 1 } + impl.awaitFieldInitialization<T>() + impl.awaitFieldInitialization<T, Int> { 1 } serviceDescriptorOf<MyServiceImpl>() serviceDescriptorOf<NotAService>() @@ -68,8 +68,8 @@ annotation class Grpc @Grpc interface MyGrpcService -@Grpc +@Grpc class WrongGrpcTarget -@Rpc +@Rpc class WrongRpcTarget From 884f99cce33cd4ecc4d833e66a8f405172180cb1 Mon Sep 17 00:00:00 2001 From: Alexander Sysoev Date: Thu, 6 Feb 2025 19:23:34 +0100 Subject: [PATCH 3/3] Backport compiler fixes from grpc-release --- .../extension/RpcIrServiceProcessor.kt | 5 +-- .../FirRpcSupertypeGeneratorAbstract.kt | 9 +++-- .../core/kotlinx/rpc/codegen/FirRpcUtils.kt | 34 ++++++++++++++----- .../checkers/FirRpcAnnotationChecker.kt | 25 +++++++++++--- .../checkers/diagnostics/FirRpcDiagnostics.kt | 3 +- .../internalServiceDescriptorOf.jvm.kt | 14 +++++--- publishLocal.sh | 6 ++-- 7 files changed, 69 insertions(+), 27 deletions(-) diff --git a/compiler-plugin/compiler-plugin-backend/src/main/core/kotlinx/rpc/codegen/extension/RpcIrServiceProcessor.kt b/compiler-plugin/compiler-plugin-backend/src/main/core/kotlinx/rpc/codegen/extension/RpcIrServiceProcessor.kt index b2d8dd78a..f67762a41 100644 --- a/compiler-plugin/compiler-plugin-backend/src/main/core/kotlinx/rpc/codegen/extension/RpcIrServiceProcessor.kt +++ b/compiler-plugin/compiler-plugin-backend/src/main/core/kotlinx/rpc/codegen/extension/RpcIrServiceProcessor.kt @@ -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. */ package kotlinx.rpc.codegen.extension @@ -9,6 +9,7 @@ import org.jetbrains.kotlin.cli.common.messages.MessageCollector import org.jetbrains.kotlin.ir.IrStatement import org.jetbrains.kotlin.ir.declarations.IrClass import org.jetbrains.kotlin.ir.util.hasAnnotation +import org.jetbrains.kotlin.ir.util.isInterface import org.jetbrains.kotlin.ir.visitors.IrElementTransformer internal class RpcIrServiceProcessor( @@ -16,7 +17,7 @@ internal class RpcIrServiceProcessor( private val logger: MessageCollector, ) : IrElementTransformer { override fun visitClass(declaration: IrClass, data: RpcIrContext): IrStatement { - if (declaration.hasAnnotation(RpcClassId.rpcAnnotation)) { + if (declaration.hasAnnotation(RpcClassId.rpcAnnotation) && declaration.isInterface) { processService(declaration, data) } diff --git a/compiler-plugin/compiler-plugin-k2/src/main/core/kotlinx/rpc/codegen/FirRpcSupertypeGeneratorAbstract.kt b/compiler-plugin/compiler-plugin-k2/src/main/core/kotlinx/rpc/codegen/FirRpcSupertypeGeneratorAbstract.kt index b6f17d375..268ce13a4 100644 --- a/compiler-plugin/compiler-plugin-k2/src/main/core/kotlinx/rpc/codegen/FirRpcSupertypeGeneratorAbstract.kt +++ b/compiler-plugin/compiler-plugin-k2/src/main/core/kotlinx/rpc/codegen/FirRpcSupertypeGeneratorAbstract.kt @@ -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. */ package kotlinx.rpc.codegen @@ -7,7 +7,9 @@ package kotlinx.rpc.codegen import kotlinx.rpc.codegen.common.RpcClassId import org.jetbrains.kotlin.cli.common.messages.MessageCollector import org.jetbrains.kotlin.fir.FirSession +import org.jetbrains.kotlin.fir.declarations.FirClass import org.jetbrains.kotlin.fir.declarations.FirClassLikeDeclaration +import org.jetbrains.kotlin.fir.declarations.utils.isInterface import org.jetbrains.kotlin.fir.extensions.FirDeclarationPredicateRegistrar import org.jetbrains.kotlin.fir.extensions.FirSupertypeGenerationExtension import org.jetbrains.kotlin.fir.extensions.predicateBasedProvider @@ -23,7 +25,10 @@ abstract class FirRpcSupertypeGeneratorAbstract( } override fun needTransformSupertypes(declaration: FirClassLikeDeclaration): Boolean { - return session.predicateBasedProvider.matches(FirRpcPredicates.rpc, declaration) + return session.predicateBasedProvider.matches( + predicate = FirRpcPredicates.rpc, + declaration = declaration, + ) && declaration is FirClass && declaration.isInterface } protected fun computeAdditionalSupertypesAbstract( diff --git a/compiler-plugin/compiler-plugin-k2/src/main/core/kotlinx/rpc/codegen/FirRpcUtils.kt b/compiler-plugin/compiler-plugin-k2/src/main/core/kotlinx/rpc/codegen/FirRpcUtils.kt index 85afba399..20869b4cc 100644 --- a/compiler-plugin/compiler-plugin-k2/src/main/core/kotlinx/rpc/codegen/FirRpcUtils.kt +++ b/compiler-plugin/compiler-plugin-k2/src/main/core/kotlinx/rpc/codegen/FirRpcUtils.kt @@ -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. */ package kotlinx.rpc.codegen @@ -7,8 +7,11 @@ package kotlinx.rpc.codegen import kotlinx.rpc.codegen.common.RpcClassId import org.jetbrains.kotlin.KtSourceElement import org.jetbrains.kotlin.fir.FirSession -import org.jetbrains.kotlin.fir.declarations.getAnnotationByClassId +import org.jetbrains.kotlin.fir.declarations.toAnnotationClassId import org.jetbrains.kotlin.fir.expressions.FirAnnotation +import org.jetbrains.kotlin.fir.expressions.UnresolvedExpressionTypeAccess +import org.jetbrains.kotlin.fir.extensions.predicate.DeclarationPredicate +import org.jetbrains.kotlin.fir.extensions.predicateBasedProvider import org.jetbrains.kotlin.fir.resolve.fullyExpandedType import org.jetbrains.kotlin.fir.symbols.FirBasedSymbol import org.jetbrains.kotlin.fir.symbols.SymbolInternals @@ -23,16 +26,31 @@ fun FirClassSymbol<*>.isRemoteService(session: FirSession): Boolean = resolvedSu it.doesMatchesClassId(session, RpcClassId.remoteServiceInterface) } -fun FirBasedSymbol<*>.rpcAnnotationSource(session: FirSession): KtSourceElement? { - return rpcAnnotation(session)?.source +fun FirBasedSymbol<*>.rpcAnnotationSource( + session: FirSession, + predicate: DeclarationPredicate, + classId: ClassId?, +): KtSourceElement? { + return rpcAnnotation(session, predicate, classId)?.source } -fun FirBasedSymbol<*>.rpcAnnotation(session: FirSession): FirAnnotation? { - return resolvedCompilerAnnotationsWithClassIds.rpcAnnotation(session) +fun FirBasedSymbol<*>.rpcAnnotation( + session: FirSession, + predicate: DeclarationPredicate, + classId: ClassId?, +): FirAnnotation? { + return resolvedCompilerAnnotationsWithClassIds.rpcAnnotation(session, predicate, classId) } -fun List.rpcAnnotation(session: FirSession): FirAnnotation? { - return getAnnotationByClassId(RpcClassId.rpcAnnotation, session) +@OptIn(UnresolvedExpressionTypeAccess::class) +fun List.rpcAnnotation(session: FirSession, predicate: DeclarationPredicate, classId: ClassId?): FirAnnotation? { + return find { + vsApi { + it.coneTypeOrNull?.toClassSymbolVS(session)?.let { declaration -> + session.predicateBasedProvider.matches(predicate, declaration) + } == true || (classId != null && it.toAnnotationClassId(session) == classId) + } + } } fun FirClassSymbol<*>.remoteServiceSupertypeSource(session: FirSession): KtSourceElement? { diff --git a/compiler-plugin/compiler-plugin-k2/src/main/core/kotlinx/rpc/codegen/checkers/FirRpcAnnotationChecker.kt b/compiler-plugin/compiler-plugin-k2/src/main/core/kotlinx/rpc/codegen/checkers/FirRpcAnnotationChecker.kt index 4221420b2..0e2a7ec35 100644 --- a/compiler-plugin/compiler-plugin-k2/src/main/core/kotlinx/rpc/codegen/checkers/FirRpcAnnotationChecker.kt +++ b/compiler-plugin/compiler-plugin-k2/src/main/core/kotlinx/rpc/codegen/checkers/FirRpcAnnotationChecker.kt @@ -7,6 +7,7 @@ package kotlinx.rpc.codegen.checkers import kotlinx.rpc.codegen.FirCheckersContext import kotlinx.rpc.codegen.FirRpcPredicates import kotlinx.rpc.codegen.checkers.diagnostics.FirRpcDiagnostics +import kotlinx.rpc.codegen.common.RpcClassId import kotlinx.rpc.codegen.isRemoteService import kotlinx.rpc.codegen.remoteServiceSupertypeSource import kotlinx.rpc.codegen.rpcAnnotation @@ -31,12 +32,22 @@ class FirRpcAnnotationChecker(private val ctx: FirCheckersContext) : FirRegularC val rpcAnnotated = context.session.predicateBasedProvider.matches(FirRpcPredicates.rpc, declaration) val rpcMetaAnnotated = context.session.predicateBasedProvider.matches(FirRpcPredicates.rpcMeta, declaration) - if (!declaration.isInterface && declaration.classKind != ClassKind.ANNOTATION_CLASS && rpcMetaAnnotated) { + val isMetaAnnotated = declaration.classKind != ClassKind.ANNOTATION_CLASS + + if (!declaration.isInterface && isMetaAnnotated && rpcMetaAnnotated) { reporter.reportOn( - source = declaration.symbol.rpcAnnotationSource(context.session), + source = declaration.symbol.rpcAnnotationSource( + session = context.session, + predicate = FirRpcPredicates.rpcMeta, + classId = RpcClassId.rpcAnnotation, + ), factory = FirRpcDiagnostics.WRONG_RPC_ANNOTATION_TARGET, context = context, - a = declaration.symbol.rpcAnnotation(context.session)?.resolvedType + a = declaration.symbol.rpcAnnotation( + session = context.session, + predicate = FirRpcPredicates.rpc, + classId = RpcClassId.rpcAnnotation, + )?.resolvedType ?: error("Unexpected unresolved annotation type for declaration: ${declaration.symbol.classId.asSingleFqName()}"), ) } @@ -49,9 +60,13 @@ class FirRpcAnnotationChecker(private val ctx: FirCheckersContext) : FirRegularC ) } - if (rpcAnnotated && !ctx.serializationIsPresent) { + if (rpcAnnotated && !ctx.serializationIsPresent && isMetaAnnotated) { reporter.reportOn( - source = declaration.symbol.rpcAnnotationSource(context.session), + source = declaration.symbol.rpcAnnotationSource( + session = context.session, + predicate = FirRpcPredicates.rpcMeta, + classId = RpcClassId.rpcAnnotation, + ), factory = FirRpcDiagnostics.MISSING_SERIALIZATION_MODULE, context = context, ) diff --git a/compiler-plugin/compiler-plugin-k2/src/main/core/kotlinx/rpc/codegen/checkers/diagnostics/FirRpcDiagnostics.kt b/compiler-plugin/compiler-plugin-k2/src/main/core/kotlinx/rpc/codegen/checkers/diagnostics/FirRpcDiagnostics.kt index ecb6e253b..55758c8f5 100644 --- a/compiler-plugin/compiler-plugin-k2/src/main/core/kotlinx/rpc/codegen/checkers/diagnostics/FirRpcDiagnostics.kt +++ b/compiler-plugin/compiler-plugin-k2/src/main/core/kotlinx/rpc/codegen/checkers/diagnostics/FirRpcDiagnostics.kt @@ -11,14 +11,13 @@ import org.jetbrains.kotlin.diagnostics.error0 import org.jetbrains.kotlin.diagnostics.error1 import org.jetbrains.kotlin.diagnostics.error2 import org.jetbrains.kotlin.diagnostics.rendering.RootDiagnosticRendererFactory -import org.jetbrains.kotlin.diagnostics.warning0 import org.jetbrains.kotlin.fir.types.ConeKotlinType import org.jetbrains.kotlin.name.Name import org.jetbrains.kotlin.psi.KtAnnotationEntry object FirRpcDiagnostics { val MISSING_RPC_ANNOTATION by error0() - val MISSING_SERIALIZATION_MODULE by warning0() + val MISSING_SERIALIZATION_MODULE by error0() val WRONG_RPC_ANNOTATION_TARGET by error1() val CHECKED_ANNOTATION_VIOLATION by error1() val NON_SUSPENDING_REQUEST_WITHOUT_STREAMING_RETURN_TYPE by error0() diff --git a/core/src/jvmMain/kotlin/kotlinx/rpc/internal/internalServiceDescriptorOf.jvm.kt b/core/src/jvmMain/kotlin/kotlinx/rpc/internal/internalServiceDescriptorOf.jvm.kt index 145f60899..2ac037856 100644 --- a/core/src/jvmMain/kotlin/kotlinx/rpc/internal/internalServiceDescriptorOf.jvm.kt +++ b/core/src/jvmMain/kotlin/kotlinx/rpc/internal/internalServiceDescriptorOf.jvm.kt @@ -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. */ package kotlinx.rpc.internal @@ -13,8 +13,12 @@ private const val RPC_SERVICE_STUB_SIMPLE_NAME = "\$rpcServiceStub" internal actual fun <@Rpc T : Any> internalServiceDescriptorOf(kClass: KClass): Any? { val className = "${kClass.qualifiedName}\$$RPC_SERVICE_STUB_SIMPLE_NAME" - return kClass.java.classLoader - .loadClass(className) - ?.kotlin - ?.companionObjectInstance + return try { + return kClass.java.classLoader + .loadClass(className) + ?.kotlin + ?.companionObjectInstance + } catch (_: ClassNotFoundException) { + null + } } diff --git a/publishLocal.sh b/publishLocal.sh index 3355b090c..006497b9b 100755 --- a/publishLocal.sh +++ b/publishLocal.sh @@ -1,11 +1,11 @@ #!/bin/bash # -# 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. # set -euxo pipefail ./gradlew publishAllPublicationsToBuildRepoRepository -./gradlew -p compiler-plugin publishAllPublicationsToBuildRepoRepository -./gradlew -p gradle-plugin publishAllPublicationsToBuildRepoRepository +./gradlew -p compiler-plugin publishAllPublicationsToBuildRepoRepository --no-configuration-cache +./gradlew -p gradle-plugin publishAllPublicationsToBuildRepoRepository --no-configuration-cache