From 94acfa50bd2a18459876403deff224c88091db43 Mon Sep 17 00:00:00 2001 From: Roman Artemev Date: Mon, 9 Nov 2020 17:06:42 +0300 Subject: [PATCH] [IR BE] Remap dispatch receiver for inner ctor too - do not forget to add into mapping dispatch receiver - fix KT-40686 (at least part of it) - add test --- .../ir/FirBlackBoxCodegenTestGenerated.java | 5 ++++ .../common/lower/InnerClassesLowering.kt | 12 ++++++++-- .../box/innerNested/innerWithDefaultInner.kt | 24 +++++++++++++++++++ .../codegen/BlackBoxCodegenTestGenerated.java | 5 ++++ .../LightAnalysisModeTestGenerated.java | 5 ++++ .../ir/IrBlackBoxCodegenTestGenerated.java | 5 ++++ .../IrJsCodegenBoxES6TestGenerated.java | 5 ++++ .../IrJsCodegenBoxTestGenerated.java | 5 ++++ .../semantics/JsCodegenBoxTestGenerated.java | 5 ++++ .../IrCodegenBoxWasmTestGenerated.java | 5 ++++ 10 files changed, 74 insertions(+), 2 deletions(-) create mode 100644 compiler/testData/codegen/box/innerNested/innerWithDefaultInner.kt diff --git a/compiler/fir/fir2ir/tests/org/jetbrains/kotlin/codegen/ir/FirBlackBoxCodegenTestGenerated.java b/compiler/fir/fir2ir/tests/org/jetbrains/kotlin/codegen/ir/FirBlackBoxCodegenTestGenerated.java index df645ee4e63..edc9c50b4ea 100644 --- a/compiler/fir/fir2ir/tests/org/jetbrains/kotlin/codegen/ir/FirBlackBoxCodegenTestGenerated.java +++ b/compiler/fir/fir2ir/tests/org/jetbrains/kotlin/codegen/ir/FirBlackBoxCodegenTestGenerated.java @@ -15337,6 +15337,11 @@ public class FirBlackBoxCodegenTestGenerated extends AbstractFirBlackBoxCodegenT runTest("compiler/testData/codegen/box/innerNested/innerWithDefaultArgument.kt"); } + @TestMetadata("innerWithDefaultInner.kt") + public void testInnerWithDefaultInner() throws Exception { + runTest("compiler/testData/codegen/box/innerNested/innerWithDefaultInner.kt"); + } + @TestMetadata("kt3132.kt") public void testKt3132() throws Exception { runTest("compiler/testData/codegen/box/innerNested/kt3132.kt"); diff --git a/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/lower/InnerClassesLowering.kt b/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/lower/InnerClassesLowering.kt index 70b0a778377..8b19b60b57f 100644 --- a/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/lower/InnerClassesLowering.kt +++ b/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/lower/InnerClassesLowering.kt @@ -97,10 +97,18 @@ private fun InnerClassesSupport.primaryConstructorParameterMap(originalConstruct val loweredConstructor = getInnerClassConstructorWithOuterThisParameter(originalConstructor) - originalConstructor.valueParameters.forEach { old -> - oldConstructorParameterToNew[old] = loweredConstructor.valueParameters[old.index + 1] + var index = 0 + + originalConstructor.dispatchReceiverParameter?.let { + oldConstructorParameterToNew[it] = loweredConstructor.valueParameters[index++] } + originalConstructor.valueParameters.forEach { old -> + oldConstructorParameterToNew[old] = loweredConstructor.valueParameters[index++] + } + + assert(loweredConstructor.valueParameters.size == index) + return oldConstructorParameterToNew } diff --git a/compiler/testData/codegen/box/innerNested/innerWithDefaultInner.kt b/compiler/testData/codegen/box/innerNested/innerWithDefaultInner.kt new file mode 100644 index 00000000000..733e0efbee8 --- /dev/null +++ b/compiler/testData/codegen/box/innerNested/innerWithDefaultInner.kt @@ -0,0 +1,24 @@ + +// KT-40686 + + +class Outer(val o: String, val oo: String) { + inner class InnerArg(val i: String) { + val result: String get() = o + i + } + + inner class InnerParam(val i: InnerArg = InnerArg("B")) { + fun foo() = i.result + oo + } +} + + +fun box(): String { + val o = Outer("A", "C") + val i = o.InnerParam() + + val rr = i.foo() + if (rr != "ABC") return "FAIL: $rr" + + return "OK" +} \ No newline at end of file diff --git a/compiler/tests/org/jetbrains/kotlin/codegen/BlackBoxCodegenTestGenerated.java b/compiler/tests/org/jetbrains/kotlin/codegen/BlackBoxCodegenTestGenerated.java index 79d29e35a14..84627960359 100644 --- a/compiler/tests/org/jetbrains/kotlin/codegen/BlackBoxCodegenTestGenerated.java +++ b/compiler/tests/org/jetbrains/kotlin/codegen/BlackBoxCodegenTestGenerated.java @@ -16737,6 +16737,11 @@ public class BlackBoxCodegenTestGenerated extends AbstractBlackBoxCodegenTest { runTest("compiler/testData/codegen/box/innerNested/innerWithDefaultArgument.kt"); } + @TestMetadata("innerWithDefaultInner.kt") + public void testInnerWithDefaultInner() throws Exception { + runTest("compiler/testData/codegen/box/innerNested/innerWithDefaultInner.kt"); + } + @TestMetadata("kt3132.kt") public void testKt3132() throws Exception { runTest("compiler/testData/codegen/box/innerNested/kt3132.kt"); diff --git a/compiler/tests/org/jetbrains/kotlin/codegen/LightAnalysisModeTestGenerated.java b/compiler/tests/org/jetbrains/kotlin/codegen/LightAnalysisModeTestGenerated.java index d9ede1125ca..19c32945df6 100644 --- a/compiler/tests/org/jetbrains/kotlin/codegen/LightAnalysisModeTestGenerated.java +++ b/compiler/tests/org/jetbrains/kotlin/codegen/LightAnalysisModeTestGenerated.java @@ -16737,6 +16737,11 @@ public class LightAnalysisModeTestGenerated extends AbstractLightAnalysisModeTes runTest("compiler/testData/codegen/box/innerNested/innerWithDefaultArgument.kt"); } + @TestMetadata("innerWithDefaultInner.kt") + public void testInnerWithDefaultInner() throws Exception { + runTest("compiler/testData/codegen/box/innerNested/innerWithDefaultInner.kt"); + } + @TestMetadata("kt3132.kt") public void testKt3132() throws Exception { runTest("compiler/testData/codegen/box/innerNested/kt3132.kt"); diff --git a/compiler/tests/org/jetbrains/kotlin/codegen/ir/IrBlackBoxCodegenTestGenerated.java b/compiler/tests/org/jetbrains/kotlin/codegen/ir/IrBlackBoxCodegenTestGenerated.java index 416626a1a36..b7261d7507b 100644 --- a/compiler/tests/org/jetbrains/kotlin/codegen/ir/IrBlackBoxCodegenTestGenerated.java +++ b/compiler/tests/org/jetbrains/kotlin/codegen/ir/IrBlackBoxCodegenTestGenerated.java @@ -15337,6 +15337,11 @@ public class IrBlackBoxCodegenTestGenerated extends AbstractIrBlackBoxCodegenTes runTest("compiler/testData/codegen/box/innerNested/innerWithDefaultArgument.kt"); } + @TestMetadata("innerWithDefaultInner.kt") + public void testInnerWithDefaultInner() throws Exception { + runTest("compiler/testData/codegen/box/innerNested/innerWithDefaultInner.kt"); + } + @TestMetadata("kt3132.kt") public void testKt3132() throws Exception { runTest("compiler/testData/codegen/box/innerNested/kt3132.kt"); diff --git a/js/js.tests/test/org/jetbrains/kotlin/js/test/es6/semantics/IrJsCodegenBoxES6TestGenerated.java b/js/js.tests/test/org/jetbrains/kotlin/js/test/es6/semantics/IrJsCodegenBoxES6TestGenerated.java index f912b53c80b..9e7dde16038 100644 --- a/js/js.tests/test/org/jetbrains/kotlin/js/test/es6/semantics/IrJsCodegenBoxES6TestGenerated.java +++ b/js/js.tests/test/org/jetbrains/kotlin/js/test/es6/semantics/IrJsCodegenBoxES6TestGenerated.java @@ -13302,6 +13302,11 @@ public class IrJsCodegenBoxES6TestGenerated extends AbstractIrJsCodegenBoxES6Tes runTest("compiler/testData/codegen/box/innerNested/innerWithDefaultArgument.kt"); } + @TestMetadata("innerWithDefaultInner.kt") + public void testInnerWithDefaultInner() throws Exception { + runTest("compiler/testData/codegen/box/innerNested/innerWithDefaultInner.kt"); + } + @TestMetadata("kt3132.kt") public void testKt3132() throws Exception { runTest("compiler/testData/codegen/box/innerNested/kt3132.kt"); diff --git a/js/js.tests/test/org/jetbrains/kotlin/js/test/ir/semantics/IrJsCodegenBoxTestGenerated.java b/js/js.tests/test/org/jetbrains/kotlin/js/test/ir/semantics/IrJsCodegenBoxTestGenerated.java index e17a9446dab..1cc3f93e591 100644 --- a/js/js.tests/test/org/jetbrains/kotlin/js/test/ir/semantics/IrJsCodegenBoxTestGenerated.java +++ b/js/js.tests/test/org/jetbrains/kotlin/js/test/ir/semantics/IrJsCodegenBoxTestGenerated.java @@ -13302,6 +13302,11 @@ public class IrJsCodegenBoxTestGenerated extends AbstractIrJsCodegenBoxTest { runTest("compiler/testData/codegen/box/innerNested/innerWithDefaultArgument.kt"); } + @TestMetadata("innerWithDefaultInner.kt") + public void testInnerWithDefaultInner() throws Exception { + runTest("compiler/testData/codegen/box/innerNested/innerWithDefaultInner.kt"); + } + @TestMetadata("kt3132.kt") public void testKt3132() throws Exception { runTest("compiler/testData/codegen/box/innerNested/kt3132.kt"); diff --git a/js/js.tests/test/org/jetbrains/kotlin/js/test/semantics/JsCodegenBoxTestGenerated.java b/js/js.tests/test/org/jetbrains/kotlin/js/test/semantics/JsCodegenBoxTestGenerated.java index 50ca73ff7af..177ca42bf1b 100644 --- a/js/js.tests/test/org/jetbrains/kotlin/js/test/semantics/JsCodegenBoxTestGenerated.java +++ b/js/js.tests/test/org/jetbrains/kotlin/js/test/semantics/JsCodegenBoxTestGenerated.java @@ -13367,6 +13367,11 @@ public class JsCodegenBoxTestGenerated extends AbstractJsCodegenBoxTest { runTest("compiler/testData/codegen/box/innerNested/innerWithDefaultArgument.kt"); } + @TestMetadata("innerWithDefaultInner.kt") + public void testInnerWithDefaultInner() throws Exception { + runTest("compiler/testData/codegen/box/innerNested/innerWithDefaultInner.kt"); + } + @TestMetadata("kt3132.kt") public void testKt3132() throws Exception { runTest("compiler/testData/codegen/box/innerNested/kt3132.kt"); diff --git a/js/js.tests/test/org/jetbrains/kotlin/js/test/wasm/semantics/IrCodegenBoxWasmTestGenerated.java b/js/js.tests/test/org/jetbrains/kotlin/js/test/wasm/semantics/IrCodegenBoxWasmTestGenerated.java index c149ac570e2..ba7392a379a 100644 --- a/js/js.tests/test/org/jetbrains/kotlin/js/test/wasm/semantics/IrCodegenBoxWasmTestGenerated.java +++ b/js/js.tests/test/org/jetbrains/kotlin/js/test/wasm/semantics/IrCodegenBoxWasmTestGenerated.java @@ -7632,6 +7632,11 @@ public class IrCodegenBoxWasmTestGenerated extends AbstractIrCodegenBoxWasmTest runTest("compiler/testData/codegen/box/innerNested/innerWithDefaultArgument.kt"); } + @TestMetadata("innerWithDefaultInner.kt") + public void testInnerWithDefaultInner() throws Exception { + runTest("compiler/testData/codegen/box/innerNested/innerWithDefaultInner.kt"); + } + @TestMetadata("kt3132.kt") public void testKt3132() throws Exception { runTest("compiler/testData/codegen/box/innerNested/kt3132.kt");