Skip to content

Commit 3bab585

Browse files
authored
Added basic CheckedTypeAnnotation impl with compiler plugin check (#240)
1 parent 657cace commit 3bab585

File tree

52 files changed

+1437
-69
lines changed

Some content is hidden

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

52 files changed

+1437
-69
lines changed

build.gradle.kts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ plugins {
1414
alias(libs.plugins.conventions.kover)
1515
alias(libs.plugins.conventions.gradle.doctor)
1616
alias(libs.plugins.atomicfu)
17+
id("build-util")
1718
}
1819

1920
configureProjectReport()

compiler-plugin/build.gradle.kts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ import util.whenForIde
77

88
plugins {
99
alias(libs.plugins.conventions.gradle.doctor)
10+
id("build-util")
1011
}
1112

1213
val rpcVersion: String = libs.versions.kotlinx.rpc.get()

compiler-plugin/compiler-plugin-common/src/main/core/kotlinx/rpc/codegen/common/Names.kt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ import org.jetbrains.kotlin.name.Name
1111
object RpcClassId {
1212
val remoteServiceInterface = ClassId(FqName("kotlinx.rpc"), Name.identifier("RemoteService"))
1313
val rpcAnnotation = ClassId(FqName("kotlinx.rpc.annotations"), Name.identifier("Rpc"))
14+
val checkedTypeAnnotation = ClassId(FqName("kotlinx.rpc.annotations"), Name.identifier("CheckedTypeAnnotation"))
1415

1516
val serializableAnnotation = ClassId(FqName("kotlinx.serialization"), Name.identifier("Serializable"))
1617
val contextualAnnotation = ClassId(FqName("kotlinx.serialization"), Name.identifier("Contextual"))

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

Lines changed: 18 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,16 +4,32 @@
44

55
package kotlinx.rpc.codegen
66

7+
import kotlinx.rpc.codegen.checkers.FirCheckedAnnotationHelper
78
import kotlinx.rpc.codegen.checkers.FirRpcDeclarationCheckers
9+
import kotlinx.rpc.codegen.checkers.FirRpcExpressionCheckers
810
import org.jetbrains.kotlin.fir.FirSession
911
import org.jetbrains.kotlin.fir.analysis.checkers.declaration.DeclarationCheckers
12+
import org.jetbrains.kotlin.fir.analysis.checkers.expression.ExpressionCheckers
1013
import org.jetbrains.kotlin.fir.analysis.extensions.FirAdditionalCheckersExtension
14+
import org.jetbrains.kotlin.fir.caches.createCache
15+
import org.jetbrains.kotlin.fir.caches.firCachesFactory
1116
import org.jetbrains.kotlin.fir.extensions.FirDeclarationPredicateRegistrar
17+
import org.jetbrains.kotlin.fir.symbols.impl.FirTypeParameterSymbol
1218

13-
class FirRpcCheckers(session: FirSession) : FirAdditionalCheckersExtension(session) {
19+
class FirRpcCheckers(session: FirSession, serializationIsPresent: Boolean) : FirAdditionalCheckersExtension(session) {
1420
override fun FirDeclarationPredicateRegistrar.registerPredicates() {
1521
register(FirRpcPredicates.rpc)
22+
register(FirRpcPredicates.checkedAnnotationMeta)
1623
}
1724

18-
override val declarationCheckers: DeclarationCheckers = FirRpcDeclarationCheckers
25+
private val ctx = FirCheckersContext(session, serializationIsPresent)
26+
27+
override val declarationCheckers: DeclarationCheckers = FirRpcDeclarationCheckers(ctx)
28+
override val expressionCheckers: ExpressionCheckers = FirRpcExpressionCheckers(ctx)
29+
}
30+
31+
class FirCheckersContext(private val session: FirSession, val serializationIsPresent: Boolean) {
32+
val typeParametersCache = session.firCachesFactory.createCache { typeParameter: FirTypeParameterSymbol ->
33+
FirCheckedAnnotationHelper.checkedAnnotations(session, typeParameter)
34+
}
1935
}

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

Lines changed: 15 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
package kotlinx.rpc.codegen
66

77
import org.jetbrains.kotlin.cli.common.CLIConfigurationKeys
8+
import org.jetbrains.kotlin.cli.common.messages.CompilerMessageSeverity
89
import org.jetbrains.kotlin.cli.common.messages.MessageCollector
910
import org.jetbrains.kotlin.config.CompilerConfiguration
1011
import org.jetbrains.kotlin.fir.extensions.FirExtensionRegistrar
@@ -16,8 +17,20 @@ class FirRpcExtensionRegistrar(private val configuration: CompilerConfiguration)
1617
override fun ExtensionRegistrarContext.configurePlugin() {
1718
val logger = configuration.get(CLIConfigurationKeys.MESSAGE_COLLECTOR_KEY, MessageCollector.NONE)
1819

19-
+CFactory { FirRpcCheckers(it) }
20-
+GFactory { FirRpcServiceGenerator(it, logger) }
20+
val serializationIsPresent = try {
21+
Class.forName("org.jetbrains.kotlinx.serialization.compiler.fir.SerializationFirResolveExtension")
22+
+GFactory { FirRpcServiceGenerator(it, logger) }
23+
true
24+
} catch (_ : ClassNotFoundException) {
25+
logger.report(
26+
severity = CompilerMessageSeverity.INFO,
27+
message = "Serialization plugin is not found, so generated services are not available",
28+
)
29+
false
30+
}
31+
32+
+CFactory { FirRpcCheckers(it, serializationIsPresent) }
33+
2134
+SFactory { FirRpcSupertypeGenerator(it, logger) }
2235
}
2336
}

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

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,4 +11,8 @@ object FirRpcPredicates {
1111
internal val rpc = DeclarationPredicate.create {
1212
annotated(RpcClassId.rpcAnnotation.asSingleFqName()) // @Rpc
1313
}
14+
15+
internal val checkedAnnotationMeta = DeclarationPredicate.create {
16+
metaAnnotated(RpcClassId.checkedTypeAnnotation.asSingleFqName(), includeItself = false)
17+
}
1418
}

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

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -67,7 +67,10 @@ class FirRpcServiceGenerator(
6767
@Suppress("unused")
6868
private val logger: MessageCollector,
6969
) : FirDeclarationGenerationExtension(session) {
70-
private val serializationExtension = SerializationFirResolveExtension(session)
70+
private val serializationExtension by lazy {
71+
SerializationFirResolveExtension(session)
72+
}
73+
7174
private val isJvmOrMetadata = !session.moduleData.platform.run { isJs() || isWasm() || isNative() }
7275

7376
override fun FirDeclarationPredicateRegistrar.registerPredicates() {

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

Lines changed: 15 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,8 @@
55
package kotlinx.rpc.codegen
66

77
import org.jetbrains.kotlin.KtSourceElement
8+
import org.jetbrains.kotlin.fir.FirSession
9+
import org.jetbrains.kotlin.fir.symbols.impl.FirClassSymbol
810
import org.jetbrains.kotlin.fir.types.ConeKotlinType
911
import org.jetbrains.kotlin.fir.types.FirResolvedTypeRef
1012
import org.jetbrains.kotlin.fir.types.FirTypeRef
@@ -16,10 +18,20 @@ interface FirVersionSpecificApi {
1618
delegatedTypeRef: FirTypeRef? = null,
1719
): FirResolvedTypeRef
1820

21+
fun ConeKotlinType.toClassSymbolVS(
22+
session: FirSession,
23+
): FirClassSymbol<*>?
24+
1925
var FirResolvedTypeRefBuilder.coneTypeVS: ConeKotlinType
2026
}
2127

22-
fun <T> vsApi(body: FirVersionSpecificApi.() -> T) : T {
23-
val klass = Class.forName("kotlinx.rpc.codegen.FirVersionSpecificApiImpl")
24-
return (klass.kotlin.objectInstance as FirVersionSpecificApi).body()
28+
val vsApiClass by lazy {
29+
runCatching {
30+
Class.forName("kotlinx.rpc.codegen.FirVersionSpecificApiImpl")
31+
}.getOrNull()
32+
}
33+
34+
inline fun <T> vsApi(body: FirVersionSpecificApi.() -> T): T {
35+
val kClass = vsApiClass?.kotlin ?: error("FirVersionSpecificApi is not present")
36+
return (kClass.objectInstance as FirVersionSpecificApi).body()
2537
}

0 commit comments

Comments
 (0)