Native: fix using nested expect enum entry in a default argument

^KT-51156 Fixed
This commit is contained in:
Svyatoslav Scherbina
2022-02-09 14:41:11 +00:00
committed by Space
parent 0a85f0dd34
commit 62c1bd0044
11 changed files with 99 additions and 4 deletions
@@ -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 {
@@ -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
}
@@ -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 {
@@ -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 {
@@ -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");
@@ -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 {
@@ -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 {
@@ -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");
@@ -31,10 +31,16 @@ class ModuleIndex(val module: IrModuleFragment) {
*/
val properties: Map<PropertyDescriptor, IrProperty>
/**
* Contains all enum entries declared in [module]
*/
val enumEntries: Map<ClassDescriptor, IrEnumEntry>
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
}
})
}
}
@@ -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 <reified T : MemberDescriptor> 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)
}
@@ -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 {