From 62c1bd004421eb3a60eb32afb640e1ce9c9a871a Mon Sep 17 00:00:00 2001 From: Svyatoslav Scherbina Date: Wed, 9 Feb 2022 14:41:11 +0000 Subject: [PATCH] Native: fix using nested expect enum entry in a default argument ^KT-51156 Fixed --- .../FirBlackBoxCodegenTestGenerated.java | 6 ++++ .../defaultArguments/nestedEnumEntryValue.kt | 32 +++++++++++++++++++ .../codegen/BlackBoxCodegenTestGenerated.java | 6 ++++ .../IrBlackBoxCodegenTestGenerated.java | 6 ++++ .../LightAnalysisModeTestGenerated.java | 5 +++ .../js/test/JsCodegenBoxTestGenerated.java | 6 ++++ .../test/ir/IrJsCodegenBoxTestGenerated.java | 6 ++++ .../IrCodegenBoxWasmTestGenerated.java | 5 +++ .../kotlin/backend/konan/ir/ModuleIndex.kt | 11 +++++++ .../konan/lower/ExpectDeclarationsRemoving.kt | 14 +++++--- .../blackboxtest/ExternalTestGenerated.java | 6 ++++ 11 files changed, 99 insertions(+), 4 deletions(-) create mode 100644 compiler/testData/codegen/box/multiplatform/defaultArguments/nestedEnumEntryValue.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 0a43862571e..64188971829 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 @@ -28554,6 +28554,12 @@ public class FirBlackBoxCodegenTestGenerated extends AbstractFirBlackBoxCodegenT runTest("compiler/testData/codegen/box/multiplatform/defaultArguments/kt23739.kt"); } + @Test + @TestMetadata("nestedEnumEntryValue.kt") + public void testNestedEnumEntryValue() throws Exception { + runTest("compiler/testData/codegen/box/multiplatform/defaultArguments/nestedEnumEntryValue.kt"); + } + @Test @TestMetadata("parametersInArgumentValues.kt") public void testParametersInArgumentValues() throws Exception { diff --git a/compiler/testData/codegen/box/multiplatform/defaultArguments/nestedEnumEntryValue.kt b/compiler/testData/codegen/box/multiplatform/defaultArguments/nestedEnumEntryValue.kt new file mode 100644 index 00000000000..98c2463eb44 --- /dev/null +++ b/compiler/testData/codegen/box/multiplatform/defaultArguments/nestedEnumEntryValue.kt @@ -0,0 +1,32 @@ +// IGNORE_BACKEND: JS_IR, WASM +// JS IR & Wasm: https://youtrack.jetbrains.com/issue/KT-51225 +// IGNORE_BACKEND_FIR: JVM_IR +// FIR status: default argument mapping in MPP isn't designed yet +// !LANGUAGE: +MultiPlatformProjects +// MODULE: lib +// FILE: common.kt + +// KT-51156 + +expect class C(e: E = E.O) { + enum class E { + O, K + } +} + +// FILE: platform.kt + +actual class C actual constructor(e: E) { + val result = e.name + + actual enum class E { + O, K + } +} + +// MODULE: main(lib) +// FILE: main.kt + +fun box(): String { + return C().result + C(C.E.K).result +} 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 fe76e5efdde..ef1d7063c9f 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 @@ -28128,6 +28128,12 @@ public class BlackBoxCodegenTestGenerated extends AbstractBlackBoxCodegenTest { runTest("compiler/testData/codegen/box/multiplatform/defaultArguments/kt23739.kt"); } + @Test + @TestMetadata("nestedEnumEntryValue.kt") + public void testNestedEnumEntryValue() throws Exception { + runTest("compiler/testData/codegen/box/multiplatform/defaultArguments/nestedEnumEntryValue.kt"); + } + @Test @TestMetadata("parametersInArgumentValues.kt") public void testParametersInArgumentValues() 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 c23842732c8..9c8442f6b80 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 @@ -28554,6 +28554,12 @@ public class IrBlackBoxCodegenTestGenerated extends AbstractIrBlackBoxCodegenTes runTest("compiler/testData/codegen/box/multiplatform/defaultArguments/kt23739.kt"); } + @Test + @TestMetadata("nestedEnumEntryValue.kt") + public void testNestedEnumEntryValue() throws Exception { + runTest("compiler/testData/codegen/box/multiplatform/defaultArguments/nestedEnumEntryValue.kt"); + } + @Test @TestMetadata("parametersInArgumentValues.kt") public void testParametersInArgumentValues() 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 8d965950e5d..cb0c0468d06 100644 --- a/compiler/tests-gen/org/jetbrains/kotlin/codegen/LightAnalysisModeTestGenerated.java +++ b/compiler/tests-gen/org/jetbrains/kotlin/codegen/LightAnalysisModeTestGenerated.java @@ -23957,6 +23957,11 @@ public class LightAnalysisModeTestGenerated extends AbstractLightAnalysisModeTes runTest("compiler/testData/codegen/box/multiplatform/defaultArguments/kt23739.kt"); } + @TestMetadata("nestedEnumEntryValue.kt") + public void testNestedEnumEntryValue() throws Exception { + runTest("compiler/testData/codegen/box/multiplatform/defaultArguments/nestedEnumEntryValue.kt"); + } + @TestMetadata("parametersInArgumentValues.kt") public void testParametersInArgumentValues() throws Exception { runTest("compiler/testData/codegen/box/multiplatform/defaultArguments/parametersInArgumentValues.kt"); diff --git a/js/js.tests/tests-gen/org/jetbrains/kotlin/js/test/JsCodegenBoxTestGenerated.java b/js/js.tests/tests-gen/org/jetbrains/kotlin/js/test/JsCodegenBoxTestGenerated.java index 35196f2a099..20e77f75015 100644 --- a/js/js.tests/tests-gen/org/jetbrains/kotlin/js/test/JsCodegenBoxTestGenerated.java +++ b/js/js.tests/tests-gen/org/jetbrains/kotlin/js/test/JsCodegenBoxTestGenerated.java @@ -19964,6 +19964,12 @@ public class JsCodegenBoxTestGenerated extends AbstractJsCodegenBoxTest { runTest("compiler/testData/codegen/box/multiplatform/defaultArguments/kt23739.kt"); } + @Test + @TestMetadata("nestedEnumEntryValue.kt") + public void testNestedEnumEntryValue() throws Exception { + runTest("compiler/testData/codegen/box/multiplatform/defaultArguments/nestedEnumEntryValue.kt"); + } + @Test @TestMetadata("parametersInArgumentValues.kt") public void testParametersInArgumentValues() throws Exception { diff --git a/js/js.tests/tests-gen/org/jetbrains/kotlin/js/test/ir/IrJsCodegenBoxTestGenerated.java b/js/js.tests/tests-gen/org/jetbrains/kotlin/js/test/ir/IrJsCodegenBoxTestGenerated.java index de1cd7443f3..c869d56bc2e 100644 --- a/js/js.tests/tests-gen/org/jetbrains/kotlin/js/test/ir/IrJsCodegenBoxTestGenerated.java +++ b/js/js.tests/tests-gen/org/jetbrains/kotlin/js/test/ir/IrJsCodegenBoxTestGenerated.java @@ -19928,6 +19928,12 @@ public class IrJsCodegenBoxTestGenerated extends AbstractIrJsCodegenBoxTest { runTest("compiler/testData/codegen/box/multiplatform/defaultArguments/kt23739.kt"); } + @Test + @TestMetadata("nestedEnumEntryValue.kt") + public void testNestedEnumEntryValue() throws Exception { + runTest("compiler/testData/codegen/box/multiplatform/defaultArguments/nestedEnumEntryValue.kt"); + } + @Test @TestMetadata("parametersInArgumentValues.kt") public void testParametersInArgumentValues() throws Exception { diff --git a/js/js.tests/tests-gen/org/jetbrains/kotlin/js/testOld/wasm/semantics/IrCodegenBoxWasmTestGenerated.java b/js/js.tests/tests-gen/org/jetbrains/kotlin/js/testOld/wasm/semantics/IrCodegenBoxWasmTestGenerated.java index 089be932ec7..2efd74d17d5 100644 --- a/js/js.tests/tests-gen/org/jetbrains/kotlin/js/testOld/wasm/semantics/IrCodegenBoxWasmTestGenerated.java +++ b/js/js.tests/tests-gen/org/jetbrains/kotlin/js/testOld/wasm/semantics/IrCodegenBoxWasmTestGenerated.java @@ -17247,6 +17247,11 @@ public class IrCodegenBoxWasmTestGenerated extends AbstractIrCodegenBoxWasmTest runTest("compiler/testData/codegen/box/multiplatform/defaultArguments/kt23739.kt"); } + @TestMetadata("nestedEnumEntryValue.kt") + public void testNestedEnumEntryValue() throws Exception { + runTest("compiler/testData/codegen/box/multiplatform/defaultArguments/nestedEnumEntryValue.kt"); + } + @TestMetadata("parametersInArgumentValues.kt") public void testParametersInArgumentValues() throws Exception { runTest("compiler/testData/codegen/box/multiplatform/defaultArguments/parametersInArgumentValues.kt"); diff --git a/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/ir/ModuleIndex.kt b/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/ir/ModuleIndex.kt index 5d5e45edcd1..d1b861262a0 100644 --- a/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/ir/ModuleIndex.kt +++ b/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/ir/ModuleIndex.kt @@ -31,10 +31,16 @@ class ModuleIndex(val module: IrModuleFragment) { */ val properties: Map + /** + * Contains all enum entries declared in [module] + */ + val enumEntries: Map + init { classes = mutableMapOf() functions = mutableMapOf() properties = mutableMapOf() + enumEntries = mutableMapOf() module.acceptVoid(object : IrElementVisitorVoid { override fun visitElement(element: IrElement) { @@ -56,6 +62,11 @@ class ModuleIndex(val module: IrModuleFragment) { super.visitProperty(declaration) properties[declaration.descriptor] = declaration } + + override fun visitEnumEntry(declaration: IrEnumEntry) { + super.visitEnumEntry(declaration) + enumEntries[declaration.descriptor] = declaration + } }) } } diff --git a/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/lower/ExpectDeclarationsRemoving.kt b/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/lower/ExpectDeclarationsRemoving.kt index fd2dda03737..621bdd3d3d4 100644 --- a/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/lower/ExpectDeclarationsRemoving.kt +++ b/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/lower/ExpectDeclarationsRemoving.kt @@ -16,10 +16,7 @@ import org.jetbrains.kotlin.ir.declarations.* import org.jetbrains.kotlin.ir.expressions.IrExpression import org.jetbrains.kotlin.ir.expressions.impl.IrExpressionBodyImpl import org.jetbrains.kotlin.ir.symbols.* -import org.jetbrains.kotlin.ir.util.DeepCopyIrTreeWithSymbols -import org.jetbrains.kotlin.ir.util.DeepCopySymbolRemapper -import org.jetbrains.kotlin.ir.util.DeepCopyTypeRemapper -import org.jetbrains.kotlin.ir.util.patchDeclarationParents +import org.jetbrains.kotlin.ir.util.* import org.jetbrains.kotlin.ir.visitors.IrElementVisitorVoid import org.jetbrains.kotlin.ir.visitors.acceptChildrenVoid import org.jetbrains.kotlin.ir.visitors.acceptVoid @@ -101,6 +98,9 @@ internal class ExpectToActualDefaultValueCopier(private val irModule: IrModuleFr private fun IrClass.findActualForExpected(): IrClass = moduleIndex.classes[descriptor.findActualForExpect()]!! + private fun IrEnumEntry.findActualForExpected(): IrEnumEntry = + moduleIndex.enumEntries[descriptor.findActualForExpect()]!! + private inline fun T.findActualForExpect(): T { if (!this.isExpect) error(this) return (findCompatibleActualsForExpected(module).singleOrNull() ?: error(this)) as T @@ -156,6 +156,12 @@ internal class ExpectToActualDefaultValueCopier(private val irModule: IrModuleFr else super.getReferencedProperty(symbol) + override fun getReferencedEnumEntry(symbol: IrEnumEntrySymbol): IrEnumEntrySymbol = + if (symbol.descriptor.isExpect) + symbol.owner.findActualForExpected().symbol + else + super.getReferencedEnumEntry(symbol) + override fun getReferencedValue(symbol: IrValueSymbol) = remapExpectValue(symbol)?.symbol ?: super.getReferencedValue(symbol) } diff --git a/native/native.tests/tests-gen/org/jetbrains/kotlin/konan/blackboxtest/ExternalTestGenerated.java b/native/native.tests/tests-gen/org/jetbrains/kotlin/konan/blackboxtest/ExternalTestGenerated.java index 8308ba6cdd9..24b10f49458 100644 --- a/native/native.tests/tests-gen/org/jetbrains/kotlin/konan/blackboxtest/ExternalTestGenerated.java +++ b/native/native.tests/tests-gen/org/jetbrains/kotlin/konan/blackboxtest/ExternalTestGenerated.java @@ -21909,6 +21909,12 @@ public class ExternalTestGenerated extends AbstractExternalNativeBlackBoxTest { runTest("compiler/testData/codegen/box/multiplatform/defaultArguments/kt23739.kt"); } + @Test + @TestMetadata("nestedEnumEntryValue.kt") + public void testNestedEnumEntryValue() throws Exception { + runTest("compiler/testData/codegen/box/multiplatform/defaultArguments/nestedEnumEntryValue.kt"); + } + @Test @TestMetadata("parametersInArgumentValues.kt") public void testParametersInArgumentValues() throws Exception {