From 4bfa98144bb09e1778cbcb8455dc4901f0ff5fa1 Mon Sep 17 00:00:00 2001 From: Alexander Udalov Date: Tue, 5 Feb 2019 18:14:27 +0100 Subject: [PATCH] JVM IR: fix compound access to JvmField properties --- .../ConstAndJvmFieldPropertiesLowering.kt | 6 ++--- .../codegen/box/jvmField/compoundAccess.kt | 22 +++++++++++++++++++ .../codegen/BlackBoxCodegenTestGenerated.java | 5 +++++ .../LightAnalysisModeTestGenerated.java | 5 +++++ .../ir/IrBlackBoxCodegenTestGenerated.java | 5 +++++ 5 files changed, 40 insertions(+), 3 deletions(-) create mode 100644 compiler/testData/codegen/box/jvmField/compoundAccess.kt diff --git a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/lower/ConstAndJvmFieldPropertiesLowering.kt b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/lower/ConstAndJvmFieldPropertiesLowering.kt index c084de22554..e31eb1141cc 100644 --- a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/lower/ConstAndJvmFieldPropertiesLowering.kt +++ b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/lower/ConstAndJvmFieldPropertiesLowering.kt @@ -61,13 +61,13 @@ private class ConstAndJvmFieldPropertiesLowering(val context: CommonBackendConte private fun substituteSetter(irProperty: IrProperty, expression: IrCall): IrExpression { val backingField = irProperty.backingField!! - val receiver = expression.dispatchReceiver?.let { super.visitExpression(it) } + val receiver = expression.dispatchReceiver?.transform(this, null) val setExpr = IrSetFieldImpl( expression.startOffset, expression.endOffset, backingField.symbol, receiver, - super.visitExpression(expression.getValueArgument(expression.valueArgumentsCount - 1)!!), + expression.getValueArgument(expression.valueArgumentsCount - 1)!!.transform(this, null), expression.type, expression.origin, expression.superQualifierSymbol @@ -77,7 +77,7 @@ private class ConstAndJvmFieldPropertiesLowering(val context: CommonBackendConte private fun substituteGetter(irProperty: IrProperty, expression: IrCall): IrExpression { val backingField = irProperty.backingField!! - val receiver = expression.dispatchReceiver?.let { super.visitExpression(it) } + val receiver = expression.dispatchReceiver?.transform(this, null) val getExpr = IrGetFieldImpl( expression.startOffset, expression.endOffset, diff --git a/compiler/testData/codegen/box/jvmField/compoundAccess.kt b/compiler/testData/codegen/box/jvmField/compoundAccess.kt new file mode 100644 index 00000000000..decfb7cc8a7 --- /dev/null +++ b/compiler/testData/codegen/box/jvmField/compoundAccess.kt @@ -0,0 +1,22 @@ +// TARGET_BACKEND: JVM +// WITH_RUNTIME + +class A { + @JvmField val b = B() +} + +class B { + @JvmField val c = C() + + @JvmField val result = "OK" +} + +class C { + @JvmField var d = "Fail" +} + +fun box(): String { + val a = A() + a.b.c.d = a.b.result + return a.b.c.d +} diff --git a/compiler/tests/org/jetbrains/kotlin/codegen/BlackBoxCodegenTestGenerated.java b/compiler/tests/org/jetbrains/kotlin/codegen/BlackBoxCodegenTestGenerated.java index 6caf0dff871..2dc8b7a7bbf 100644 --- a/compiler/tests/org/jetbrains/kotlin/codegen/BlackBoxCodegenTestGenerated.java +++ b/compiler/tests/org/jetbrains/kotlin/codegen/BlackBoxCodegenTestGenerated.java @@ -14333,6 +14333,11 @@ public class BlackBoxCodegenTestGenerated extends AbstractBlackBoxCodegenTest { runTest("compiler/testData/codegen/box/jvmField/classFieldReflection.kt"); } + @TestMetadata("compoundAccess.kt") + public void testCompoundAccess() throws Exception { + runTest("compiler/testData/codegen/box/jvmField/compoundAccess.kt"); + } + @TestMetadata("constructorProperty.kt") public void testConstructorProperty() throws Exception { runTest("compiler/testData/codegen/box/jvmField/constructorProperty.kt"); diff --git a/compiler/tests/org/jetbrains/kotlin/codegen/LightAnalysisModeTestGenerated.java b/compiler/tests/org/jetbrains/kotlin/codegen/LightAnalysisModeTestGenerated.java index b861c3e6034..707694396cf 100644 --- a/compiler/tests/org/jetbrains/kotlin/codegen/LightAnalysisModeTestGenerated.java +++ b/compiler/tests/org/jetbrains/kotlin/codegen/LightAnalysisModeTestGenerated.java @@ -14333,6 +14333,11 @@ public class LightAnalysisModeTestGenerated extends AbstractLightAnalysisModeTes runTest("compiler/testData/codegen/box/jvmField/classFieldReflection.kt"); } + @TestMetadata("compoundAccess.kt") + public void testCompoundAccess() throws Exception { + runTest("compiler/testData/codegen/box/jvmField/compoundAccess.kt"); + } + @TestMetadata("constructorProperty.kt") public void testConstructorProperty() throws Exception { runTest("compiler/testData/codegen/box/jvmField/constructorProperty.kt"); diff --git a/compiler/tests/org/jetbrains/kotlin/codegen/ir/IrBlackBoxCodegenTestGenerated.java b/compiler/tests/org/jetbrains/kotlin/codegen/ir/IrBlackBoxCodegenTestGenerated.java index 92fe340f818..3cf54d70e8c 100644 --- a/compiler/tests/org/jetbrains/kotlin/codegen/ir/IrBlackBoxCodegenTestGenerated.java +++ b/compiler/tests/org/jetbrains/kotlin/codegen/ir/IrBlackBoxCodegenTestGenerated.java @@ -14338,6 +14338,11 @@ public class IrBlackBoxCodegenTestGenerated extends AbstractIrBlackBoxCodegenTes runTest("compiler/testData/codegen/box/jvmField/classFieldReflection.kt"); } + @TestMetadata("compoundAccess.kt") + public void testCompoundAccess() throws Exception { + runTest("compiler/testData/codegen/box/jvmField/compoundAccess.kt"); + } + @TestMetadata("constructorProperty.kt") public void testConstructorProperty() throws Exception { runTest("compiler/testData/codegen/box/jvmField/constructorProperty.kt");