diff --git a/compiler/frontend/src/org/jetbrains/kotlin/resolve/BodyResolver.java b/compiler/frontend/src/org/jetbrains/kotlin/resolve/BodyResolver.java index 92043a7dc88..947f089ec21 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/resolve/BodyResolver.java +++ b/compiler/frontend/src/org/jetbrains/kotlin/resolve/BodyResolver.java @@ -389,7 +389,10 @@ public class BodyResolver { if (ktClass instanceof KtEnumEntry && DescriptorUtils.isEnumEntry(descriptor) && ktClass.getSuperTypeListEntries().isEmpty()) { assert scopeForConstructor != null : "Scope for enum class constructor should be non-null: " + descriptor; - resolveConstructorCallForEnumEntryWithoutInitializer((KtEnumEntry) ktClass, descriptor, scopeForConstructor, outerDataFlowInfo); + resolveConstructorCallForEnumEntryWithoutInitializer( + (KtEnumEntry) ktClass, descriptor, + scopeForConstructor, outerDataFlowInfo, primaryConstructorDelegationCall + ); } for (KtSuperTypeListEntry delegationSpecifier : ktClass.getSuperTypeListEntries()) { @@ -430,7 +433,8 @@ public class BodyResolver { @NotNull KtEnumEntry ktEnumEntry, @NotNull ClassDescriptor enumEntryDescriptor, @NotNull LexicalScope scopeForConstructor, - @NotNull DataFlowInfo outerDataFlowInfo + @NotNull DataFlowInfo outerDataFlowInfo, + @NotNull ResolvedCall[] primaryConstructorDelegationCall ) { assert enumEntryDescriptor.getKind() == ClassKind.ENUM_ENTRY : "Enum entry expected: " + enumEntryDescriptor; ClassDescriptor enumClassDescriptor = (ClassDescriptor) enumEntryDescriptor.getContainingDeclaration(); @@ -448,7 +452,11 @@ public class BodyResolver { Call call = CallMaker.makeConstructorCallWithoutTypeArguments(ktCallEntry); trace.record(BindingContext.TYPE, ktCallEntry.getTypeReference(), enumClassDescriptor.getDefaultType()); trace.record(BindingContext.CALL, ktEnumEntry, call); - callResolver.resolveFunctionCall(trace, scopeForConstructor, call, NO_EXPECTED_TYPE, outerDataFlowInfo, false); + OverloadResolutionResults results = + callResolver.resolveFunctionCall(trace, scopeForConstructor, call, NO_EXPECTED_TYPE, outerDataFlowInfo, false); + if (primaryConstructorDelegationCall[0] == null) { + primaryConstructorDelegationCall[0] = results.getResultingCall(); + } } // Returns a set of enum or sealed types of which supertypeOwner is an entry or a member diff --git a/compiler/testData/codegen/box/enum/defaultCtor/entryClassConstructorWithDefaultArguments.kt b/compiler/testData/codegen/box/enum/defaultCtor/entryClassConstructorWithDefaultArguments.kt new file mode 100644 index 00000000000..dfe8da0b5ca --- /dev/null +++ b/compiler/testData/codegen/box/enum/defaultCtor/entryClassConstructorWithDefaultArguments.kt @@ -0,0 +1,8 @@ +enum class Test(val str: String = "OK") { + OK { + fun foo() {} + } +} + +fun box(): String = + Test.OK.str \ No newline at end of file diff --git a/compiler/testData/codegen/box/enum/defaultCtor/entryClassConstructorWithVarargs.kt b/compiler/testData/codegen/box/enum/defaultCtor/entryClassConstructorWithVarargs.kt new file mode 100644 index 00000000000..b5d7511a0b0 --- /dev/null +++ b/compiler/testData/codegen/box/enum/defaultCtor/entryClassConstructorWithVarargs.kt @@ -0,0 +1,12 @@ +// IGNORE_BACKEND: JS + + +enum class Test(vararg xs: Int) { + OK { + fun foo() {} + }; + val xs = xs +} + +fun box(): String = + if (Test.OK.xs.size == 0) "OK" else "Fail" \ No newline at end of file diff --git a/compiler/tests-ir-jvm/tests/org/jetbrains/kotlin/codegen/ir/IrBlackBoxCodegenTestGenerated.java b/compiler/tests-ir-jvm/tests/org/jetbrains/kotlin/codegen/ir/IrBlackBoxCodegenTestGenerated.java index d5d7c0ee362..fca4815fda0 100644 --- a/compiler/tests-ir-jvm/tests/org/jetbrains/kotlin/codegen/ir/IrBlackBoxCodegenTestGenerated.java +++ b/compiler/tests-ir-jvm/tests/org/jetbrains/kotlin/codegen/ir/IrBlackBoxCodegenTestGenerated.java @@ -8473,6 +8473,18 @@ public class IrBlackBoxCodegenTestGenerated extends AbstractIrBlackBoxCodegenTes doTest(fileName); } + @TestMetadata("entryClassConstructorWithDefaultArguments.kt") + public void testEntryClassConstructorWithDefaultArguments() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/codegen/box/enum/defaultCtor/entryClassConstructorWithDefaultArguments.kt"); + doTest(fileName); + } + + @TestMetadata("entryClassConstructorWithVarargs.kt") + public void testEntryClassConstructorWithVarargs() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/codegen/box/enum/defaultCtor/entryClassConstructorWithVarargs.kt"); + doTest(fileName); + } + @TestMetadata("secondaryConstructorWithDefaultArguments.kt") public void testSecondaryConstructorWithDefaultArguments() throws Exception { String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/codegen/box/enum/defaultCtor/secondaryConstructorWithDefaultArguments.kt"); diff --git a/compiler/tests/org/jetbrains/kotlin/codegen/BlackBoxCodegenTestGenerated.java b/compiler/tests/org/jetbrains/kotlin/codegen/BlackBoxCodegenTestGenerated.java index a570aaeab32..bb4393e198a 100644 --- a/compiler/tests/org/jetbrains/kotlin/codegen/BlackBoxCodegenTestGenerated.java +++ b/compiler/tests/org/jetbrains/kotlin/codegen/BlackBoxCodegenTestGenerated.java @@ -8473,6 +8473,18 @@ public class BlackBoxCodegenTestGenerated extends AbstractBlackBoxCodegenTest { doTest(fileName); } + @TestMetadata("entryClassConstructorWithDefaultArguments.kt") + public void testEntryClassConstructorWithDefaultArguments() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/codegen/box/enum/defaultCtor/entryClassConstructorWithDefaultArguments.kt"); + doTest(fileName); + } + + @TestMetadata("entryClassConstructorWithVarargs.kt") + public void testEntryClassConstructorWithVarargs() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/codegen/box/enum/defaultCtor/entryClassConstructorWithVarargs.kt"); + doTest(fileName); + } + @TestMetadata("secondaryConstructorWithDefaultArguments.kt") public void testSecondaryConstructorWithDefaultArguments() throws Exception { String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/codegen/box/enum/defaultCtor/secondaryConstructorWithDefaultArguments.kt"); diff --git a/compiler/tests/org/jetbrains/kotlin/codegen/LightAnalysisModeTestGenerated.java b/compiler/tests/org/jetbrains/kotlin/codegen/LightAnalysisModeTestGenerated.java index 9ccfbb335de..3e409087448 100644 --- a/compiler/tests/org/jetbrains/kotlin/codegen/LightAnalysisModeTestGenerated.java +++ b/compiler/tests/org/jetbrains/kotlin/codegen/LightAnalysisModeTestGenerated.java @@ -8473,6 +8473,18 @@ public class LightAnalysisModeTestGenerated extends AbstractLightAnalysisModeTes doTest(fileName); } + @TestMetadata("entryClassConstructorWithDefaultArguments.kt") + public void testEntryClassConstructorWithDefaultArguments() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/codegen/box/enum/defaultCtor/entryClassConstructorWithDefaultArguments.kt"); + doTest(fileName); + } + + @TestMetadata("entryClassConstructorWithVarargs.kt") + public void testEntryClassConstructorWithVarargs() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/codegen/box/enum/defaultCtor/entryClassConstructorWithVarargs.kt"); + doTest(fileName); + } + @TestMetadata("secondaryConstructorWithDefaultArguments.kt") public void testSecondaryConstructorWithDefaultArguments() throws Exception { String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/codegen/box/enum/defaultCtor/secondaryConstructorWithDefaultArguments.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 c45bbae5828..1ec71fe9208 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 @@ -9145,6 +9145,24 @@ public class JsCodegenBoxTestGenerated extends AbstractJsCodegenBoxTest { doTest(fileName); } + @TestMetadata("entryClassConstructorWithDefaultArguments.kt") + public void testEntryClassConstructorWithDefaultArguments() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/codegen/box/enum/defaultCtor/entryClassConstructorWithDefaultArguments.kt"); + doTest(fileName); + } + + @TestMetadata("entryClassConstructorWithVarargs.kt") + public void testEntryClassConstructorWithVarargs() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/codegen/box/enum/defaultCtor/entryClassConstructorWithVarargs.kt"); + try { + doTest(fileName); + } + catch (Throwable ignore) { + return; + } + throw new AssertionError("Looks like this test can be unmuted. Remove IGNORE_BACKEND directive for that."); + } + @TestMetadata("secondaryConstructorWithDefaultArguments.kt") public void testSecondaryConstructorWithDefaultArguments() throws Exception { String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/codegen/box/enum/defaultCtor/secondaryConstructorWithDefaultArguments.kt");