diff --git a/compiler/fir/fir2ir/tests-gen/org/jetbrains/kotlin/test/runners/codegen/FirBlackBoxCodegenTestGenerated.java b/compiler/fir/fir2ir/tests-gen/org/jetbrains/kotlin/test/runners/codegen/FirBlackBoxCodegenTestGenerated.java index 63d40073f5e..84acbf32568 100644 --- a/compiler/fir/fir2ir/tests-gen/org/jetbrains/kotlin/test/runners/codegen/FirBlackBoxCodegenTestGenerated.java +++ b/compiler/fir/fir2ir/tests-gen/org/jetbrains/kotlin/test/runners/codegen/FirBlackBoxCodegenTestGenerated.java @@ -15016,6 +15016,12 @@ public class FirBlackBoxCodegenTestGenerated extends AbstractFirBlackBoxCodegenT runTest("compiler/testData/codegen/box/delegatedProperty/delegateToFinalProperty/initializeContainerOfTopLevelProperties.kt"); } + @Test + @TestMetadata("kt54463_platformType.kt") + public void testKt54463_platformType() throws Exception { + runTest("compiler/testData/codegen/box/delegatedProperty/delegateToFinalProperty/kt54463_platformType.kt"); + } + @Test @TestMetadata("memberExtensionPropertyAndImportFromObject.kt") public void testMemberExtensionPropertyAndImportFromObject() throws Exception { diff --git a/compiler/ir/backend.jvm/lower/src/org/jetbrains/kotlin/backend/jvm/lower/SingletonOrConstantDelegationLowering.kt b/compiler/ir/backend.jvm/lower/src/org/jetbrains/kotlin/backend/jvm/lower/SingletonOrConstantDelegationLowering.kt index 907f19883a3..8265b9bdfa8 100644 --- a/compiler/ir/backend.jvm/lower/src/org/jetbrains/kotlin/backend/jvm/lower/SingletonOrConstantDelegationLowering.kt +++ b/compiler/ir/backend.jvm/lower/src/org/jetbrains/kotlin/backend/jvm/lower/SingletonOrConstantDelegationLowering.kt @@ -16,10 +16,7 @@ import org.jetbrains.kotlin.ir.declarations.* import org.jetbrains.kotlin.ir.expressions.* import org.jetbrains.kotlin.ir.symbols.impl.IrAnonymousInitializerSymbolImpl import org.jetbrains.kotlin.ir.util.* -import org.jetbrains.kotlin.ir.visitors.IrElementTransformer import org.jetbrains.kotlin.ir.visitors.IrElementTransformerVoid -import org.jetbrains.kotlin.name.Name -import org.jetbrains.kotlin.util.OperatorNameConventions internal val singletonOrConstantDelegationPhase = makeIrFilePhase( ::SingletonOrConstantDelegationLowering, @@ -47,22 +44,14 @@ private class SingletonOrConstantDelegationTransformer(val context: JvmBackendCo if (!isDelegated || isFakeOverride || backingField == null) return null val delegate = backingField?.initializer?.expression?.takeIf { it.isInlineable() } ?: return null val originalThis = parentAsClass.thisReceiver - val receiverMapper = object : IrElementTransformer> { - override fun visitCall(expression: IrCall, data: Pair): IrExpression { - val (name, newReceiver) = data - if (expression.symbol.owner.name == name) { - if ((expression.dispatchReceiver as? IrGetField)?.symbol == backingField?.symbol) { - expression.dispatchReceiver = newReceiver - } else if ((expression.extensionReceiver as? IrGetField)?.symbol == backingField?.symbol) { - expression.extensionReceiver = newReceiver - } - } - return expression - } + + class DelegateFieldAccessTransformer(val newReceiver: IrExpression) : IrElementTransformerVoid() { + override fun visitGetField(expression: IrGetField): IrExpression = + if (expression.symbol == backingField?.symbol) newReceiver else super.visitGetField(expression) } - getter?.transform(receiverMapper,OperatorNameConventions.GET_VALUE to delegate.remapReceiver(originalThis, getter?.dispatchReceiverParameter)) - setter?.transform(receiverMapper,OperatorNameConventions.SET_VALUE to delegate.remapReceiver(originalThis, setter?.dispatchReceiverParameter)) + getter?.transform(DelegateFieldAccessTransformer(delegate.remapReceiver(originalThis, getter?.dispatchReceiverParameter)), null) + setter?.transform(DelegateFieldAccessTransformer(delegate.remapReceiver(originalThis, setter?.dispatchReceiverParameter)), null) backingField = null diff --git a/compiler/testData/codegen/box/delegatedProperty/delegateToFinalProperty/kt54463_platformType.kt b/compiler/testData/codegen/box/delegatedProperty/delegateToFinalProperty/kt54463_platformType.kt new file mode 100644 index 00000000000..9c3af5b3fb3 --- /dev/null +++ b/compiler/testData/codegen/box/delegatedProperty/delegateToFinalProperty/kt54463_platformType.kt @@ -0,0 +1,22 @@ +// TARGET_BACKEND: JVM +// FILE: A.java + +public class A { + public static A create() { return new A(); } +} + +// FILE: box.kt + +import kotlin.reflect.KProperty + +class C { + private val valueState = A.create() + private val value by valueState + + fun get(): String = value +} + +operator fun A.getValue(thisRef: Any?, property: KProperty<*>): String = "OK" + +fun box(): String = + C().get() diff --git a/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/codegen/BlackBoxCodegenTestGenerated.java b/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/codegen/BlackBoxCodegenTestGenerated.java index d7dd955a376..6406c24f264 100644 --- a/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/codegen/BlackBoxCodegenTestGenerated.java +++ b/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/codegen/BlackBoxCodegenTestGenerated.java @@ -14782,6 +14782,12 @@ public class BlackBoxCodegenTestGenerated extends AbstractBlackBoxCodegenTest { runTest("compiler/testData/codegen/box/delegatedProperty/delegateToFinalProperty/initializeContainerOfTopLevelProperties.kt"); } + @Test + @TestMetadata("kt54463_platformType.kt") + public void testKt54463_platformType() throws Exception { + runTest("compiler/testData/codegen/box/delegatedProperty/delegateToFinalProperty/kt54463_platformType.kt"); + } + @Test @TestMetadata("memberExtensionPropertyAndImportFromObject.kt") public void testMemberExtensionPropertyAndImportFromObject() throws Exception { diff --git a/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/codegen/IrBlackBoxCodegenTestGenerated.java b/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/codegen/IrBlackBoxCodegenTestGenerated.java index 019d4eba86f..0de92ffe8a6 100644 --- a/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/codegen/IrBlackBoxCodegenTestGenerated.java +++ b/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/codegen/IrBlackBoxCodegenTestGenerated.java @@ -15016,6 +15016,12 @@ public class IrBlackBoxCodegenTestGenerated extends AbstractIrBlackBoxCodegenTes runTest("compiler/testData/codegen/box/delegatedProperty/delegateToFinalProperty/initializeContainerOfTopLevelProperties.kt"); } + @Test + @TestMetadata("kt54463_platformType.kt") + public void testKt54463_platformType() throws Exception { + runTest("compiler/testData/codegen/box/delegatedProperty/delegateToFinalProperty/kt54463_platformType.kt"); + } + @Test @TestMetadata("memberExtensionPropertyAndImportFromObject.kt") public void testMemberExtensionPropertyAndImportFromObject() throws Exception { diff --git a/compiler/tests-gen/org/jetbrains/kotlin/codegen/LightAnalysisModeTestGenerated.java b/compiler/tests-gen/org/jetbrains/kotlin/codegen/LightAnalysisModeTestGenerated.java index 14b4b81f160..cdbbeb3a5d5 100644 --- a/compiler/tests-gen/org/jetbrains/kotlin/codegen/LightAnalysisModeTestGenerated.java +++ b/compiler/tests-gen/org/jetbrains/kotlin/codegen/LightAnalysisModeTestGenerated.java @@ -12091,6 +12091,11 @@ public class LightAnalysisModeTestGenerated extends AbstractLightAnalysisModeTes runTest("compiler/testData/codegen/box/delegatedProperty/delegateToFinalProperty/initializeContainerOfTopLevelProperties.kt"); } + @TestMetadata("kt54463_platformType.kt") + public void testKt54463_platformType() throws Exception { + runTest("compiler/testData/codegen/box/delegatedProperty/delegateToFinalProperty/kt54463_platformType.kt"); + } + @TestMetadata("memberExtensionPropertyAndImportFromObject.kt") public void testMemberExtensionPropertyAndImportFromObject() throws Exception { runTest("compiler/testData/codegen/box/delegatedProperty/delegateToFinalProperty/memberExtensionPropertyAndImportFromObject.kt");