From 80312789b26a1accaf44ef160bdce08024b7ae52 Mon Sep 17 00:00:00 2001 From: Victor Petukhov Date: Wed, 22 Sep 2021 17:10:22 +0300 Subject: [PATCH] [PSI2IR] Use candidate descriptor to get original type parameters while generating assignment receiver for property ^KT-46829 Fixed --- .../FirBlackBoxCodegenTestGenerated.java | 6 ++++++ .../psi2ir/generators/AssignmentGenerator.kt | 16 ++++++++++----- .../codegen/box/innerNested/kt46829.kt | 20 +++++++++++++++++++ .../codegen/BlackBoxCodegenTestGenerated.java | 6 ++++++ .../IrBlackBoxCodegenTestGenerated.java | 6 ++++++ .../LightAnalysisModeTestGenerated.java | 5 +++++ .../IrJsCodegenBoxES6TestGenerated.java | 5 +++++ .../IrJsCodegenBoxTestGenerated.java | 5 +++++ .../semantics/JsCodegenBoxTestGenerated.java | 5 +++++ .../IrCodegenBoxWasmTestGenerated.java | 5 +++++ 10 files changed, 74 insertions(+), 5 deletions(-) create mode 100644 compiler/testData/codegen/box/innerNested/kt46829.kt 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 ace3a482fb8..869dc98e66e 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 @@ -21412,6 +21412,12 @@ public class FirBlackBoxCodegenTestGenerated extends AbstractFirBlackBoxCodegenT runTest("compiler/testData/codegen/box/innerNested/kt4036.kt"); } + @Test + @TestMetadata("kt46829.kt") + public void testKt46829() throws Exception { + runTest("compiler/testData/codegen/box/innerNested/kt46829.kt"); + } + @Test @TestMetadata("kt5363.kt") public void testKt5363() throws Exception { diff --git a/compiler/ir/ir.psi2ir/src/org/jetbrains/kotlin/psi2ir/generators/AssignmentGenerator.kt b/compiler/ir/ir.psi2ir/src/org/jetbrains/kotlin/psi2ir/generators/AssignmentGenerator.kt index 86aaa713363..763ca39521b 100644 --- a/compiler/ir/ir.psi2ir/src/org/jetbrains/kotlin/psi2ir/generators/AssignmentGenerator.kt +++ b/compiler/ir/ir.psi2ir/src/org/jetbrains/kotlin/psi2ir/generators/AssignmentGenerator.kt @@ -294,9 +294,12 @@ class AssignmentGenerator(statementGenerator: StatementGenerator) : StatementGen ) val superQualifier = getSuperQualifier(resolvedCall) + val candidateDescriptor = resolvedCall.candidateDescriptor as PropertyDescriptor // TODO property imported from an object - createPropertyLValue(ktLeft, descriptor, propertyReceiver, getTypeArguments(resolvedCall), origin, superQualifier) + createPropertyLValue( + ktLeft, descriptor, candidateDescriptor, propertyReceiver, getTypeArguments(resolvedCall), origin, superQualifier + ) } } @@ -308,26 +311,29 @@ class AssignmentGenerator(statementGenerator: StatementGenerator) : StatementGen private fun createPropertyLValue( ktExpression: KtExpression, - descriptor: PropertyDescriptor, + resultingDescriptor: PropertyDescriptor, + candidateDescriptor: PropertyDescriptor, propertyReceiver: CallReceiver, typeArgumentsMap: Map?, origin: IrStatementOrigin?, superQualifier: ClassDescriptor? ): PropertyLValueBase { - val unwrappedPropertyDescriptor = descriptor.unwrapPropertyDescriptor() + val unwrappedPropertyDescriptor = resultingDescriptor.unwrapPropertyDescriptor() val getterDescriptor = unwrappedPropertyDescriptor.unwrappedGetMethod val setterDescriptor = unwrappedPropertyDescriptor.unwrappedSetMethod val getterSymbol = getterDescriptor?.let { context.symbolTable.referenceSimpleFunction(it.original) } val setterSymbol = setterDescriptor?.let { context.symbolTable.referenceSimpleFunction(it.original) } - val propertyIrType = descriptor.type.toIrType() + val propertyIrType = resultingDescriptor.type.toIrType() return if (getterSymbol != null || setterSymbol != null) { val superQualifierSymbol = superQualifier?.let { context.symbolTable.referenceClass(it) } val typeArgumentsList = typeArgumentsMap?.let { typeArguments -> - descriptor.original.typeParameters.map { typeArguments[it]!!.toIrType() } + candidateDescriptor.typeParameters.map { + typeArguments[it]!!.toIrType() + } } AccessorPropertyLValue( context, diff --git a/compiler/testData/codegen/box/innerNested/kt46829.kt b/compiler/testData/codegen/box/innerNested/kt46829.kt new file mode 100644 index 00000000000..1be838fc755 --- /dev/null +++ b/compiler/testData/codegen/box/innerNested/kt46829.kt @@ -0,0 +1,20 @@ +class Outer { + var Inner.prop: V + get() = this.value + set(value) { + this.value = value + } +} + +class Inner( + val key: T, + var value: V +) + +fun box(): String { + Outer().run { + val i = Inner(true, false) + i.prop = true + } + return "OK" +} \ No newline at end of file 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 d7c9e822322..15131da142b 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 @@ -21280,6 +21280,12 @@ public class BlackBoxCodegenTestGenerated extends AbstractBlackBoxCodegenTest { runTest("compiler/testData/codegen/box/innerNested/kt4036.kt"); } + @Test + @TestMetadata("kt46829.kt") + public void testKt46829() throws Exception { + runTest("compiler/testData/codegen/box/innerNested/kt46829.kt"); + } + @Test @TestMetadata("kt5363.kt") public void testKt5363() 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 38469f1e011..c022d596c36 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 @@ -21412,6 +21412,12 @@ public class IrBlackBoxCodegenTestGenerated extends AbstractIrBlackBoxCodegenTes runTest("compiler/testData/codegen/box/innerNested/kt4036.kt"); } + @Test + @TestMetadata("kt46829.kt") + public void testKt46829() throws Exception { + runTest("compiler/testData/codegen/box/innerNested/kt46829.kt"); + } + @Test @TestMetadata("kt5363.kt") public void testKt5363() 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 03ea31e553b..4e75f64a3ba 100644 --- a/compiler/tests-gen/org/jetbrains/kotlin/codegen/LightAnalysisModeTestGenerated.java +++ b/compiler/tests-gen/org/jetbrains/kotlin/codegen/LightAnalysisModeTestGenerated.java @@ -17769,6 +17769,11 @@ public class LightAnalysisModeTestGenerated extends AbstractLightAnalysisModeTes runTest("compiler/testData/codegen/box/innerNested/kt4036.kt"); } + @TestMetadata("kt46829.kt") + public void testKt46829() throws Exception { + runTest("compiler/testData/codegen/box/innerNested/kt46829.kt"); + } + @TestMetadata("kt5363.kt") public void testKt5363() throws Exception { runTest("compiler/testData/codegen/box/innerNested/kt5363.kt"); diff --git a/js/js.tests/tests-gen/org/jetbrains/kotlin/js/test/es6/semantics/IrJsCodegenBoxES6TestGenerated.java b/js/js.tests/tests-gen/org/jetbrains/kotlin/js/test/es6/semantics/IrJsCodegenBoxES6TestGenerated.java index aa8c6d7015e..974271a2076 100644 --- a/js/js.tests/tests-gen/org/jetbrains/kotlin/js/test/es6/semantics/IrJsCodegenBoxES6TestGenerated.java +++ b/js/js.tests/tests-gen/org/jetbrains/kotlin/js/test/es6/semantics/IrJsCodegenBoxES6TestGenerated.java @@ -15603,6 +15603,11 @@ public class IrJsCodegenBoxES6TestGenerated extends AbstractIrJsCodegenBoxES6Tes runTest("compiler/testData/codegen/box/innerNested/kt3927.kt"); } + @TestMetadata("kt46829.kt") + public void testKt46829() throws Exception { + runTest("compiler/testData/codegen/box/innerNested/kt46829.kt"); + } + @TestMetadata("kt5363.kt") public void testKt5363() throws Exception { runTest("compiler/testData/codegen/box/innerNested/kt5363.kt"); diff --git a/js/js.tests/tests-gen/org/jetbrains/kotlin/js/test/ir/semantics/IrJsCodegenBoxTestGenerated.java b/js/js.tests/tests-gen/org/jetbrains/kotlin/js/test/ir/semantics/IrJsCodegenBoxTestGenerated.java index 547dcf7770a..5157c791cc3 100644 --- a/js/js.tests/tests-gen/org/jetbrains/kotlin/js/test/ir/semantics/IrJsCodegenBoxTestGenerated.java +++ b/js/js.tests/tests-gen/org/jetbrains/kotlin/js/test/ir/semantics/IrJsCodegenBoxTestGenerated.java @@ -15009,6 +15009,11 @@ public class IrJsCodegenBoxTestGenerated extends AbstractIrJsCodegenBoxTest { runTest("compiler/testData/codegen/box/innerNested/kt3927.kt"); } + @TestMetadata("kt46829.kt") + public void testKt46829() throws Exception { + runTest("compiler/testData/codegen/box/innerNested/kt46829.kt"); + } + @TestMetadata("kt5363.kt") public void testKt5363() throws Exception { runTest("compiler/testData/codegen/box/innerNested/kt5363.kt"); diff --git a/js/js.tests/tests-gen/org/jetbrains/kotlin/js/test/semantics/JsCodegenBoxTestGenerated.java b/js/js.tests/tests-gen/org/jetbrains/kotlin/js/test/semantics/JsCodegenBoxTestGenerated.java index 26de84180bd..5d45d3ea5ec 100644 --- a/js/js.tests/tests-gen/org/jetbrains/kotlin/js/test/semantics/JsCodegenBoxTestGenerated.java +++ b/js/js.tests/tests-gen/org/jetbrains/kotlin/js/test/semantics/JsCodegenBoxTestGenerated.java @@ -15039,6 +15039,11 @@ public class JsCodegenBoxTestGenerated extends AbstractJsCodegenBoxTest { runTest("compiler/testData/codegen/box/innerNested/kt3927.kt"); } + @TestMetadata("kt46829.kt") + public void testKt46829() throws Exception { + runTest("compiler/testData/codegen/box/innerNested/kt46829.kt"); + } + @TestMetadata("kt5363.kt") public void testKt5363() throws Exception { runTest("compiler/testData/codegen/box/innerNested/kt5363.kt"); diff --git a/js/js.tests/tests-gen/org/jetbrains/kotlin/js/test/wasm/semantics/IrCodegenBoxWasmTestGenerated.java b/js/js.tests/tests-gen/org/jetbrains/kotlin/js/test/wasm/semantics/IrCodegenBoxWasmTestGenerated.java index c0a5906ed9c..53b4aedbb50 100644 --- a/js/js.tests/tests-gen/org/jetbrains/kotlin/js/test/wasm/semantics/IrCodegenBoxWasmTestGenerated.java +++ b/js/js.tests/tests-gen/org/jetbrains/kotlin/js/test/wasm/semantics/IrCodegenBoxWasmTestGenerated.java @@ -9753,6 +9753,11 @@ public class IrCodegenBoxWasmTestGenerated extends AbstractIrCodegenBoxWasmTest runTest("compiler/testData/codegen/box/innerNested/kt3927.kt"); } + @TestMetadata("kt46829.kt") + public void testKt46829() throws Exception { + runTest("compiler/testData/codegen/box/innerNested/kt46829.kt"); + } + @TestMetadata("kt5363.kt") public void testKt5363() throws Exception { runTest("compiler/testData/codegen/box/innerNested/kt5363.kt");