diff --git a/CHANGELOG.md b/CHANGELOG.md index 0701ec6..1ac67d8 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -14,6 +14,10 @@ ### Updated +- `org.jetbrains.kotlin:kotlin-gradle-plugin -> 2.3.20` +- `com.javiersc.kotlin:kotlin-compiler-test-extensions -> 0.13.0+2.3.20` +- `com.javiersc.kotlin:kotlin-compiler-gradle-extensions -> 0.13.0+2.3.20` +- `com.javiersc.kotlin:kotlin-compiler-extensions -> 0.13.0+2.3.20` - `gradle -> 9.4.0` ## [0.22.0+2.3.10] - 2026-02-07 diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index dd315a0..bb2fbe7 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -1,8 +1,8 @@ [versions] hubdle = "0.18.1" hubdleCatalog = "0.13.0" -javiersc-kotlin-compiler-extensions = "0.12.0+2.3.10" -jetbrains-kotlin = "2.3.10" +javiersc-kotlin-compiler-extensions = "0.13.0+2.3.20" +jetbrains-kotlin = "2.3.20" [libraries] hubdle-catalog = { module = "com.javiersc.hubdle:hubdle-version-catalog", version.ref = "hubdleCatalog" } diff --git a/kopy-compiler/main/kotlin/com/javiersc/kotlin/kopy/compiler/KopyCompilerPluginRegistrar.kt b/kopy-compiler/main/kotlin/com/javiersc/kotlin/kopy/compiler/KopyCompilerPluginRegistrar.kt index 71fc48e..471f411 100644 --- a/kopy-compiler/main/kotlin/com/javiersc/kotlin/kopy/compiler/KopyCompilerPluginRegistrar.kt +++ b/kopy-compiler/main/kotlin/com/javiersc/kotlin/kopy/compiler/KopyCompilerPluginRegistrar.kt @@ -20,6 +20,16 @@ public class KopyCompilerPluginRegistrar : CompilerPluginRegistrar() { } } +@JvmName("registerAllExtensionsJava") +context(extensionStorage: ExtensionStorage) +internal fun registerAllExtensions( + configuration: CompilerConfiguration, + onlyDiagnostics: Boolean, + additionalConfig: ExtensionStorage.() -> Unit = {}, +) { + extensionStorage.registerAllExtensions(configuration, onlyDiagnostics, additionalConfig) +} + internal fun ExtensionStorage.registerAllExtensions( configuration: CompilerConfiguration, onlyDiagnostics: Boolean, diff --git a/kopy-compiler/main/kotlin/com/javiersc/kotlin/kopy/compiler/fir/generation/FirKopyDeclarationGenerationExtension.kt b/kopy-compiler/main/kotlin/com/javiersc/kotlin/kopy/compiler/fir/generation/FirKopyDeclarationGenerationExtension.kt index 56d2629..d515130 100644 --- a/kopy-compiler/main/kotlin/com/javiersc/kotlin/kopy/compiler/fir/generation/FirKopyDeclarationGenerationExtension.kt +++ b/kopy-compiler/main/kotlin/com/javiersc/kotlin/kopy/compiler/fir/generation/FirKopyDeclarationGenerationExtension.kt @@ -36,8 +36,8 @@ import org.jetbrains.kotlin.descriptors.Modality import org.jetbrains.kotlin.descriptors.Visibilities import org.jetbrains.kotlin.descriptors.Visibility import org.jetbrains.kotlin.fir.FirSession +import org.jetbrains.kotlin.fir.declarations.FirNamedFunction import org.jetbrains.kotlin.fir.declarations.FirProperty -import org.jetbrains.kotlin.fir.declarations.FirSimpleFunction import org.jetbrains.kotlin.fir.declarations.hasAnnotation import org.jetbrains.kotlin.fir.declarations.primaryConstructorIfAny import org.jetbrains.kotlin.fir.declarations.utils.isData @@ -147,7 +147,7 @@ internal class FirKopyDeclarationGenerationExtension( .apply { addTransientAnnotationIfOwnedBySerializable(owner = owner) replaceInitializer( - buildErrorExpression { diagnostic = KopyConeTemporalDiagnostic } + buildErrorExpression { diagnostic = KopyConeTemporalDiagnostic }, ) } return listOf(atomicProperty.symbol) @@ -226,7 +226,7 @@ internal class FirKopyDeclarationGenerationExtension( owner: FirClassSymbol<*>, ): FirNamedFunctionSymbol? { if (callableId.callableName != setName) return null - val setFunction: FirSimpleFunction = + val setFunction: FirNamedFunction = createMemberFunction( owner = owner, key = Key, @@ -258,7 +258,7 @@ internal class FirKopyDeclarationGenerationExtension( listOfNotNull( createAnnotation(kopyOptInClassId), createAnnotation(kopyFunctionSetClassId), - ) + ), ) } return setFunction.symbol @@ -270,7 +270,7 @@ internal class FirKopyDeclarationGenerationExtension( ): FirNamedFunctionSymbol? { if (callableId.callableName != updateName) return null - val updateFunction: FirSimpleFunction = + val updateFunction: FirNamedFunction = createMemberFunction( owner = owner, key = Key, @@ -312,7 +312,7 @@ internal class FirKopyDeclarationGenerationExtension( listOfNotNull( createAnnotation(kopyOptInClassId), createAnnotation(kopyFunctionUpdateClassId), - ) + ), ) } return updateFunction.symbol @@ -330,7 +330,7 @@ internal class FirKopyDeclarationGenerationExtension( val iterableType: ConeClassLikeType = (iterableClass.toFirTypeRef().coneType as ConeClassLikeType).withArguments { it.type!! } - val updateEachFunction: FirSimpleFunction = + val updateEachFunction: FirNamedFunction = createMemberFunction( owner = owner, key = Key, @@ -369,7 +369,7 @@ internal class FirKopyDeclarationGenerationExtension( listOfNotNull( createAnnotation(kopyOptInClassId), createAnnotation(kopyFunctionUpdateEachClassId), - ) + ), ) } return updateEachFunction.symbol @@ -390,7 +390,7 @@ internal class FirKopyDeclarationGenerationExtension( .substituteOrSelf(function1Type) .withAttributes(ConeAttributes.WithExtensionFunctionType) - val copyFunction: FirSimpleFunction = + val copyFunction: FirNamedFunction = createMemberFunction( owner = owner, key = Key, @@ -414,7 +414,7 @@ internal class FirKopyDeclarationGenerationExtension( listOfNotNull( createAnnotation(kopyOptInClassId), createCopyOrInvokeAnnotation(callableId), - ) + ), ) } return copyFunction.symbol diff --git a/kopy-compiler/main/kotlin/com/javiersc/kotlin/kopy/compiler/ir/transformers/IrAtomicPropertyTransformer.kt b/kopy-compiler/main/kotlin/com/javiersc/kotlin/kopy/compiler/ir/transformers/IrAtomicPropertyTransformer.kt index 4652834..0f6340d 100644 --- a/kopy-compiler/main/kotlin/com/javiersc/kotlin/kopy/compiler/ir/transformers/IrAtomicPropertyTransformer.kt +++ b/kopy-compiler/main/kotlin/com/javiersc/kotlin/kopy/compiler/ir/transformers/IrAtomicPropertyTransformer.kt @@ -1,6 +1,7 @@ package com.javiersc.kotlin.kopy.compiler.ir.transformers -import com.javiersc.kotlin.compiler.extensions.ir.declarationIrBuilder +import com.javiersc.kotlin.compiler.extensions.ir.DeclarationIrBuilder +import com.javiersc.kotlin.compiler.extensions.ir.firstIrClassSymbolOrNull import com.javiersc.kotlin.kopy.compiler.atomicReferenceClassId import com.javiersc.kotlin.kopy.compiler.underscoreAtomicName import org.jetbrains.kotlin.backend.common.IrElementTransformerVoidWithContext @@ -28,34 +29,36 @@ internal class IrAtomicPropertyTransformer( private val pluginContext: IrPluginContext, ) : IrElementTransformerVoidWithContext() { - override fun visitPropertyNew(declaration: IrProperty): IrStatement { - fun originalProp(): IrStatement = super.visitPropertyNew(declaration) - if (declaration.name != underscoreAtomicName) return originalProp() - val atomicReference: IrClassSymbol = - pluginContext.referenceClass(atomicReferenceClassId) ?: return originalProp() + override fun visitPropertyNew(declaration: IrProperty): IrStatement = + context(pluginContext) { + fun originalProp(): IrStatement = super.visitPropertyNew(declaration) + if (declaration.name != underscoreAtomicName) return originalProp() + val atomicReference: IrClassSymbol = + firstIrClassSymbolOrNull(atomicReferenceClassId) ?: return originalProp() - val atomicReferenceConstructor: IrConstructor = - atomicReference.owner.primaryConstructor ?: return originalProp() + val atomicReferenceConstructor: IrConstructor = + atomicReference.owner.primaryConstructor ?: return originalProp() - val atomicInitializer: IrExpressionBody = - pluginContext.declarationIrBuilder(declaration).run { - val parentClass: IrClass = declaration.parentAsClass - val typeArg: IrSimpleType = parentClass.defaultType - val thisReceiver: IrValueParameter = parentClass.thisReceiver!! - val thisGet: IrGetValue = irGet(thisReceiver) - val atomicReferenceConstructorCall: IrConstructorCall = - irCallConstructor( - callee = atomicReferenceConstructor.symbol, - typeArguments = listOf(typeArg), - ) - .apply { - val index: Int = thisReceiver.indexInParameters.takeIf { it >= 0 } ?: 0 - arguments[index] = thisGet - } - irExprBody(atomicReferenceConstructorCall) - } - declaration.backingField?.initializer = atomicInitializer + val atomicInitializer: IrExpressionBody = + DeclarationIrBuilder(declaration).run { + val parentClass: IrClass = declaration.parentAsClass + val typeArg: IrSimpleType = parentClass.defaultType + val thisReceiver: IrValueParameter = parentClass.thisReceiver!! + val thisGet: IrGetValue = irGet(thisReceiver) + val atomicReferenceConstructorCall: IrConstructorCall = + irCallConstructor( + callee = atomicReferenceConstructor.symbol, + typeArguments = listOf(typeArg), + ) + .apply { + val index: Int = + thisReceiver.indexInParameters.takeIf { it >= 0 } ?: 0 + arguments[index] = thisGet + } + irExprBody(atomicReferenceConstructorCall) + } + declaration.backingField?.initializer = atomicInitializer - return declaration - } + return declaration + } } diff --git a/kopy-compiler/main/kotlin/com/javiersc/kotlin/kopy/compiler/ir/transformers/IrFunctionsTransformer.kt b/kopy-compiler/main/kotlin/com/javiersc/kotlin/kopy/compiler/ir/transformers/IrFunctionsTransformer.kt index 8f4a8a2..2c5c6f0 100644 --- a/kopy-compiler/main/kotlin/com/javiersc/kotlin/kopy/compiler/ir/transformers/IrFunctionsTransformer.kt +++ b/kopy-compiler/main/kotlin/com/javiersc/kotlin/kopy/compiler/ir/transformers/IrFunctionsTransformer.kt @@ -2,8 +2,8 @@ package com.javiersc.kotlin.kopy.compiler.ir.transformers +import com.javiersc.kotlin.compiler.extensions.ir.DeclarationIrBuilder import com.javiersc.kotlin.compiler.extensions.ir.asIr -import com.javiersc.kotlin.compiler.extensions.ir.declarationIrBuilder import com.javiersc.kotlin.compiler.extensions.ir.extensionReceiver import com.javiersc.kotlin.compiler.extensions.ir.firstIrClass import com.javiersc.kotlin.compiler.extensions.ir.regularParameters @@ -76,20 +76,23 @@ internal class IrFunctionsTransformer( override fun visitSimpleFunction(declaration: IrSimpleFunction): IrStatement { fun originalFunction(): IrStatement = super.visitSimpleFunction(declaration) - return when { - declaration.isKopyCopyOrInvoke -> transformCopyOrInvokeFunction(declaration) - declaration.isKopySet -> transformSetFunction(declaration) - declaration.isKopyUpdate -> transformUpdateFunction(declaration) - declaration.isKopyUpdateEach -> transformUpdateEachFunction(declaration) - runCatching { declaration.parentAsClass }.isFailure -> originalFunction() - !declaration.parentAsClass.isData -> originalFunction() - else -> originalFunction() + return context(pluginContext) { + when { + declaration.isKopyCopyOrInvoke -> transformCopyOrInvokeFunction(declaration) + declaration.isKopySet -> transformSetFunction(declaration) + declaration.isKopyUpdate -> transformUpdateFunction(declaration) + declaration.isKopyUpdateEach -> transformUpdateEachFunction(declaration) + runCatching { declaration.parentAsClass }.isFailure -> originalFunction() + !declaration.parentAsClass.isData -> originalFunction() + else -> originalFunction() + } } } + context(context: IrPluginContext) private fun transformCopyOrInvokeFunction(declaration: IrSimpleFunction): IrSimpleFunction { declaration.body = - pluginContext.declarationIrBuilder(declaration.symbol).irBlockBody { + DeclarationIrBuilder(declaration.symbol).irBlockBody { val thisCopyIrVariable: IrVariable = thisCopyIrVariable(declaration) +copyCall(declaration, thisCopyIrVariable) +atomicValueIrReturn(declaration, thisCopyIrVariable) @@ -97,13 +100,13 @@ internal class IrFunctionsTransformer( return declaration } + context(context: IrPluginContext) private fun transformSetFunction(declaration: IrSimpleFunction): IrSimpleFunction { val function: IrSimpleFunction = declaration.apply { body = - pluginContext.declarationIrBuilder(declaration.symbol).irBlockBody { - val unitClass: IrClassSymbol = - pluginContext.irBuiltIns.unitClass.owner.symbol + DeclarationIrBuilder(declaration.symbol).irBlockBody { + val unitClass: IrClassSymbol = context.irBuiltIns.unitClass.owner.symbol val unitCall: IrGetObjectValue = irGetObject(unitClass) val irReturn: IrReturn = irReturn(unitCall) +irReturn @@ -112,11 +115,12 @@ internal class IrFunctionsTransformer( return function } + context(context: IrPluginContext) private fun transformUpdateFunction(declaration: IrSimpleFunction): IrSimpleFunction { val function: IrSimpleFunction = declaration.apply { body = - pluginContext.declarationIrBuilder(declaration.symbol).irBlockBody { + DeclarationIrBuilder(declaration.symbol).irBlockBody { val thisGet: IrGetValue = irGet(extensionReceiver!!) val transformValueParameter: IrValueParameter = regularParameters.first() val func1Invoke: IrSimpleFunction = @@ -148,11 +152,12 @@ internal class IrFunctionsTransformer( return function } + context(context: IrPluginContext) private fun transformUpdateEachFunction(declaration: IrSimpleFunction): IrSimpleFunction { val function: IrSimpleFunction = declaration.apply { body = - pluginContext.declarationIrBuilder(declaration.symbol).irBlockBody { + DeclarationIrBuilder(declaration.symbol).irBlockBody { val thisGet: IrGetValue = irGet(extensionReceiver!!) val transformValueParameter: IrValueParameter = regularParameters.first() val transformParameterIndex: Int = @@ -220,11 +225,12 @@ internal class IrFunctionsTransformer( return copyCall } + context(context: IrPluginContext) private fun atomicValueIrReturn( declaration: IrSimpleFunction, thisCopyIrVariable: IrVariable, ): IrReturn = - pluginContext.declarationIrBuilder(declaration.symbol).run { + DeclarationIrBuilder(declaration.symbol).run { val thisCopyGetValue: IrGetValue = irGet(thisCopyIrVariable) val atomicProperty: IrProperty? = declaration.parent.asIr().findDeclaration { @@ -234,7 +240,7 @@ internal class IrFunctionsTransformer( val getAtomicCall = irCall(atomicProperty!!.getter!!).apply { dispatchReceiver = thisCopyGetValue } - val atomicReferenceClass: IrClass = pluginContext.firstIrClass(atomicReferenceClassId) + val atomicReferenceClass: IrClass = firstIrClass(atomicReferenceClassId) val atomicReferenceLoadFunction: IrFunction = atomicReferenceClass.findDeclaration { it.name == loadName }!! diff --git a/kopy-compiler/main/kotlin/com/javiersc/kotlin/kopy/compiler/ir/transformers/IrSetOrUpdateCallTransformer.kt b/kopy-compiler/main/kotlin/com/javiersc/kotlin/kopy/compiler/ir/transformers/IrSetOrUpdateCallTransformer.kt index 37302b8..5a7bfab 100644 --- a/kopy-compiler/main/kotlin/com/javiersc/kotlin/kopy/compiler/ir/transformers/IrSetOrUpdateCallTransformer.kt +++ b/kopy-compiler/main/kotlin/com/javiersc/kotlin/kopy/compiler/ir/transformers/IrSetOrUpdateCallTransformer.kt @@ -2,10 +2,10 @@ package com.javiersc.kotlin.kopy.compiler.ir.transformers +import com.javiersc.kotlin.compiler.extensions.ir.DeclarationIrBuilder import com.javiersc.kotlin.compiler.extensions.ir.asIr import com.javiersc.kotlin.compiler.extensions.ir.asIrOrNull import com.javiersc.kotlin.compiler.extensions.ir.createIrFunctionExpression -import com.javiersc.kotlin.compiler.extensions.ir.declarationIrBuilder import com.javiersc.kotlin.compiler.extensions.ir.extensionReceiverArgument import com.javiersc.kotlin.compiler.extensions.ir.filterIrIsInstance import com.javiersc.kotlin.compiler.extensions.ir.firstIrSimpleFunction @@ -104,7 +104,9 @@ internal class IrSetOrUpdateCallTransformer( expression.findDeclarationParent() ?: return original() if (parent != expressionCall.findDeclarationParent()) return original() val alsoCall: IrCall = - pluginContext.createAlsoCall(expressionCall, parent) ?: return original() + context(pluginContext) { + createAlsoCall(expressionCall, parent) ?: return original() + } val expressionWithAlsoCall: IrCall = alsoCall.also { it.insertExtensionReceiver(expression) } return expressionWithAlsoCall @@ -125,7 +127,9 @@ internal class IrSetOrUpdateCallTransformer( ?.function ?: return original() if (parent != updateLambda) return original() val alsoCall: IrCall = - pluginContext.createAlsoCall(expressionCall, parent) ?: return original() + context(pluginContext) { + createAlsoCall(expressionCall, parent) ?: return original() + } val value: IrExpression = expression.value val expressionWithAlsoCall: IrReturn = expression.also { irReturn -> @@ -135,7 +139,8 @@ internal class IrSetOrUpdateCallTransformer( } } - private fun IrPluginContext.createAlsoCall( + context(context: IrPluginContext) + private fun createAlsoCall( expression: IrCall, expressionParent: IrDeclarationParent, ): IrCall? { @@ -152,13 +157,13 @@ internal class IrSetOrUpdateCallTransformer( val alsoBlockFunctionExpression: IrFunctionExpression = createIrFunctionExpression( - type = irBuiltIns.run { functionN(1).typeWith(setOrUpdateType, unitType) }, + type = context.irBuiltIns.run { functionN(1).typeWith(setOrUpdateType, unitType) }, function = alsoBlockFunction, origin = IrStatementOrigin.LAMBDA, ) val alsoCall: IrCall = - declarationIrBuilder(alsoFunction.symbol).run { + DeclarationIrBuilder(alsoFunction.symbol).run { irCall(alsoFunction.symbol).also { it.patchDeclarationParents(expressionParent) it.type = setOrUpdateType @@ -173,6 +178,7 @@ internal class IrSetOrUpdateCallTransformer( private fun IrElement.findDeclarationParent(): IrDeclarationParent? = findDeclarationParent(moduleFragment)?.asIrOrNull() + context(context: IrPluginContext) private fun createAlsoBlockFunction( expressionParent: IrDeclarationParent, setOrUpdateType: IrType, @@ -194,7 +200,7 @@ internal class IrSetOrUpdateCallTransformer( } val alsoBodyBlock: IrBlockBody = - pluginContext.declarationIrBuilder(this.symbol).irBlockBody { + DeclarationIrBuilder(this.symbol).irBlockBody { val itValueParameter: IrValueParameter = regularParameters.first() val alsoItValueParameterGetValue: IrGetValue = irGet(itValueParameter) val copyChainCall: IrCall = @@ -202,7 +208,7 @@ internal class IrSetOrUpdateCallTransformer( ?: return null val atomicGetterStoreFunctionCall: IrCall = expression.createAtomicGetterStoreSetFunctionCall( - copyChainCall = copyChainCall + copyChainCall = copyChainCall, ) +atomicGetterStoreFunctionCall } @@ -212,6 +218,7 @@ internal class IrSetOrUpdateCallTransformer( return alsoBlockFunction } + context(context: IrPluginContext) private fun IrCall.createCopyChainCall(alsoItValueParameterGetValue: IrGetValue): IrCall? { val atomicGetterGetFunctionCall: IrCall = createAtomicGetterGetFunctionCall() val atomicRefType: IrSimpleType = atomicGetterGetFunctionCall.type.asIr() @@ -295,6 +302,7 @@ internal class IrSetOrUpdateCallTransformer( extract(extensionReceiver) } + context(context: IrPluginContext) private fun IrSymbol.createCopyCall( dataClass: IrClassSymbol, dispatchReceiver: IrExpression, @@ -302,7 +310,7 @@ internal class IrSetOrUpdateCallTransformer( argumentValue: IrExpression, ): IrCall? { val copyCall: IrCall? = - pluginContext.declarationIrBuilder(this).run { + DeclarationIrBuilder(this).run { val kotlinCopyFunctionSymbol: IrSimpleFunctionSymbol = dataClass.owner.functions .firstOrNull { @@ -323,6 +331,7 @@ internal class IrSetOrUpdateCallTransformer( return copyCall } + context(context: IrPluginContext) private fun IrCall.createAtomicGetterGetFunctionCall(): IrCall { val dispatchIrGetValue: IrGetValue = dispatchReceiver?.asIrOrNull()?.deepCopyWithSymbols() @@ -334,7 +343,7 @@ internal class IrSetOrUpdateCallTransformer( dispatchClass.getPropertyGetter("_atomic") ?: error("No function found") val getAtomicGetterFunctionCall: IrCall = - pluginContext.declarationIrBuilder(dispatchIrGetValue.symbol).run { + DeclarationIrBuilder(dispatchIrGetValue.symbol).run { irCall(atomicGetterFunction).apply { dispatchReceiver = dispatchIrGetValue type = atomicGetterFunction.owner.returnType @@ -347,7 +356,7 @@ internal class IrSetOrUpdateCallTransformer( ?: error("No function found") val atomicGetterGetFunctionCall: IrCall = - pluginContext.declarationIrBuilder(dispatchIrGetValue.symbol).run { + DeclarationIrBuilder(dispatchIrGetValue.symbol).run { irCall(atomicReferenceLoadFunction).apply { dispatchReceiver = getAtomicGetterFunctionCall type = dispatchIrGetValue.type @@ -358,6 +367,7 @@ internal class IrSetOrUpdateCallTransformer( return atomicGetterGetFunctionCall } + context(context: IrPluginContext) private fun IrCall.createAtomicGetterStoreSetFunctionCall(copyChainCall: IrCall): IrCall { val dispatchIrGetValue: IrGetValue = dispatchReceiver?.asIrOrNull()?.deepCopyWithSymbols() @@ -369,7 +379,7 @@ internal class IrSetOrUpdateCallTransformer( dispatchClass.getPropertyGetter("_atomic") ?: error("No function found") val atomicGetterFunctionCall: IrCall = - pluginContext.declarationIrBuilder(dispatchIrGetValue.symbol).run { + DeclarationIrBuilder(dispatchIrGetValue.symbol).run { irCall(atomicGetterFunction).apply { dispatchReceiver = dispatchIrGetValue type = atomicGetterFunction.owner.returnType @@ -382,7 +392,7 @@ internal class IrSetOrUpdateCallTransformer( ?: error("No function found") val atomicGetterStoreFunctionCall: IrCall = - pluginContext.declarationIrBuilder(dispatchIrGetValue.symbol).run { + DeclarationIrBuilder(dispatchIrGetValue.symbol).run { irCall(atomicGetterStoreFunction).apply { dispatchReceiver = atomicGetterFunctionCall type = atomicGetterStoreFunction.owner.returnType diff --git a/kopy-compiler/main/kotlin/com/javiersc/kotlin/kopy/compiler/ir/transformers/IrUpdateEachCallTransformer.kt b/kopy-compiler/main/kotlin/com/javiersc/kotlin/kopy/compiler/ir/transformers/IrUpdateEachCallTransformer.kt index 7398bd0..4113ceb 100644 --- a/kopy-compiler/main/kotlin/com/javiersc/kotlin/kopy/compiler/ir/transformers/IrUpdateEachCallTransformer.kt +++ b/kopy-compiler/main/kotlin/com/javiersc/kotlin/kopy/compiler/ir/transformers/IrUpdateEachCallTransformer.kt @@ -2,11 +2,11 @@ package com.javiersc.kotlin.kopy.compiler.ir.transformers +import com.javiersc.kotlin.compiler.extensions.ir.DeclarationIrBuilder import com.javiersc.kotlin.compiler.extensions.ir.asIrOrNull import com.javiersc.kotlin.compiler.extensions.ir.createIrBlockBody import com.javiersc.kotlin.compiler.extensions.ir.createIrFunctionExpression import com.javiersc.kotlin.compiler.extensions.ir.createLambdaIrSimpleFunction -import com.javiersc.kotlin.compiler.extensions.ir.declarationIrBuilder import com.javiersc.kotlin.compiler.extensions.ir.dispatchReceiverArgument import com.javiersc.kotlin.compiler.extensions.ir.extensionReceiver import com.javiersc.kotlin.compiler.extensions.ir.extensionReceiverArgument @@ -54,11 +54,12 @@ internal class IrUpdateEachCallTransformer( if (!expression.isKopyUpdateEach) return original() val updateCall: IrFunctionAccessExpression = - pluginContext.createUpdateCall(expression) ?: return original() + context(pluginContext) { createUpdateCall(expression) ?: return original() } return updateCall } - private fun IrPluginContext.createUpdateCall(expression: IrCall): IrFunctionAccessExpression? { + context(context: IrPluginContext) + private fun createUpdateCall(expression: IrCall): IrFunctionAccessExpression? { val updateFunctionSymbol: IrSimpleFunctionSymbol = expression.dispatchReceiver?.type?.classOrNull?.functions?.firstOrNull { it.owner.asIrOrNull()?.hasAnnotation(kopyFunctionUpdateFqName) == true @@ -67,14 +68,14 @@ internal class IrUpdateEachCallTransformer( val expressionExtensionReceiverType: IrType = expression.extensionReceiverArgument?.type ?: return null val kFunction1Type: IrType = - irBuiltIns + context.irBuiltIns .functionN(1) .typeWith(expressionExtensionReceiverType, expressionExtensionReceiverType) val expressionParent: IrDeclarationParent = expression.findDeclarationParent(moduleFragment)?.asIrOrNull() ?: return null val updateCall: IrFunctionAccessExpression = - declarationIrBuilder(updateFunction.symbol).irCall(updateFunction).also { + DeclarationIrBuilder(updateFunction.symbol).irCall(updateFunction).also { it.insertDispatchReceiver(expression.dispatchReceiverArgument) it.insertExtensionReceiver(expression.extensionReceiverArgument) it.type = expression.type @@ -98,17 +99,18 @@ internal class IrUpdateEachCallTransformer( val mapCall: IrFunctionAccessExpression = createMapCallToUpdateCall(expression, asIrCall) ?: return null lambda.body = createIrBlockBody { - this.statements.add(declarationIrBuilder(lambda.symbol).irReturn(mapCall)) + this.statements.add(DeclarationIrBuilder(lambda.symbol).irReturn(mapCall)) } } return updateCall } - private fun IrPluginContext.createMapCallToUpdateCall( + context(context: IrPluginContext) + private fun createMapCallToUpdateCall( expression: IrCall, updateCall: IrCall, ): IrFunctionAccessExpression? { - val mapFunction: IrSimpleFunction = iterableMapFunctionOrNull ?: return null + val mapFunction: IrSimpleFunction = context.iterableMapFunctionOrNull ?: return null val expressionLambda: IrFunctionExpression? = expression.regularArguments.firstOrNull().asIrOrNull() @@ -121,11 +123,11 @@ internal class IrUpdateEachCallTransformer( val mapCallType: IrType = itValueParameterFromUpdate.type val mapCall: IrFunctionAccessExpression = - declarationIrBuilder(mapFunction.symbol) + DeclarationIrBuilder(mapFunction.symbol) .irCall(callee = mapFunction.symbol, type = mapCallType) .also { it.insertExtensionReceiver( - declarationIrBuilder(it.symbol).irGet(itValueParameterFromUpdate) + DeclarationIrBuilder(it.symbol).irGet(itValueParameterFromUpdate), ) val typeArg: IrType = expression.typeArguments.first()!! it.typeArguments[0] = typeArg @@ -141,7 +143,7 @@ internal class IrUpdateEachCallTransformer( ?: return null val funcExp: IrFunctionExpression = createIrFunctionExpression( - type = irBuiltIns.functionN(1).typeWith(typeArg, typeArg), + type = context.irBuiltIns.functionN(1).typeWith(typeArg, typeArg), function = expressionLambdaFunction, origin = IrStatementOrigin.LAMBDA, ) @@ -152,7 +154,8 @@ internal class IrUpdateEachCallTransformer( private val IrPluginContext.iterableMapFunctionOrNull: IrSimpleFunction? get() = - referenceFunctions(mapCallableId) + finderForBuiltins() + .findFunctions(mapCallableId) .firstOrNull { val extensionReceiverClass: IrClassSymbol? = it.owner.extensionReceiver?.type?.classOrNull diff --git a/kopy-compiler/test/kotlin/com/javiersc/kotlin/kopy/compiler/GenerateKotlinCompilerTests.kt b/kopy-compiler/test/kotlin/com/javiersc/kotlin/kopy/compiler/GenerateKotlinCompilerTests.kt index d18d2ef..d5443dd 100644 --- a/kopy-compiler/test/kotlin/com/javiersc/kotlin/kopy/compiler/GenerateKotlinCompilerTests.kt +++ b/kopy-compiler/test/kotlin/com/javiersc/kotlin/kopy/compiler/GenerateKotlinCompilerTests.kt @@ -41,7 +41,8 @@ fun main() = generateTestGroupSuiteWithJUnit5 { open class AbstractDiagnosticTest : KopyDiagnosticTest() { - override fun ExtensionStorage.registerExtensions( + context(extensionStorage: ExtensionStorage) + override fun registerExtensions( module: TestModule, configuration: CompilerConfiguration, ) { @@ -54,7 +55,8 @@ open class AbstractBoxTest : JvmBoxTest() { override val runtimeClasspathProvider: Constructor = ::GeneratedMetaRuntimeClasspathProvider - override fun ExtensionStorage.registerExtensions( + context(extensionStorage: ExtensionStorage) + override fun registerExtensions( module: TestModule, configuration: CompilerConfiguration, ) { @@ -74,7 +76,8 @@ open class AbstractBoxTest : JvmBoxTest() { open class AbstractKopy0AutoDiagnosticTest : KopyDiagnosticTest() { - override fun ExtensionStorage.registerExtensions( + context(extensionStorage: ExtensionStorage) + override fun registerExtensions( module: TestModule, configuration: CompilerConfiguration, ) { @@ -85,7 +88,8 @@ open class AbstractKopy0AutoDiagnosticTest : KopyDiagnosticTest() { open class AbstractKopy1PublicDiagnosticTest : KopyDiagnosticTest() { - override fun ExtensionStorage.registerExtensions( + context(extensionStorage: ExtensionStorage) + override fun registerExtensions( module: TestModule, configuration: CompilerConfiguration, ) { @@ -96,7 +100,8 @@ open class AbstractKopy1PublicDiagnosticTest : KopyDiagnosticTest() { open class AbstractKopy2InternalDiagnosticTest : KopyDiagnosticTest() { - override fun ExtensionStorage.registerExtensions( + context(extensionStorage: ExtensionStorage) + override fun registerExtensions( module: TestModule, configuration: CompilerConfiguration, ) { @@ -107,7 +112,8 @@ open class AbstractKopy2InternalDiagnosticTest : KopyDiagnosticTest() { open class AbstractKopy3ProtectedDiagnosticTest : KopyDiagnosticTest() { - override fun ExtensionStorage.registerExtensions( + context(extensionStorage: ExtensionStorage) + override fun registerExtensions( module: TestModule, configuration: CompilerConfiguration, ) { @@ -118,7 +124,8 @@ open class AbstractKopy3ProtectedDiagnosticTest : KopyDiagnosticTest() { open class AbstractKopy4PrivateDiagnosticTest : KopyDiagnosticTest() { - override fun ExtensionStorage.registerExtensions( + context(extensionStorage: ExtensionStorage) + override fun registerExtensions( module: TestModule, configuration: CompilerConfiguration, ) { @@ -129,7 +136,8 @@ open class AbstractKopy4PrivateDiagnosticTest : KopyDiagnosticTest() { open class AbstractKopyAllDiagnosticTest : KopyDiagnosticTest() { - override fun ExtensionStorage.registerExtensions( + context(extensionStorage: ExtensionStorage) + override fun registerExtensions( module: TestModule, configuration: CompilerConfiguration, ) { @@ -140,7 +148,8 @@ open class AbstractKopyAllDiagnosticTest : KopyDiagnosticTest() { open class AbstractKopyCopyDiagnosticTest : KopyDiagnosticTest() { - override fun ExtensionStorage.registerExtensions( + context(extensionStorage: ExtensionStorage) + override fun registerExtensions( module: TestModule, configuration: CompilerConfiguration, ) { @@ -151,10 +160,8 @@ open class AbstractKopyCopyDiagnosticTest : KopyDiagnosticTest() { open class AbstractKopyInvokeDiagnosticTest : KopyDiagnosticTest() { - override fun ExtensionStorage.registerExtensions( - module: TestModule, - configuration: CompilerConfiguration, - ) { + context(extensionStorage: ExtensionStorage) + override fun registerExtensions(module: TestModule, configuration: CompilerConfiguration) { configuration.put(KopyKey.CopyFunctions, listOf(KopyCopyFunctions.Invoke)) registerAllExtensions(configuration = configuration, onlyDiagnostics = true) }