Skip to content

Commit 6d7a8aa

Browse files
committed
Migrate backend
1 parent 4c4a022 commit 6d7a8aa

File tree

10 files changed

+505
-177
lines changed

10 files changed

+505
-177
lines changed

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

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,13 +6,16 @@
66

77
package kotlinx.rpc.codegen
88

9+
import kotlinx.rpc.codegen.extension.IrMemberAccessExpressionData
910
import org.jetbrains.kotlin.backend.common.extensions.IrPluginContext
1011
import org.jetbrains.kotlin.cli.common.messages.MessageCollector
1112
import org.jetbrains.kotlin.config.CompilerConfigurationKey
1213
import org.jetbrains.kotlin.descriptors.SourceElement
1314
import org.jetbrains.kotlin.ir.builders.declarations.IrFieldBuilder
1415
import org.jetbrains.kotlin.ir.declarations.*
1516
import org.jetbrains.kotlin.ir.expressions.IrCall
17+
import org.jetbrains.kotlin.ir.expressions.IrExpression
18+
import org.jetbrains.kotlin.ir.expressions.IrMemberAccessExpression
1619
import org.jetbrains.kotlin.ir.expressions.IrStatementOrigin
1720
import org.jetbrains.kotlin.ir.expressions.impl.IrCallImpl
1821
import org.jetbrains.kotlin.ir.expressions.impl.IrConstructorCallImpl
@@ -79,6 +82,12 @@ interface VersionSpecificApi {
7982
origin: IrStatementOrigin? = null,
8083
source: SourceElement = SourceElement.NO_SOURCE,
8184
): IrConstructorCallImpl
85+
86+
fun IrFunction.valueParametersVS(): List<IrValueParameter>
87+
val IrFunction.extensionReceiverParameterVS: IrValueParameter?
88+
var IrFunction.dispatchReceiverParameterVS: IrValueParameter?
89+
90+
fun IrMemberAccessExpressionData.buildFor(access: IrMemberAccessExpression<*>)
8291
}
8392

8493
@Suppress("unused")
Lines changed: 60 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,60 @@
1+
/*
2+
* Copyright 2023-2025 JetBrains s.r.o and contributors. Use of this source code is governed by the Apache 2.0 license.
3+
*/
4+
5+
package kotlinx.rpc.codegen.extension
6+
7+
import kotlinx.rpc.codegen.VersionSpecificApi
8+
import org.jetbrains.kotlin.ir.expressions.IrExpression
9+
import org.jetbrains.kotlin.ir.expressions.IrMemberAccessExpression
10+
import org.jetbrains.kotlin.ir.types.IrType
11+
12+
class IrMemberAccessExpressionData(
13+
val dispatchReceiver: IrExpression?,
14+
val extensionReceiver: IrExpression?,
15+
val typeArguments: List<IrType>,
16+
val valueArguments: List<IrExpression>,
17+
)
18+
19+
class IrMemberAccessExpressionBuilder(private val vsApi: VersionSpecificApi) {
20+
var dispatchReceiver: IrExpression? = null
21+
var extensionReceiver: IrExpression? = null
22+
23+
private var valueArguments: List<IrExpression> = emptyList()
24+
private var typeArguments: List<IrType> = emptyList()
25+
26+
fun types(builder: TypeBuilder.() -> Unit) {
27+
TypeBuilder().builder()
28+
}
29+
30+
fun values(builder: ValueBuilder.() -> Unit) {
31+
ValueBuilder().builder()
32+
}
33+
34+
inner class TypeBuilder {
35+
operator fun IrType.unaryPlus() {
36+
typeArguments += this
37+
}
38+
}
39+
40+
inner class ValueBuilder {
41+
operator fun IrExpression.unaryPlus() {
42+
valueArguments += this
43+
}
44+
}
45+
46+
fun build(): IrMemberAccessExpressionData = IrMemberAccessExpressionData(
47+
dispatchReceiver,
48+
extensionReceiver,
49+
typeArguments,
50+
valueArguments
51+
)
52+
}
53+
54+
inline fun IrMemberAccessExpression<*>.arguments(vsApi: VersionSpecificApi, builder: IrMemberAccessExpressionBuilder.() -> Unit) {
55+
IrMemberAccessExpressionBuilder(vsApi).apply(builder).build().let { data ->
56+
with(vsApi) {
57+
data.buildFor(this@arguments)
58+
}
59+
}
60+
}

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

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -23,10 +23,6 @@ import org.jetbrains.kotlin.name.Name
2323
import org.jetbrains.kotlin.types.Variance
2424
import java.util.*
2525

26-
fun String.capitalized(): String {
27-
return replaceFirstChar { if (it.isLowerCase()) it.titlecase(Locale.getDefault()) else it.toString() }
28-
}
29-
3026
fun IrClassifierSymbol.typeWith(type: IrType, variance: Variance): IrType {
3127
return IrSimpleTypeImpl(
3228
classifier = this,

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

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,11 +4,14 @@
44

55
package kotlinx.rpc.codegen.extension
66

7+
import kotlinx.rpc.codegen.VersionSpecificApi
78
import kotlinx.rpc.codegen.common.RpcNames
89
import org.jetbrains.kotlin.cli.common.messages.CompilerMessageSeverity
910
import org.jetbrains.kotlin.cli.common.messages.MessageCollector
11+
import org.jetbrains.kotlin.fir.java.enhancement.FirEmptyJavaDeclarationList.declarations
1012
import org.jetbrains.kotlin.ir.declarations.IrClass
1113
import org.jetbrains.kotlin.ir.declarations.IrDeclaration
14+
import org.jetbrains.kotlin.ir.declarations.IrParameterKind
1215
import org.jetbrains.kotlin.ir.declarations.IrProperty
1316
import org.jetbrains.kotlin.ir.declarations.IrSimpleFunction
1417
import org.jetbrains.kotlin.ir.types.classOrNull
@@ -34,8 +37,10 @@ internal object RpcDeclarationScanner {
3437

3538
ServiceDeclaration.Method(
3639
function = declaration,
37-
arguments = declaration.valueParameters.memoryOptimizedMap { param ->
38-
ServiceDeclaration.Method.Argument(param, param.type)
40+
arguments = ctx.versionSpecificApi.run {
41+
declaration.valueParametersVS().memoryOptimizedMap { param ->
42+
ServiceDeclaration.Method.Argument(param, param.type)
43+
}
3944
},
4045
)
4146
}

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

Lines changed: 17 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ import org.jetbrains.kotlin.ir.symbols.IrSimpleFunctionSymbol
1313
import org.jetbrains.kotlin.ir.types.classOrNull
1414
import org.jetbrains.kotlin.ir.types.makeNullable
1515
import org.jetbrains.kotlin.ir.util.functions
16+
import org.jetbrains.kotlin.ir.util.hasShape
1617
import org.jetbrains.kotlin.ir.util.isVararg
1718
import org.jetbrains.kotlin.ir.util.nestedClasses
1819
import org.jetbrains.kotlin.ir.util.properties
@@ -202,19 +203,25 @@ internal class RpcIrContext(
202203

203204
val lazy by lazy {
204205
namedFunction("kotlin", "lazy") {
205-
it.owner.valueParameters.size == 1
206+
vsApi {
207+
it.owner.valueParametersVS().size == 1
208+
}
206209
}
207210
}
208211

209212
val lazyGetValue by lazy {
210213
namedFunction("kotlin", "getValue") {
211-
it.owner.extensionReceiverParameter?.type?.classOrNull == this@RpcIrContext.lazy
214+
vsApi {
215+
it.owner.extensionReceiverParameterVS?.type?.classOrNull == this@RpcIrContext.lazy
216+
}
212217
}
213218
}
214219

215220
val listOf by lazy {
216221
namedFunction("kotlin.collections", "listOf") {
217-
it.owner.valueParameters.singleOrNull()?.isVararg ?: false
222+
vsApi {
223+
it.owner.valueParametersVS().singleOrNull()?.isVararg ?: false
224+
}
218225
}
219226
}
220227

@@ -224,7 +231,9 @@ internal class RpcIrContext(
224231

225232
val mapOf by lazy {
226233
namedFunction("kotlin.collections", "mapOf") {
227-
it.owner.valueParameters.singleOrNull()?.isVararg ?: false
234+
vsApi {
235+
it.owner.valueParametersVS().singleOrNull()?.isVararg ?: false
236+
}
228237
}
229238
}
230239

@@ -284,4 +293,8 @@ internal class RpcIrContext(
284293
return versionSpecificApi.referenceClass(pluginContext, packageName, name)
285294
?: error("Unable to find symbol. Package: $packageName, name: $name")
286295
}
296+
297+
private fun <T> vsApi(body: VersionSpecificApi.() -> T): T {
298+
return versionSpecificApi.run(body)
299+
}
287300
}

0 commit comments

Comments
 (0)