Skip to content

Commit 136b87e

Browse files
authored
Update Service Descriptors Generation (#227)
1 parent 765527f commit 136b87e

File tree

57 files changed

+2120
-1380
lines changed

Some content is hidden

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

57 files changed

+2120
-1380
lines changed

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

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

77
import org.jetbrains.kotlin.backend.common.extensions.IrPluginContext
8+
import org.jetbrains.kotlin.cli.common.messages.MessageCollector
9+
import org.jetbrains.kotlin.config.CompilerConfigurationKey
810
import org.jetbrains.kotlin.ir.builders.declarations.IrFieldBuilder
911
import org.jetbrains.kotlin.ir.declarations.*
1012
import org.jetbrains.kotlin.ir.expressions.IrCall
@@ -42,6 +44,8 @@ interface VersionSpecificApi {
4244

4345
var IrConstructor.isPrimaryVS: Boolean
4446

47+
val messageCollectorKey: CompilerConfigurationKey<MessageCollector>
48+
4549
companion object {
4650
lateinit var INSTANCE: VersionSpecificApi
4751
}

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

Lines changed: 59 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -6,15 +6,15 @@ package kotlinx.rpc.codegen.extension
66

77
import kotlinx.rpc.codegen.VersionSpecificApi
88
import org.jetbrains.kotlin.backend.common.extensions.IrPluginContext
9-
import org.jetbrains.kotlin.ir.declarations.IrEnumEntry
10-
import org.jetbrains.kotlin.ir.declarations.IrProperty
119
import org.jetbrains.kotlin.ir.declarations.IrSimpleFunction
1210
import org.jetbrains.kotlin.ir.symbols.IrClassSymbol
11+
import org.jetbrains.kotlin.ir.symbols.IrPropertySymbol
1312
import org.jetbrains.kotlin.ir.symbols.IrSimpleFunctionSymbol
1413
import org.jetbrains.kotlin.ir.types.classOrNull
1514
import org.jetbrains.kotlin.ir.types.makeNullable
1615
import org.jetbrains.kotlin.ir.util.functions
1716
import org.jetbrains.kotlin.ir.util.isVararg
17+
import org.jetbrains.kotlin.ir.util.nestedClasses
1818
import org.jetbrains.kotlin.ir.util.properties
1919
import org.jetbrains.kotlin.platform.konan.isNative
2020
import org.jetbrains.kotlin.types.Variance
@@ -53,10 +53,18 @@ internal class RPCIrContext(
5353
getIrClassSymbol("kotlin", "Function0")
5454
}
5555

56+
val function1 by lazy {
57+
getIrClassSymbol("kotlin", "Function1")
58+
}
59+
5660
val suspendFunction0 by lazy {
5761
getIrClassSymbol("kotlin.coroutines", "SuspendFunction0")
5862
}
5963

64+
val suspendFunction2 by lazy {
65+
getIrClassSymbol("kotlin.coroutines", "SuspendFunction2")
66+
}
67+
6068
val flow by lazy {
6169
getIrClassSymbol("kotlinx.coroutines.flow", "Flow")
6270
}
@@ -78,45 +86,55 @@ internal class RPCIrContext(
7886
}
7987

8088
val rpcClient by lazy {
81-
getRpcIrClassSymbol("RPCClient")
89+
getRpcIrClassSymbol("RpcClient")
8290
}
8391

8492
val rpcCall by lazy {
85-
getRpcIrClassSymbol("RPCCall")
93+
getRpcIrClassSymbol("RpcCall")
94+
}
95+
96+
val withServiceDescriptor by lazy {
97+
getRpcIrClassSymbol("WithServiceDescriptor", "internal")
8698
}
8799

88-
val rpcCallType by lazy {
89-
getRpcIrClassSymbol("RPCCall.Type")
100+
val rpcEagerFieldAnnotation by lazy {
101+
getRpcIrClassSymbol("RPCEagerField")
90102
}
91103

92-
val rpcCallTypeMethod by lazy {
93-
rpcCallType.owner.declarations.filterIsInstance<IrEnumEntry>().single {
94-
it.name.asString() == "Method"
95-
}.symbol
104+
val rpcServiceDescriptor by lazy {
105+
getRpcIrClassSymbol("RpcServiceDescriptor", "descriptor")
96106
}
97107

98-
val rpcField by lazy {
99-
getRpcIrClassSymbol("RPCField")
108+
val rpcCallable by lazy {
109+
getRpcIrClassSymbol("RpcCallable", "descriptor")
100110
}
101111

102-
val withRPCStubObjectAnnotation by lazy {
103-
getRpcIrClassSymbol("WithRPCStubObject", "internal")
112+
private val rpcInvokator by lazy {
113+
getRpcIrClassSymbol("RpcInvokator", "descriptor")
104114
}
105115

106-
val rpcEagerFieldAnnotation by lazy {
107-
getRpcIrClassSymbol("RPCEagerField")
116+
val rpcInvokatorMethod by lazy {
117+
rpcInvokator.subClass("Method")
108118
}
109119

110-
val rpcStubObject by lazy {
111-
getRpcIrClassSymbol("RPCStubObject", "internal")
120+
val rpcInvokatorField by lazy {
121+
rpcInvokator.subClass("Field")
122+
}
123+
124+
val rpcParameter by lazy {
125+
getRpcIrClassSymbol("RpcParameter", "descriptor")
112126
}
113127

114128
val rpcDeferredField by lazy {
115-
getRpcIrClassSymbol("RPCDeferredField", "internal")
129+
getRpcIrClassSymbol("RpcDeferredField", "internal")
116130
}
117131

118-
val rpcMethodClassArguments by lazy {
119-
getRpcIrClassSymbol("RPCMethodClassArguments", "internal")
132+
val fieldDataObject by lazy {
133+
getRpcIrClassSymbol("FieldDataObject", "internal")
134+
}
135+
136+
val rpcMethodClass by lazy {
137+
getRpcIrClassSymbol("RpcMethodClass", "internal")
120138
}
121139

122140
fun isJsTarget(): Boolean {
@@ -135,15 +153,19 @@ internal class RPCIrContext(
135153

136154
inner class Functions {
137155
val registerPlainFlowField by lazy {
138-
rpcClient.namedFunction("registerPlainFlowField")
156+
namedFunction("kotlinx.rpc", "registerPlainFlowField")
139157
}
140158

141159
val registerSharedFlowField by lazy {
142-
rpcClient.namedFunction("registerSharedFlowField")
160+
namedFunction("kotlinx.rpc", "registerSharedFlowField")
143161
}
144162

145163
val registerStateFlowField by lazy {
146-
rpcClient.namedFunction("registerStateFlowField")
164+
namedFunction("kotlinx.rpc", "registerStateFlowField")
165+
}
166+
167+
val dataCast by lazy {
168+
namedFunction("kotlinx.rpc.internal", "dataCast")
147169
}
148170

149171
val rpcClientCall by lazy {
@@ -155,7 +177,7 @@ internal class RPCIrContext(
155177
}
156178

157179
val asArray by lazy {
158-
rpcMethodClassArguments.namedFunction("asArray")
180+
rpcMethodClass.namedFunction("asArray")
159181
}
160182

161183
val typeOf by lazy {
@@ -217,7 +239,7 @@ internal class RPCIrContext(
217239
private fun namedFunction(
218240
packageName: String,
219241
name: String,
220-
filterOverloads: ((IrSimpleFunctionSymbol) -> Boolean)? = null
242+
filterOverloads: ((IrSimpleFunctionSymbol) -> Boolean)? = null,
221243
): IrSimpleFunctionSymbol {
222244
val found = versionSpecificApi.referenceFunctions(pluginContext, packageName, name)
223245

@@ -232,17 +254,25 @@ internal class RPCIrContext(
232254
rpcClient.namedProperty("coroutineContext")
233255
}
234256

235-
private fun IrClassSymbol.namedProperty(name: String): IrProperty {
236-
return owner.properties.single { it.name.asString() == name }
257+
val rpcServiceDescriptorFqName by lazy {
258+
rpcServiceDescriptor.namedProperty("fqName")
259+
}
260+
261+
private fun IrClassSymbol.namedProperty(name: String): IrPropertySymbol {
262+
return owner.properties.single { it.name.asString() == name }.symbol
237263
}
238264
}
239265

266+
private fun IrClassSymbol.subClass(name: String): IrClassSymbol {
267+
return owner.nestedClasses.single { it.name.asString() == name }.symbol
268+
}
269+
240270
private fun getRpcIrClassSymbol(name: String, subpackage: String? = null): IrClassSymbol {
241271
val suffix = subpackage?.let { ".$subpackage" } ?: ""
242272
return getIrClassSymbol("kotlinx.rpc$suffix", name)
243273
}
244274

245-
fun getIrClassSymbol(packageName: String, name: String): IrClassSymbol {
275+
private fun getIrClassSymbol(packageName: String, name: String): IrClassSymbol {
246276
return versionSpecificApi.referenceClass(pluginContext, packageName, name)
247277
?: error("Unable to find symbol. Package: $packageName, name: $name")
248278
}

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

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,13 +7,12 @@ package kotlinx.rpc.codegen.extension
77
import kotlinx.rpc.codegen.VersionSpecificApi
88
import org.jetbrains.kotlin.backend.common.extensions.IrGenerationExtension
99
import org.jetbrains.kotlin.backend.common.extensions.IrPluginContext
10-
import org.jetbrains.kotlin.cli.common.CLIConfigurationKeys
1110
import org.jetbrains.kotlin.cli.common.messages.MessageCollector
1211
import org.jetbrains.kotlin.config.CompilerConfiguration
1312
import org.jetbrains.kotlin.ir.declarations.IrModuleFragment
1413

1514
class RPCIrExtension(configuration: CompilerConfiguration) : IrGenerationExtension {
16-
private val logger = configuration.get(CLIConfigurationKeys.MESSAGE_COLLECTOR_KEY, MessageCollector.NONE)
15+
private val logger = configuration.get(VersionSpecificApi.INSTANCE.messageCollectorKey, MessageCollector.NONE)
1716

1817
override fun generate(
1918
moduleFragment: IrModuleFragment,

0 commit comments

Comments
 (0)