Skip to content

Commit

Permalink
Update project for K1 usage
Browse files Browse the repository at this point in the history
  • Loading branch information
Mr3zee committed Aug 8, 2024
1 parent 4e388ec commit 11fea9e
Show file tree
Hide file tree
Showing 29 changed files with 215 additions and 270 deletions.
4 changes: 4 additions & 0 deletions compiler-plugin/compiler-plugin-backend/build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,10 @@ plugins {

kotlin {
explicitApi = ExplicitApiMode.Disabled

sourceSets.all {
languageSettings.optIn("org.jetbrains.kotlin.ir.symbols.UnsafeDuringIrConstructionAPI")
}
}

dependencies {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,10 +6,7 @@ package kotlinx.rpc.codegen

import org.jetbrains.kotlin.backend.common.extensions.IrPluginContext
import org.jetbrains.kotlin.ir.builders.declarations.IrFieldBuilder
import org.jetbrains.kotlin.ir.declarations.IrDeclarationOrigin
import org.jetbrains.kotlin.ir.declarations.IrFunction
import org.jetbrains.kotlin.ir.declarations.IrSimpleFunction
import org.jetbrains.kotlin.ir.declarations.IrValueParameter
import org.jetbrains.kotlin.ir.declarations.*
import org.jetbrains.kotlin.ir.expressions.IrCall
import org.jetbrains.kotlin.ir.expressions.IrStatementOrigin
import org.jetbrains.kotlin.ir.symbols.IrClassSymbol
Expand Down Expand Up @@ -42,6 +39,8 @@ interface VersionSpecificApi {

var IrCall.originVS: IrStatementOrigin?

var IrConstructor.isPrimaryVS: Boolean

companion object {
lateinit var INSTANCE: VersionSpecificApi
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,18 +2,16 @@
* Copyright 2023-2024 JetBrains s.r.o and contributors. Use of this source code is governed by the Apache 2.0 license.
*/

@file:OptIn(UnsafeDuringIrConstructionAPI::class)

package kotlinx.rpc.codegen.extension

import kotlinx.rpc.codegen.common.RpcNames
import org.jetbrains.kotlin.ir.declarations.IrClass
import org.jetbrains.kotlin.ir.declarations.IrDeclaration
import org.jetbrains.kotlin.ir.declarations.IrProperty
import org.jetbrains.kotlin.ir.declarations.IrSimpleFunction
import org.jetbrains.kotlin.ir.symbols.UnsafeDuringIrConstructionAPI
import org.jetbrains.kotlin.ir.types.classOrNull
import org.jetbrains.kotlin.ir.util.dumpKotlinLike
import org.jetbrains.kotlin.ir.util.packageFqName

/**
* This class scans user declared RPC service
Expand Down Expand Up @@ -73,8 +71,15 @@ internal object RPCDeclarationScanner {
}
}

val packageName = service.packageFqName?.asString()
?: error("Expected package name of the ${service.name.asString()}")

val stubClassNotNull = stubClass
?: error("Expected ${RpcNames.SERVICE_STUB_NAME} nested declaration in ${service.name}")
// only for KSP generation
?: ctx.getIrClassSymbol(
packageName = packageName,
name = "${service.name.asString()}${RpcNames.SERVICE_STUB_NAME_KSP.asString()}"
).owner

return ServiceDeclaration(
service = service,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -242,7 +242,7 @@ internal class RPCIrContext(
return getIrClassSymbol("kotlinx.rpc$suffix", name)
}

private fun getIrClassSymbol(packageName: String, name: String): IrClassSymbol {
fun getIrClassSymbol(packageName: String, name: String): IrClassSymbol {
return versionSpecificApi.referenceClass(pluginContext, packageName, name)
?: error("Unable to find symbol. Package: $packageName, name: $name")
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,12 +2,11 @@
* Copyright 2023-2024 JetBrains s.r.o and contributors. Use of this source code is governed by the Apache 2.0 license.
*/

@file:OptIn(UnsafeDuringIrConstructionAPI::class)

package kotlinx.rpc.codegen.extension

import kotlinx.rpc.codegen.VersionSpecificApi
import kotlinx.rpc.codegen.common.rpcMethodClassName
import kotlinx.rpc.codegen.common.rpcMethodClassNameKsp
import org.jetbrains.kotlin.backend.common.lower.DeclarationIrBuilder
import org.jetbrains.kotlin.backend.jvm.functionByName
import org.jetbrains.kotlin.cli.common.messages.MessageCollector
Expand All @@ -25,7 +24,6 @@ import org.jetbrains.kotlin.ir.expressions.impl.*
import org.jetbrains.kotlin.ir.symbols.IrClassSymbol
import org.jetbrains.kotlin.ir.symbols.IrSymbol
import org.jetbrains.kotlin.ir.symbols.IrValueSymbol
import org.jetbrains.kotlin.ir.symbols.UnsafeDuringIrConstructionAPI
import org.jetbrains.kotlin.ir.types.*
import org.jetbrains.kotlin.ir.util.*
import org.jetbrains.kotlin.name.Name
Expand Down Expand Up @@ -175,7 +173,7 @@ internal class RPCStubGenerator(
addBackingFieldUtil {
visibility = DescriptorVisibilities.PRIVATE
type = propertyType
isFinal = true
vsApi { isFinalVS = true }
}.apply {
initializer = factory.createExpressionBody(
IrGetValueImpl(
Expand Down Expand Up @@ -214,7 +212,7 @@ internal class RPCStubGenerator(
addBackingFieldUtil {
visibility = DescriptorVisibilities.PRIVATE
type = ctx.coroutineContext.defaultType
isFinal = true
vsApi { isFinalVS = true }
}.apply {
val coroutineContextClass = ctx.coroutineContext.owner

Expand Down Expand Up @@ -280,7 +278,6 @@ internal class RPCStubGenerator(
"detekt.NestedBlockDepth",
"detekt.LongMethod",
"detekt.CyclomaticComplexMethod",
"detekt.MagicNumber",
)
private fun IrClass.rpcFlowField(field: ServiceDeclaration.FlowField) {
val isLazy = !field.property.hasAnnotation(ctx.rpcEagerFieldAnnotation)
Expand Down Expand Up @@ -362,7 +359,7 @@ internal class RPCStubGenerator(
addBackingFieldUtil {
type = fieldType
visibility = DescriptorVisibilities.PRIVATE
isFinal = true
vsApi { isFinalVS = true }
}.apply {
initializer = factory.createExpressionBody(registerCall)
}
Expand All @@ -379,7 +376,7 @@ internal class RPCStubGenerator(
name = propertyDelegateName(this@apply.name)
visibility = DescriptorVisibilities.PRIVATE
type = lazyFieldType
isFinal = true
vsApi { isFinalVS = true }
}.apply {
val propertyDelegate = this

Expand Down Expand Up @@ -539,7 +536,8 @@ internal class RPCStubGenerator(
val isMethodObject = method.arguments.isEmpty()

val methodClassName = method.function.name.rpcMethodClassName
val methodClass: IrClass = initiateAndGetMethodClass(methodClassName, method)
val methodClassNameKsp = method.function.name.rpcMethodClassNameKsp
val methodClass: IrClass = initiateAndGetMethodClass(methodClassName, methodClassNameKsp, method)

addFunction {
name = method.function.name
Expand Down Expand Up @@ -653,17 +651,22 @@ internal class RPCStubGenerator(
* }
* ```
*/
private fun IrClass.initiateAndGetMethodClass(methodClassName: Name, method: ServiceDeclaration.Method): IrClass {
val methodClass = findDeclaration<IrClass> { it.name == methodClassName }
?: error(
"Expected $methodClassName class to be present in stub class " +
"${declaration.service.name}${declaration.stubClass.name}"
)
private fun IrClass.initiateAndGetMethodClass(
methodClassName: Name,
methodClassNameKsp: Name,
method: ServiceDeclaration.Method
): IrClass {
val methodClass = findDeclaration<IrClass> {
it.name == methodClassName || it.name == methodClassNameKsp
} ?: error(
"Expected $methodClassName or $methodClassNameKsp class to be present in stub class " +
"${declaration.service.name}${declaration.stubClass.name}"
)

methodClasses.add(methodClass)

val methodClassThisReceiver = methodClass.thisReceiver
?: error("Expected $methodClassName of ${declaration.stubClass.name} to have a thisReceiver")
?: error("Expected ${methodClass.name} of ${declaration.stubClass.name} to have a thisReceiver")

val properties = if (methodClass.isClass) {
val argNames = method.arguments.memoryOptimizedMap { it.value.name }.toSet()
Expand All @@ -677,7 +680,7 @@ internal class RPCStubGenerator(
method.arguments.size == it.valueParameters.size
}

constructor.isPrimary = true
vsApi { constructor.isPrimaryVS = true }
methodClass.addDefaultConstructor(constructor)

constructor.valueParameters.memoryOptimizedMap { valueParam ->
Expand Down Expand Up @@ -754,10 +757,7 @@ internal class RPCStubGenerator(
* ))
* ```
*/
@Suppress(
"detekt.NestedBlockDepth",
"detekt.MagicNumber",
)
@Suppress("detekt.NestedBlockDepth")
private fun IrBlockBodyBuilder.irRpcMethodClientCall(
method: ServiceDeclaration.Method,
functionThisReceiver: IrValueParameter,
Expand Down Expand Up @@ -970,7 +970,6 @@ internal class RPCStubGenerator(

addBackingFieldUtil {
type = mapType
isFinal = true
vsApi { isFinalVS = true }
visibility = DescriptorVisibilities.PRIVATE
}.apply {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,10 +7,7 @@ package kotlinx.rpc.codegen
import org.jetbrains.kotlin.backend.common.extensions.IrPluginContext
import org.jetbrains.kotlin.backend.common.ir.addExtensionReceiver
import org.jetbrains.kotlin.ir.builders.declarations.IrFieldBuilder
import org.jetbrains.kotlin.ir.declarations.IrDeclarationOrigin
import org.jetbrains.kotlin.ir.declarations.IrFunction
import org.jetbrains.kotlin.ir.declarations.IrSimpleFunction
import org.jetbrains.kotlin.ir.declarations.IrValueParameter
import org.jetbrains.kotlin.ir.declarations.*
import org.jetbrains.kotlin.ir.expressions.IrCall
import org.jetbrains.kotlin.ir.expressions.IrStatementOrigin
import org.jetbrains.kotlin.ir.symbols.IrClassSymbol
Expand Down Expand Up @@ -39,6 +36,12 @@ object VersionSpecificApiImpl : VersionSpecificApi {
get() = origin
set(value) { origin = value }

override var IrConstructor.isPrimaryVS: Boolean
get() = isPrimary
set(value) {
isPrimary = value
}

override fun referenceClass(context: IrPluginContext, packageName: String, name: String): IrClassSymbol? {
return context.referenceClass(
ClassId(
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,13 +6,9 @@ package kotlinx.rpc.codegen

import org.jetbrains.kotlin.backend.common.extensions.IrPluginContext
import org.jetbrains.kotlin.backend.common.ir.copyTo
import org.jetbrains.kotlin.descriptors.Modality
import org.jetbrains.kotlin.ir.builders.declarations.IrFieldBuilder
import org.jetbrains.kotlin.ir.builders.declarations.addExtensionReceiver
import org.jetbrains.kotlin.ir.declarations.IrDeclarationOrigin
import org.jetbrains.kotlin.ir.declarations.IrFunction
import org.jetbrains.kotlin.ir.declarations.IrSimpleFunction
import org.jetbrains.kotlin.ir.declarations.IrValueParameter
import org.jetbrains.kotlin.ir.declarations.*
import org.jetbrains.kotlin.ir.expressions.IrCall
import org.jetbrains.kotlin.ir.expressions.IrStatementOrigin
import org.jetbrains.kotlin.ir.symbols.IrClassSymbol
Expand All @@ -34,6 +30,10 @@ object VersionSpecificApiImpl : VersionSpecificApi {
get() = origin
set(_) {}

override var IrConstructor.isPrimaryVS: Boolean
get() = isPrimary
set(_) {}

override fun referenceClass(context: IrPluginContext, packageName: String, name: String): IrClassSymbol? {
return context.referenceClass(FqName("$packageName.$name"))
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,12 +6,8 @@ package kotlinx.rpc.codegen

import org.jetbrains.kotlin.backend.common.extensions.IrPluginContext
import org.jetbrains.kotlin.backend.common.ir.addExtensionReceiver
import org.jetbrains.kotlin.descriptors.Modality
import org.jetbrains.kotlin.ir.builders.declarations.IrFieldBuilder
import org.jetbrains.kotlin.ir.declarations.IrDeclarationOrigin
import org.jetbrains.kotlin.ir.declarations.IrFunction
import org.jetbrains.kotlin.ir.declarations.IrSimpleFunction
import org.jetbrains.kotlin.ir.declarations.IrValueParameter
import org.jetbrains.kotlin.ir.declarations.*
import org.jetbrains.kotlin.ir.expressions.IrCall
import org.jetbrains.kotlin.ir.expressions.IrStatementOrigin
import org.jetbrains.kotlin.ir.symbols.IrClassSymbol
Expand All @@ -37,6 +33,10 @@ object VersionSpecificApiImpl : VersionSpecificApi {
get() = origin
set(_) {}

override var IrConstructor.isPrimaryVS: Boolean
get() = isPrimary
set(_) {}

override fun referenceClass(context: IrPluginContext, packageName: String, name: String): IrClassSymbol? {
return context.referenceClass(
ClassId(
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,10 +8,7 @@ import org.jetbrains.kotlin.backend.common.extensions.IrPluginContext
import org.jetbrains.kotlin.backend.common.ir.addExtensionReceiver
import org.jetbrains.kotlin.descriptors.Modality
import org.jetbrains.kotlin.ir.builders.declarations.IrFieldBuilder
import org.jetbrains.kotlin.ir.declarations.IrDeclarationOrigin
import org.jetbrains.kotlin.ir.declarations.IrFunction
import org.jetbrains.kotlin.ir.declarations.IrSimpleFunction
import org.jetbrains.kotlin.ir.declarations.IrValueParameter
import org.jetbrains.kotlin.ir.declarations.*
import org.jetbrains.kotlin.ir.expressions.IrCall
import org.jetbrains.kotlin.ir.expressions.IrStatementOrigin
import org.jetbrains.kotlin.ir.symbols.IrClassSymbol
Expand All @@ -37,6 +34,10 @@ object VersionSpecificApiImpl : VersionSpecificApi {
get() = origin
set(_) {}

override var IrConstructor.isPrimaryVS: Boolean
get() = isPrimary
set(_) {}

override fun referenceClass(context: IrPluginContext, packageName: String, name: String): IrClassSymbol? {
return context.referenceClass(
ClassId(
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,15 +8,13 @@ import org.jetbrains.kotlin.backend.common.extensions.IrPluginContext
import org.jetbrains.kotlin.backend.common.ir.addExtensionReceiver
import org.jetbrains.kotlin.descriptors.Modality
import org.jetbrains.kotlin.ir.builders.declarations.IrFieldBuilder
import org.jetbrains.kotlin.ir.declarations.IrDeclarationOrigin
import org.jetbrains.kotlin.ir.declarations.IrFunction
import org.jetbrains.kotlin.ir.declarations.IrSimpleFunction
import org.jetbrains.kotlin.ir.declarations.IrValueParameter
import org.jetbrains.kotlin.ir.declarations.*
import org.jetbrains.kotlin.ir.expressions.IrCall
import org.jetbrains.kotlin.ir.expressions.IrStatementOrigin
import org.jetbrains.kotlin.ir.symbols.IrClassSymbol
import org.jetbrains.kotlin.ir.symbols.IrSimpleFunctionSymbol
import org.jetbrains.kotlin.ir.types.IrType
import org.jetbrains.kotlin.ir.types.impl.IrErrorClassImpl.modality
import org.jetbrains.kotlin.ir.util.copyTo
import org.jetbrains.kotlin.name.CallableId
import org.jetbrains.kotlin.name.ClassId
Expand All @@ -40,6 +38,12 @@ object VersionSpecificApiImpl : VersionSpecificApi {
get() = origin
set(value) { origin = value }

override var IrConstructor.isPrimaryVS: Boolean
get() = isPrimary
set(value) {
isPrimary = value
}

override fun referenceClass(context: IrPluginContext, packageName: String, name: String): IrClassSymbol? {
return context.referenceClass(
ClassId(
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -21,9 +21,12 @@ object ClassDeclarations {

object RpcNames {
val SERVICE_STUB_NAME: Name = Name.identifier("\$rpcServiceStub")
val SERVICE_STUB_NAME_KSP: Name = Name.identifier("_rpcServiceStub")

const val METHOD_CLASS_NAME_SUFFIX = "\$rpcMethod"
const val METHOD_CLASS_NAME_SUFFIX_KSP = "_rpcMethod"
}

val Name.rpcMethodClassName: Name get() = Name.identifier("$identifier${RpcNames.METHOD_CLASS_NAME_SUFFIX}")
val Name.rpcMethodClassNameKsp: Name get() = Name.identifier("$identifier${RpcNames.METHOD_CLASS_NAME_SUFFIX_KSP}")
val Name.rpcMethodName: Name get() = Name.identifier(identifier.removeSuffix(RpcNames.METHOD_CLASS_NAME_SUFFIX))
10 changes: 6 additions & 4 deletions compiler-plugin/compiler-plugin-k2/build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,8 @@
*/

import org.jetbrains.kotlin.gradle.dsl.ExplicitApiMode
import util.enableContextReceivers
import util.whenKotlinIsAtLeast

plugins {
alias(libs.plugins.conventions.jvm)
Expand All @@ -12,13 +14,13 @@ plugins {
kotlin {
explicitApi = ExplicitApiMode.Disabled

compilerOptions {
freeCompilerArgs.add("-Xcontext-receivers")
}
enableContextReceivers()
}

dependencies {
compileOnly(libs.kotlin.compiler.embeddable)
compileOnly(libs.serialization.plugin)
project.whenKotlinIsAtLeast(2, 0) {
compileOnly(libs.serialization.plugin)
}
implementation(projects.compilerPluginCommon)
}
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,4 @@
* Copyright 2023-2024 JetBrains s.r.o and contributors. Use of this source code is governed by the Apache 2.0 license.
*/

@file:Suppress("detekt.MissingPackageDeclaration")

// do not delete
Loading

0 comments on commit 11fea9e

Please sign in to comment.