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 2c0811e0e7e..1bae4fb6752 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 @@ -11095,6 +11095,11 @@ public class FirBlackBoxCodegenTestGenerated extends AbstractFirBlackBoxCodegenT runTest("compiler/testData/codegen/box/enum/enumCompanionInit.kt"); } + @TestMetadata("enumConstructorParameterClashWithDefaults.kt") + public void testEnumConstructorParameterClashWithDefaults() throws Exception { + runTest("compiler/testData/codegen/box/enum/enumConstructorParameterClashWithDefaults.kt"); + } + @TestMetadata("enumEntryMembers.kt") public void testEnumEntryMembers() throws Exception { runTest("compiler/testData/codegen/box/enum/enumEntryMembers.kt"); diff --git a/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/lower/EnumClassLowering.kt b/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/lower/EnumClassLowering.kt index 46d274b185b..174dc295a2c 100644 --- a/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/lower/EnumClassLowering.kt +++ b/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/lower/EnumClassLowering.kt @@ -95,6 +95,11 @@ class EnumClassConstructorLowering(val context: JsCommonBackendContext) : Declar private var IrClass.correspondingEntry by context.mapping.enumClassToCorrespondingEnumEntry private var IrValueDeclaration.valueParameter by context.mapping.enumConstructorOldToNewValueParameters + private val additionalParameters = listOf( + "name" to context.irBuiltIns.stringType, + "ordinal" to context.irBuiltIns.intType + ) + override fun transformFlat(declaration: IrDeclaration): List? { (declaration.parent as? IrClass)?.let { irClass -> if (!irClass.isEnumClass || irClass.isExpect || irClass.isEffectivelyExternal()) return null @@ -120,8 +125,9 @@ class EnumClassConstructorLowering(val context: JsCommonBackendContext) : Declar returnType = enumConstructor.returnType }.apply { parent = enumClass - valueParameters += JsIrBuilder.buildValueParameter(this, "name", 0, context.irBuiltIns.stringType) - valueParameters += JsIrBuilder.buildValueParameter(this, "ordinal", 1, context.irBuiltIns.intType) + additionalParameters.forEachIndexed { index, (name, type) -> + valueParameters += JsIrBuilder.buildValueParameter(this, name, index, type) + } copyParameterDeclarationsFrom(enumConstructor) val newConstructor = this @@ -143,8 +149,7 @@ class EnumClassConstructorLowering(val context: JsCommonBackendContext) : Declar val oldParameters = enumConstructor.valueParameters val newParameters = valueParameters oldParameters.forEach { old -> - // TODO Match by index? - val new = newParameters.single { it.name == old.name } + val new = newParameters.single { it.index == old.index + additionalParameters.size } old.valueParameter = new old.defaultValue?.let { default -> @@ -235,7 +240,7 @@ class EnumClassConstructorBodyTransformer(val context: JsCommonBackendContext) : } override fun visitDelegatingConstructorCall(expression: IrDelegatingConstructorCall): IrExpression { - val delegatingConstructor = expression.symbol.owner. let { it.newConstructor ?: it } + val delegatingConstructor = expression.symbol.owner.let { it.newConstructor ?: it } return builder.irDelegatingConstructorCall(delegatingConstructor).apply { var valueArgIdx = 0 @@ -426,7 +431,7 @@ class EnumClassCreateInitializerLowering(val context: JsIrBackendContext) : Decl } } -class EnumEntryCreateGetInstancesFunsLowering(val context: JsIrBackendContext): DeclarationTransformer { +class EnumEntryCreateGetInstancesFunsLowering(val context: JsIrBackendContext) : DeclarationTransformer { private var IrEnumEntry.correspondingField by context.mapping.enumEntryToCorrespondingField private var IrClass.initEntryInstancesFun: IrSimpleFunction? by context.mapping.enumClassToInitEntryInstancesFun @@ -472,7 +477,7 @@ class EnumEntryCreateGetInstancesFunsLowering(val context: JsIrBackendContext): } } -class EnumSyntheticFunctionsLowering(val context: JsIrBackendContext): DeclarationTransformer { +class EnumSyntheticFunctionsLowering(val context: JsIrBackendContext) : DeclarationTransformer { private var IrEnumEntry.getInstanceFun by context.mapping.enumEntryToGetInstanceFun diff --git a/compiler/testData/codegen/box/enum/enumConstructorParameterClashWithDefaults.kt b/compiler/testData/codegen/box/enum/enumConstructorParameterClashWithDefaults.kt new file mode 100644 index 00000000000..d641ed44995 --- /dev/null +++ b/compiler/testData/codegen/box/enum/enumConstructorParameterClashWithDefaults.kt @@ -0,0 +1,20 @@ +enum class A( + name: String, + ordinal: Int +) { + FOO("foo", 4), + BAR("bar", 5); + + val testName = name + val testOrdinal = ordinal +} + +fun box(): String { + val fooName = A.FOO.testName == "foo" + val fooOrdinal = A.FOO.testOrdinal == 4 + + val barName = A.BAR.testName == "bar" + val barOrdinal = A.BAR.testOrdinal == 5 + + return if (fooName && fooOrdinal && barName && barOrdinal) "OK" else "fail" +} diff --git a/compiler/tests/org/jetbrains/kotlin/codegen/BlackBoxCodegenTestGenerated.java b/compiler/tests/org/jetbrains/kotlin/codegen/BlackBoxCodegenTestGenerated.java index 951fe6ddcb2..84fd1cd47ea 100644 --- a/compiler/tests/org/jetbrains/kotlin/codegen/BlackBoxCodegenTestGenerated.java +++ b/compiler/tests/org/jetbrains/kotlin/codegen/BlackBoxCodegenTestGenerated.java @@ -12495,6 +12495,11 @@ public class BlackBoxCodegenTestGenerated extends AbstractBlackBoxCodegenTest { runTest("compiler/testData/codegen/box/enum/enumCompanionInit.kt"); } + @TestMetadata("enumConstructorParameterClashWithDefaults.kt") + public void testEnumConstructorParameterClashWithDefaults() throws Exception { + runTest("compiler/testData/codegen/box/enum/enumConstructorParameterClashWithDefaults.kt"); + } + @TestMetadata("enumEntryMembers.kt") public void testEnumEntryMembers() throws Exception { runTest("compiler/testData/codegen/box/enum/enumEntryMembers.kt"); diff --git a/compiler/tests/org/jetbrains/kotlin/codegen/LightAnalysisModeTestGenerated.java b/compiler/tests/org/jetbrains/kotlin/codegen/LightAnalysisModeTestGenerated.java index 7006b1bfd61..43eacc6a8a1 100644 --- a/compiler/tests/org/jetbrains/kotlin/codegen/LightAnalysisModeTestGenerated.java +++ b/compiler/tests/org/jetbrains/kotlin/codegen/LightAnalysisModeTestGenerated.java @@ -12495,6 +12495,11 @@ public class LightAnalysisModeTestGenerated extends AbstractLightAnalysisModeTes runTest("compiler/testData/codegen/box/enum/enumCompanionInit.kt"); } + @TestMetadata("enumConstructorParameterClashWithDefaults.kt") + public void testEnumConstructorParameterClashWithDefaults() throws Exception { + runTest("compiler/testData/codegen/box/enum/enumConstructorParameterClashWithDefaults.kt"); + } + @TestMetadata("enumEntryMembers.kt") public void testEnumEntryMembers() throws Exception { runTest("compiler/testData/codegen/box/enum/enumEntryMembers.kt"); diff --git a/compiler/tests/org/jetbrains/kotlin/codegen/ir/IrBlackBoxCodegenTestGenerated.java b/compiler/tests/org/jetbrains/kotlin/codegen/ir/IrBlackBoxCodegenTestGenerated.java index ba5f8bba9e8..5dad749d677 100644 --- a/compiler/tests/org/jetbrains/kotlin/codegen/ir/IrBlackBoxCodegenTestGenerated.java +++ b/compiler/tests/org/jetbrains/kotlin/codegen/ir/IrBlackBoxCodegenTestGenerated.java @@ -11095,6 +11095,11 @@ public class IrBlackBoxCodegenTestGenerated extends AbstractIrBlackBoxCodegenTes runTest("compiler/testData/codegen/box/enum/enumCompanionInit.kt"); } + @TestMetadata("enumConstructorParameterClashWithDefaults.kt") + public void testEnumConstructorParameterClashWithDefaults() throws Exception { + runTest("compiler/testData/codegen/box/enum/enumConstructorParameterClashWithDefaults.kt"); + } + @TestMetadata("enumEntryMembers.kt") public void testEnumEntryMembers() throws Exception { runTest("compiler/testData/codegen/box/enum/enumEntryMembers.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 684ad63ccdb..22b63932fde 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 @@ -9510,6 +9510,11 @@ public class IrJsCodegenBoxES6TestGenerated extends AbstractIrJsCodegenBoxES6Tes runTest("compiler/testData/codegen/box/enum/enumCompanionInit.kt"); } + @TestMetadata("enumConstructorParameterClashWithDefaults.kt") + public void testEnumConstructorParameterClashWithDefaults() throws Exception { + runTest("compiler/testData/codegen/box/enum/enumConstructorParameterClashWithDefaults.kt"); + } + @TestMetadata("enumEntryMembers.kt") public void testEnumEntryMembers() throws Exception { runTest("compiler/testData/codegen/box/enum/enumEntryMembers.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 873e840b4d7..a2040dd8978 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 @@ -9510,6 +9510,11 @@ public class IrJsCodegenBoxTestGenerated extends AbstractIrJsCodegenBoxTest { runTest("compiler/testData/codegen/box/enum/enumCompanionInit.kt"); } + @TestMetadata("enumConstructorParameterClashWithDefaults.kt") + public void testEnumConstructorParameterClashWithDefaults() throws Exception { + runTest("compiler/testData/codegen/box/enum/enumConstructorParameterClashWithDefaults.kt"); + } + @TestMetadata("enumEntryMembers.kt") public void testEnumEntryMembers() throws Exception { runTest("compiler/testData/codegen/box/enum/enumEntryMembers.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 c6ee6025566..609679edd00 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 @@ -9510,6 +9510,11 @@ public class JsCodegenBoxTestGenerated extends AbstractJsCodegenBoxTest { runTest("compiler/testData/codegen/box/enum/enumCompanionInit.kt"); } + @TestMetadata("enumConstructorParameterClashWithDefaults.kt") + public void testEnumConstructorParameterClashWithDefaults() throws Exception { + runTest("compiler/testData/codegen/box/enum/enumConstructorParameterClashWithDefaults.kt"); + } + @TestMetadata("enumEntryMembers.kt") public void testEnumEntryMembers() throws Exception { runTest("compiler/testData/codegen/box/enum/enumEntryMembers.kt");