Skip to content

Commit 6c4a4a2

Browse files
committed
Introduce common IR backend plugin (1/2) (#44)
* [IR] preparation for IR plugin * Introduce common IR backend plugin (2/2) (#45) * [IR] replace part of KSP with IR plugin * review comments
1 parent 45de74d commit 6c4a4a2

File tree

26 files changed

+1963
-135
lines changed

26 files changed

+1963
-135
lines changed

compiler-plugin/compiler-plugin-1_7/src/main/kotlin/kotlinx/rpc/codegen/VersionSpecificApiImpl.kt

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

77
import org.jetbrains.kotlin.backend.common.extensions.IrPluginContext
8+
import org.jetbrains.kotlin.backend.common.ir.copyTo
9+
import org.jetbrains.kotlin.descriptors.Modality
10+
import org.jetbrains.kotlin.ir.builders.declarations.IrFieldBuilder
11+
import org.jetbrains.kotlin.ir.builders.declarations.addExtensionReceiver
12+
import org.jetbrains.kotlin.ir.declarations.IrDeclarationOrigin
13+
import org.jetbrains.kotlin.ir.declarations.IrFunction
14+
import org.jetbrains.kotlin.ir.declarations.IrSimpleFunction
15+
import org.jetbrains.kotlin.ir.declarations.IrValueParameter
16+
import org.jetbrains.kotlin.ir.expressions.IrCall
17+
import org.jetbrains.kotlin.ir.expressions.IrStatementOrigin
818
import org.jetbrains.kotlin.ir.symbols.IrClassSymbol
19+
import org.jetbrains.kotlin.ir.symbols.IrSimpleFunctionSymbol
20+
import org.jetbrains.kotlin.ir.types.IrType
921
import org.jetbrains.kotlin.name.FqName
1022
import org.jetbrains.kotlin.platform.TargetPlatform
1123
import org.jetbrains.kotlin.platform.js.isJs
@@ -14,8 +26,31 @@ object VersionSpecificApiImpl : VersionSpecificApi {
1426
override fun isJs(platform: TargetPlatform?): Boolean {
1527
return platform.isJs()
1628
}
29+
override var IrFieldBuilder.modalityVS: Modality
30+
get() = undefinedAPI()
31+
set(_) {}
32+
33+
override var IrCall.originVS: IrStatementOrigin?
34+
get() = origin
35+
set(_) {}
1736

1837
override fun referenceClass(context: IrPluginContext, packageName: String, name: String): IrClassSymbol? {
1938
return context.referenceClass(FqName("$packageName.$name"))
2039
}
40+
41+
override fun referenceFunctions(
42+
context: IrPluginContext,
43+
packageName: String,
44+
name: String
45+
): Collection<IrSimpleFunctionSymbol> {
46+
return context.referenceFunctions(FqName("$packageName.$name"))
47+
}
48+
49+
override fun IrValueParameter.copyToVS(irFunction: IrFunction, origin: IrDeclarationOrigin): IrValueParameter {
50+
return copyTo(irFunction, origin)
51+
}
52+
53+
override fun IrSimpleFunction.addExtensionReceiverVS(type: IrType, origin: IrDeclarationOrigin): IrValueParameter {
54+
return addExtensionReceiver(type, origin)
55+
}
2156
}

compiler-plugin/compiler-plugin-1_7_2/src/main/kotlin/kotlinx/rpc/codegen/KRPCCompilerPlugin.kt renamed to compiler-plugin/compiler-plugin-1_7_2/src/main/kotlin/kotlinx/rpc/codegen/RPCCompilerPlugin.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ class RPCCompilerPlugin : ComponentRegistrar {
2222
VersionSpecificApi.INSTANCE = VersionSpecificApiImpl
2323
}
2424

25-
override val supportsK2: Boolean = false
25+
override val supportsK2: Boolean = true
2626

2727
override fun registerProjectComponents(project: MockProject, configuration: CompilerConfiguration) {
2828
val extension = RPCCompilerPluginCore.provideExtension(configuration)

compiler-plugin/compiler-plugin-1_7_2/src/main/kotlin/kotlinx/rpc/codegen/VersionSpecificApiImpl.kt

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

77
import org.jetbrains.kotlin.backend.common.extensions.IrPluginContext
8+
import org.jetbrains.kotlin.backend.common.ir.addExtensionReceiver
9+
import org.jetbrains.kotlin.descriptors.Modality
10+
import org.jetbrains.kotlin.ir.builders.declarations.IrFieldBuilder
11+
import org.jetbrains.kotlin.ir.declarations.IrDeclarationOrigin
12+
import org.jetbrains.kotlin.ir.declarations.IrFunction
13+
import org.jetbrains.kotlin.ir.declarations.IrSimpleFunction
14+
import org.jetbrains.kotlin.ir.declarations.IrValueParameter
15+
import org.jetbrains.kotlin.ir.expressions.IrCall
16+
import org.jetbrains.kotlin.ir.expressions.IrStatementOrigin
817
import org.jetbrains.kotlin.ir.symbols.IrClassSymbol
18+
import org.jetbrains.kotlin.ir.symbols.IrSimpleFunctionSymbol
19+
import org.jetbrains.kotlin.ir.types.IrType
20+
import org.jetbrains.kotlin.ir.util.copyTo
21+
import org.jetbrains.kotlin.name.CallableId
922
import org.jetbrains.kotlin.name.ClassId
1023
import org.jetbrains.kotlin.name.FqName
24+
import org.jetbrains.kotlin.name.Name
1125
import org.jetbrains.kotlin.platform.TargetPlatform
1226
import org.jetbrains.kotlin.platform.js.isJs
1327

1428
object VersionSpecificApiImpl : VersionSpecificApi {
1529
override fun isJs(platform: TargetPlatform?): Boolean {
1630
return platform.isJs()
1731
}
32+
override var IrFieldBuilder.modalityVS: Modality
33+
get() = undefinedAPI()
34+
set(_) {}
35+
36+
override var IrCall.originVS: IrStatementOrigin?
37+
get() = origin
38+
set(_) {}
1839

1940
override fun referenceClass(context: IrPluginContext, packageName: String, name: String): IrClassSymbol? {
2041
return context.referenceClass(
@@ -25,4 +46,25 @@ object VersionSpecificApiImpl : VersionSpecificApi {
2546
)
2647
)
2748
}
49+
50+
override fun referenceFunctions(
51+
context: IrPluginContext,
52+
packageName: String,
53+
name: String
54+
): Collection<IrSimpleFunctionSymbol> {
55+
return context.referenceFunctions(
56+
CallableId(
57+
FqName(packageName),
58+
Name.identifier(name),
59+
)
60+
)
61+
}
62+
63+
override fun IrValueParameter.copyToVS(irFunction: IrFunction, origin: IrDeclarationOrigin): IrValueParameter {
64+
return copyTo(irFunction, origin)
65+
}
66+
67+
override fun IrSimpleFunction.addExtensionReceiverVS(type: IrType, origin: IrDeclarationOrigin): IrValueParameter {
68+
return addExtensionReceiver(type, origin)
69+
}
2870
}

compiler-plugin/compiler-plugin-1_8/src/main/kotlin/kotlinx/rpc/codegen/KRPCCompilerPlugin.kt renamed to compiler-plugin/compiler-plugin-1_8/src/main/kotlin/kotlinx/rpc/codegen/RPCCompilerPlugin.kt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -24,11 +24,11 @@ class RPCCompilerPlugin : CompilerPluginRegistrar() {
2424
VersionSpecificApi.INSTANCE = VersionSpecificApiImpl
2525
}
2626

27-
override val supportsK2: Boolean = false
27+
override val supportsK2: Boolean = true
2828

2929
override fun ExtensionStorage.registerExtensions(configuration: CompilerConfiguration) {
3030
val extension = RPCCompilerPluginCore.provideExtension(configuration)
3131

3232
IrGenerationExtension.registerExtension(extension)
3333
}
34-
}
34+
}

compiler-plugin/compiler-plugin-1_8/src/main/kotlin/kotlinx/rpc/codegen/VersionSpecificApiImpl.kt

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

77
import org.jetbrains.kotlin.backend.common.extensions.IrPluginContext
8+
import org.jetbrains.kotlin.backend.common.ir.addExtensionReceiver
9+
import org.jetbrains.kotlin.descriptors.Modality
10+
import org.jetbrains.kotlin.ir.builders.declarations.IrFieldBuilder
11+
import org.jetbrains.kotlin.ir.declarations.IrDeclarationOrigin
12+
import org.jetbrains.kotlin.ir.declarations.IrFunction
13+
import org.jetbrains.kotlin.ir.declarations.IrSimpleFunction
14+
import org.jetbrains.kotlin.ir.declarations.IrValueParameter
15+
import org.jetbrains.kotlin.ir.expressions.IrCall
16+
import org.jetbrains.kotlin.ir.expressions.IrStatementOrigin
817
import org.jetbrains.kotlin.ir.symbols.IrClassSymbol
18+
import org.jetbrains.kotlin.ir.symbols.IrSimpleFunctionSymbol
19+
import org.jetbrains.kotlin.ir.types.IrType
20+
import org.jetbrains.kotlin.ir.util.copyTo
21+
import org.jetbrains.kotlin.name.CallableId
922
import org.jetbrains.kotlin.name.ClassId
1023
import org.jetbrains.kotlin.name.FqName
24+
import org.jetbrains.kotlin.name.Name
1125
import org.jetbrains.kotlin.platform.TargetPlatform
1226
import org.jetbrains.kotlin.platform.js.isJs
1327

1428
object VersionSpecificApiImpl : VersionSpecificApi {
1529
override fun isJs(platform: TargetPlatform?): Boolean {
1630
return platform.isJs()
1731
}
32+
override var IrFieldBuilder.modalityVS: Modality
33+
get() = undefinedAPI()
34+
set(_) {}
35+
36+
override var IrCall.originVS: IrStatementOrigin?
37+
get() = origin
38+
set(_) {}
1839

1940
override fun referenceClass(context: IrPluginContext, packageName: String, name: String): IrClassSymbol? {
2041
return context.referenceClass(
@@ -25,4 +46,28 @@ object VersionSpecificApiImpl : VersionSpecificApi {
2546
)
2647
)
2748
}
49+
50+
override fun referenceFunctions(
51+
context: IrPluginContext,
52+
packageName: String,
53+
name: String
54+
): Collection<IrSimpleFunctionSymbol> {
55+
return context.referenceFunctions(
56+
CallableId(
57+
FqName(packageName),
58+
Name.identifier(name),
59+
)
60+
)
61+
}
62+
63+
override fun IrValueParameter.copyToVS(
64+
irFunction: IrFunction,
65+
origin: IrDeclarationOrigin,
66+
): IrValueParameter {
67+
return copyTo(irFunction)
68+
}
69+
70+
override fun IrSimpleFunction.addExtensionReceiverVS(type: IrType, origin: IrDeclarationOrigin): IrValueParameter {
71+
return addExtensionReceiver(type, origin)
72+
}
2873
}

compiler-plugin/compiler-plugin-1_9/src/main/kotlin/kotlinx/rpc/codegen/RPCCompilerPlugin.kt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ import org.jetbrains.kotlin.config.CompilerConfiguration
1313

1414
@OptIn(ExperimentalCompilerApi::class)
1515
class RPCCommandLineProcessor : CommandLineProcessor {
16-
override val pluginId = "kotlinx.rpc.compiler-plugin"
16+
override val pluginId = "kotlinx.rpc.codegen"
1717

1818
override val pluginOptions = emptyList<CliOption>()
1919
}
@@ -24,7 +24,7 @@ class RPCCompilerPlugin : CompilerPluginRegistrar() {
2424
VersionSpecificApi.INSTANCE = VersionSpecificApiImpl
2525
}
2626

27-
override val supportsK2: Boolean = false
27+
override val supportsK2: Boolean = true
2828

2929
override fun ExtensionStorage.registerExtensions(configuration: CompilerConfiguration) {
3030
val extension = RPCCompilerPluginCore.provideExtension(configuration)

compiler-plugin/compiler-plugin-1_9/src/main/kotlin/kotlinx/rpc/codegen/VersionSpecificApiImpl.kt

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

77
import org.jetbrains.kotlin.backend.common.extensions.IrPluginContext
8+
import org.jetbrains.kotlin.backend.common.ir.addExtensionReceiver
9+
import org.jetbrains.kotlin.descriptors.Modality
10+
import org.jetbrains.kotlin.ir.builders.declarations.IrFieldBuilder
11+
import org.jetbrains.kotlin.ir.declarations.IrDeclarationOrigin
12+
import org.jetbrains.kotlin.ir.declarations.IrFunction
13+
import org.jetbrains.kotlin.ir.declarations.IrSimpleFunction
14+
import org.jetbrains.kotlin.ir.declarations.IrValueParameter
15+
import org.jetbrains.kotlin.ir.expressions.IrCall
16+
import org.jetbrains.kotlin.ir.expressions.IrStatementOrigin
817
import org.jetbrains.kotlin.ir.symbols.IrClassSymbol
18+
import org.jetbrains.kotlin.ir.symbols.IrSimpleFunctionSymbol
19+
import org.jetbrains.kotlin.ir.types.IrType
20+
import org.jetbrains.kotlin.ir.types.impl.IrErrorClassImpl.modality
21+
import org.jetbrains.kotlin.ir.util.copyTo
22+
import org.jetbrains.kotlin.name.CallableId
923
import org.jetbrains.kotlin.name.ClassId
1024
import org.jetbrains.kotlin.name.FqName
25+
import org.jetbrains.kotlin.name.Name
1126
import org.jetbrains.kotlin.platform.TargetPlatform
1227
import org.jetbrains.kotlin.platform.isJs
1328

@@ -16,6 +31,14 @@ object VersionSpecificApiImpl : VersionSpecificApi {
1631
return platform.isJs()
1732
}
1833

34+
override var IrFieldBuilder.modalityVS: Modality
35+
get() = modality
36+
set(value) { modality = value }
37+
38+
override var IrCall.originVS: IrStatementOrigin?
39+
get() = origin
40+
set(value) { origin = value }
41+
1942
override fun referenceClass(context: IrPluginContext, packageName: String, name: String): IrClassSymbol? {
2043
return context.referenceClass(
2144
ClassId(
@@ -25,4 +48,25 @@ object VersionSpecificApiImpl : VersionSpecificApi {
2548
)
2649
)
2750
}
51+
52+
override fun referenceFunctions(
53+
context: IrPluginContext,
54+
packageName: String,
55+
name: String
56+
): Collection<IrSimpleFunctionSymbol> {
57+
return context.referenceFunctions(
58+
CallableId(
59+
FqName(packageName),
60+
Name.identifier(name),
61+
)
62+
)
63+
}
64+
65+
override fun IrValueParameter.copyToVS(irFunction: IrFunction, origin: IrDeclarationOrigin): IrValueParameter {
66+
return copyTo(irFunction, origin)
67+
}
68+
69+
override fun IrSimpleFunction.addExtensionReceiverVS(type: IrType, origin: IrDeclarationOrigin): IrValueParameter {
70+
return addExtensionReceiver(type, origin)
71+
}
2872
}

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

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

77
import org.jetbrains.kotlin.backend.common.extensions.IrPluginContext
8+
import org.jetbrains.kotlin.descriptors.Modality
9+
import org.jetbrains.kotlin.ir.builders.declarations.IrFieldBuilder
10+
import org.jetbrains.kotlin.ir.declarations.IrDeclarationOrigin
11+
import org.jetbrains.kotlin.ir.declarations.IrFunction
12+
import org.jetbrains.kotlin.ir.declarations.IrSimpleFunction
13+
import org.jetbrains.kotlin.ir.declarations.IrValueParameter
14+
import org.jetbrains.kotlin.ir.expressions.IrCall
15+
import org.jetbrains.kotlin.ir.expressions.IrStatementOrigin
816
import org.jetbrains.kotlin.ir.symbols.IrClassSymbol
17+
import org.jetbrains.kotlin.ir.symbols.IrSimpleFunctionSymbol
18+
import org.jetbrains.kotlin.ir.types.IrType
919
import org.jetbrains.kotlin.platform.TargetPlatform
1020

1121
interface VersionSpecificApi {
1222
fun isJs(platform: TargetPlatform?): Boolean
1323

1424
fun referenceClass(context: IrPluginContext, packageName: String, name: String): IrClassSymbol?
1525

26+
fun referenceFunctions(
27+
context: IrPluginContext,
28+
packageName: String,
29+
name: String,
30+
): Collection<IrSimpleFunctionSymbol>
31+
32+
fun IrValueParameter.copyToVS(
33+
irFunction: IrFunction,
34+
origin: IrDeclarationOrigin = this.origin,
35+
): IrValueParameter
36+
37+
fun IrSimpleFunction.addExtensionReceiverVS(
38+
type: IrType,
39+
origin: IrDeclarationOrigin = IrDeclarationOrigin.DEFINED,
40+
): IrValueParameter
41+
42+
var IrFieldBuilder.modalityVS: Modality
43+
44+
var IrCall.originVS: IrStatementOrigin?
45+
1646
companion object {
1747
lateinit var INSTANCE: VersionSpecificApi
1848
}
1949
}
50+
51+
@Suppress("unused")
52+
fun undefinedAPI(): Nothing = error("This API is not defined in current Kotlin version")

0 commit comments

Comments
 (0)