Skip to content

Commit 884f99c

Browse files
committed
Backport compiler fixes from grpc-release
1 parent c0888a3 commit 884f99c

File tree

7 files changed

+69
-27
lines changed

7 files changed

+69
-27
lines changed

compiler-plugin/compiler-plugin-backend/src/main/core/kotlinx/rpc/codegen/extension/RpcIrServiceProcessor.kt

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*
2-
* Copyright 2023-2024 JetBrains s.r.o and contributors. Use of this source code is governed by the Apache 2.0 license.
2+
* Copyright 2023-2025 JetBrains s.r.o and contributors. Use of this source code is governed by the Apache 2.0 license.
33
*/
44

55
package kotlinx.rpc.codegen.extension
@@ -9,14 +9,15 @@ import org.jetbrains.kotlin.cli.common.messages.MessageCollector
99
import org.jetbrains.kotlin.ir.IrStatement
1010
import org.jetbrains.kotlin.ir.declarations.IrClass
1111
import org.jetbrains.kotlin.ir.util.hasAnnotation
12+
import org.jetbrains.kotlin.ir.util.isInterface
1213
import org.jetbrains.kotlin.ir.visitors.IrElementTransformer
1314

1415
internal class RpcIrServiceProcessor(
1516
@Suppress("unused")
1617
private val logger: MessageCollector,
1718
) : IrElementTransformer<RpcIrContext> {
1819
override fun visitClass(declaration: IrClass, data: RpcIrContext): IrStatement {
19-
if (declaration.hasAnnotation(RpcClassId.rpcAnnotation)) {
20+
if (declaration.hasAnnotation(RpcClassId.rpcAnnotation) && declaration.isInterface) {
2021
processService(declaration, data)
2122
}
2223

compiler-plugin/compiler-plugin-k2/src/main/core/kotlinx/rpc/codegen/FirRpcSupertypeGeneratorAbstract.kt

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,15 @@
11
/*
2-
* Copyright 2023-2024 JetBrains s.r.o and contributors. Use of this source code is governed by the Apache 2.0 license.
2+
* Copyright 2023-2025 JetBrains s.r.o and contributors. Use of this source code is governed by the Apache 2.0 license.
33
*/
44

55
package kotlinx.rpc.codegen
66

77
import kotlinx.rpc.codegen.common.RpcClassId
88
import org.jetbrains.kotlin.cli.common.messages.MessageCollector
99
import org.jetbrains.kotlin.fir.FirSession
10+
import org.jetbrains.kotlin.fir.declarations.FirClass
1011
import org.jetbrains.kotlin.fir.declarations.FirClassLikeDeclaration
12+
import org.jetbrains.kotlin.fir.declarations.utils.isInterface
1113
import org.jetbrains.kotlin.fir.extensions.FirDeclarationPredicateRegistrar
1214
import org.jetbrains.kotlin.fir.extensions.FirSupertypeGenerationExtension
1315
import org.jetbrains.kotlin.fir.extensions.predicateBasedProvider
@@ -23,7 +25,10 @@ abstract class FirRpcSupertypeGeneratorAbstract(
2325
}
2426

2527
override fun needTransformSupertypes(declaration: FirClassLikeDeclaration): Boolean {
26-
return session.predicateBasedProvider.matches(FirRpcPredicates.rpc, declaration)
28+
return session.predicateBasedProvider.matches(
29+
predicate = FirRpcPredicates.rpc,
30+
declaration = declaration,
31+
) && declaration is FirClass && declaration.isInterface
2732
}
2833

2934
protected fun computeAdditionalSupertypesAbstract(

compiler-plugin/compiler-plugin-k2/src/main/core/kotlinx/rpc/codegen/FirRpcUtils.kt

Lines changed: 26 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,17 @@
11
/*
2-
* Copyright 2023-2024 JetBrains s.r.o and contributors. Use of this source code is governed by the Apache 2.0 license.
2+
* Copyright 2023-2025 JetBrains s.r.o and contributors. Use of this source code is governed by the Apache 2.0 license.
33
*/
44

55
package kotlinx.rpc.codegen
66

77
import kotlinx.rpc.codegen.common.RpcClassId
88
import org.jetbrains.kotlin.KtSourceElement
99
import org.jetbrains.kotlin.fir.FirSession
10-
import org.jetbrains.kotlin.fir.declarations.getAnnotationByClassId
10+
import org.jetbrains.kotlin.fir.declarations.toAnnotationClassId
1111
import org.jetbrains.kotlin.fir.expressions.FirAnnotation
12+
import org.jetbrains.kotlin.fir.expressions.UnresolvedExpressionTypeAccess
13+
import org.jetbrains.kotlin.fir.extensions.predicate.DeclarationPredicate
14+
import org.jetbrains.kotlin.fir.extensions.predicateBasedProvider
1215
import org.jetbrains.kotlin.fir.resolve.fullyExpandedType
1316
import org.jetbrains.kotlin.fir.symbols.FirBasedSymbol
1417
import org.jetbrains.kotlin.fir.symbols.SymbolInternals
@@ -23,16 +26,31 @@ fun FirClassSymbol<*>.isRemoteService(session: FirSession): Boolean = resolvedSu
2326
it.doesMatchesClassId(session, RpcClassId.remoteServiceInterface)
2427
}
2528

26-
fun FirBasedSymbol<*>.rpcAnnotationSource(session: FirSession): KtSourceElement? {
27-
return rpcAnnotation(session)?.source
29+
fun FirBasedSymbol<*>.rpcAnnotationSource(
30+
session: FirSession,
31+
predicate: DeclarationPredicate,
32+
classId: ClassId?,
33+
): KtSourceElement? {
34+
return rpcAnnotation(session, predicate, classId)?.source
2835
}
2936

30-
fun FirBasedSymbol<*>.rpcAnnotation(session: FirSession): FirAnnotation? {
31-
return resolvedCompilerAnnotationsWithClassIds.rpcAnnotation(session)
37+
fun FirBasedSymbol<*>.rpcAnnotation(
38+
session: FirSession,
39+
predicate: DeclarationPredicate,
40+
classId: ClassId?,
41+
): FirAnnotation? {
42+
return resolvedCompilerAnnotationsWithClassIds.rpcAnnotation(session, predicate, classId)
3243
}
3344

34-
fun List<FirAnnotation>.rpcAnnotation(session: FirSession): FirAnnotation? {
35-
return getAnnotationByClassId(RpcClassId.rpcAnnotation, session)
45+
@OptIn(UnresolvedExpressionTypeAccess::class)
46+
fun List<FirAnnotation>.rpcAnnotation(session: FirSession, predicate: DeclarationPredicate, classId: ClassId?): FirAnnotation? {
47+
return find {
48+
vsApi {
49+
it.coneTypeOrNull?.toClassSymbolVS(session)?.let { declaration ->
50+
session.predicateBasedProvider.matches(predicate, declaration)
51+
} == true || (classId != null && it.toAnnotationClassId(session) == classId)
52+
}
53+
}
3654
}
3755

3856
fun FirClassSymbol<*>.remoteServiceSupertypeSource(session: FirSession): KtSourceElement? {

compiler-plugin/compiler-plugin-k2/src/main/core/kotlinx/rpc/codegen/checkers/FirRpcAnnotationChecker.kt

Lines changed: 20 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ package kotlinx.rpc.codegen.checkers
77
import kotlinx.rpc.codegen.FirCheckersContext
88
import kotlinx.rpc.codegen.FirRpcPredicates
99
import kotlinx.rpc.codegen.checkers.diagnostics.FirRpcDiagnostics
10+
import kotlinx.rpc.codegen.common.RpcClassId
1011
import kotlinx.rpc.codegen.isRemoteService
1112
import kotlinx.rpc.codegen.remoteServiceSupertypeSource
1213
import kotlinx.rpc.codegen.rpcAnnotation
@@ -31,12 +32,22 @@ class FirRpcAnnotationChecker(private val ctx: FirCheckersContext) : FirRegularC
3132
val rpcAnnotated = context.session.predicateBasedProvider.matches(FirRpcPredicates.rpc, declaration)
3233
val rpcMetaAnnotated = context.session.predicateBasedProvider.matches(FirRpcPredicates.rpcMeta, declaration)
3334

34-
if (!declaration.isInterface && declaration.classKind != ClassKind.ANNOTATION_CLASS && rpcMetaAnnotated) {
35+
val isMetaAnnotated = declaration.classKind != ClassKind.ANNOTATION_CLASS
36+
37+
if (!declaration.isInterface && isMetaAnnotated && rpcMetaAnnotated) {
3538
reporter.reportOn(
36-
source = declaration.symbol.rpcAnnotationSource(context.session),
39+
source = declaration.symbol.rpcAnnotationSource(
40+
session = context.session,
41+
predicate = FirRpcPredicates.rpcMeta,
42+
classId = RpcClassId.rpcAnnotation,
43+
),
3744
factory = FirRpcDiagnostics.WRONG_RPC_ANNOTATION_TARGET,
3845
context = context,
39-
a = declaration.symbol.rpcAnnotation(context.session)?.resolvedType
46+
a = declaration.symbol.rpcAnnotation(
47+
session = context.session,
48+
predicate = FirRpcPredicates.rpc,
49+
classId = RpcClassId.rpcAnnotation,
50+
)?.resolvedType
4051
?: error("Unexpected unresolved annotation type for declaration: ${declaration.symbol.classId.asSingleFqName()}"),
4152
)
4253
}
@@ -49,9 +60,13 @@ class FirRpcAnnotationChecker(private val ctx: FirCheckersContext) : FirRegularC
4960
)
5061
}
5162

52-
if (rpcAnnotated && !ctx.serializationIsPresent) {
63+
if (rpcAnnotated && !ctx.serializationIsPresent && isMetaAnnotated) {
5364
reporter.reportOn(
54-
source = declaration.symbol.rpcAnnotationSource(context.session),
65+
source = declaration.symbol.rpcAnnotationSource(
66+
session = context.session,
67+
predicate = FirRpcPredicates.rpcMeta,
68+
classId = RpcClassId.rpcAnnotation,
69+
),
5570
factory = FirRpcDiagnostics.MISSING_SERIALIZATION_MODULE,
5671
context = context,
5772
)

compiler-plugin/compiler-plugin-k2/src/main/core/kotlinx/rpc/codegen/checkers/diagnostics/FirRpcDiagnostics.kt

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11,14 +11,13 @@ import org.jetbrains.kotlin.diagnostics.error0
1111
import org.jetbrains.kotlin.diagnostics.error1
1212
import org.jetbrains.kotlin.diagnostics.error2
1313
import org.jetbrains.kotlin.diagnostics.rendering.RootDiagnosticRendererFactory
14-
import org.jetbrains.kotlin.diagnostics.warning0
1514
import org.jetbrains.kotlin.fir.types.ConeKotlinType
1615
import org.jetbrains.kotlin.name.Name
1716
import org.jetbrains.kotlin.psi.KtAnnotationEntry
1817

1918
object FirRpcDiagnostics {
2019
val MISSING_RPC_ANNOTATION by error0<KtAnnotationEntry>()
21-
val MISSING_SERIALIZATION_MODULE by warning0<KtAnnotationEntry>()
20+
val MISSING_SERIALIZATION_MODULE by error0<KtAnnotationEntry>()
2221
val WRONG_RPC_ANNOTATION_TARGET by error1<KtAnnotationEntry, ConeKotlinType>()
2322
val CHECKED_ANNOTATION_VIOLATION by error1<KtAnnotationEntry, ConeKotlinType>()
2423
val NON_SUSPENDING_REQUEST_WITHOUT_STREAMING_RETURN_TYPE by error0<PsiElement>()

core/src/jvmMain/kotlin/kotlinx/rpc/internal/internalServiceDescriptorOf.jvm.kt

Lines changed: 9 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*
2-
* Copyright 2023-2024 JetBrains s.r.o and contributors. Use of this source code is governed by the Apache 2.0 license.
2+
* Copyright 2023-2025 JetBrains s.r.o and contributors. Use of this source code is governed by the Apache 2.0 license.
33
*/
44

55
package kotlinx.rpc.internal
@@ -13,8 +13,12 @@ private const val RPC_SERVICE_STUB_SIMPLE_NAME = "\$rpcServiceStub"
1313
internal actual fun <@Rpc T : Any> internalServiceDescriptorOf(kClass: KClass<T>): Any? {
1414
val className = "${kClass.qualifiedName}\$$RPC_SERVICE_STUB_SIMPLE_NAME"
1515

16-
return kClass.java.classLoader
17-
.loadClass(className)
18-
?.kotlin
19-
?.companionObjectInstance
16+
return try {
17+
return kClass.java.classLoader
18+
.loadClass(className)
19+
?.kotlin
20+
?.companionObjectInstance
21+
} catch (_: ClassNotFoundException) {
22+
null
23+
}
2024
}

publishLocal.sh

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,11 @@
11
#!/bin/bash
22

33
#
4-
# Copyright 2023-2024 JetBrains s.r.o and contributors. Use of this source code is governed by the Apache 2.0 license.
4+
# Copyright 2023-2025 JetBrains s.r.o and contributors. Use of this source code is governed by the Apache 2.0 license.
55
#
66

77
set -euxo pipefail
88

99
./gradlew publishAllPublicationsToBuildRepoRepository
10-
./gradlew -p compiler-plugin publishAllPublicationsToBuildRepoRepository
11-
./gradlew -p gradle-plugin publishAllPublicationsToBuildRepoRepository
10+
./gradlew -p compiler-plugin publishAllPublicationsToBuildRepoRepository --no-configuration-cache
11+
./gradlew -p gradle-plugin publishAllPublicationsToBuildRepoRepository --no-configuration-cache

0 commit comments

Comments
 (0)