diff --git a/compiler/backend/src/org/jetbrains/kotlin/codegen/ExpressionCodegen.java b/compiler/backend/src/org/jetbrains/kotlin/codegen/ExpressionCodegen.java index 40af774d941..dbe4cd3d150 100644 --- a/compiler/backend/src/org/jetbrains/kotlin/codegen/ExpressionCodegen.java +++ b/compiler/backend/src/org/jetbrains/kotlin/codegen/ExpressionCodegen.java @@ -1736,7 +1736,7 @@ public class ExpressionCodegen extends KtVisitor impleme if (descriptor instanceof ClassDescriptor) { ClassDescriptor classDescriptor = (ClassDescriptor) descriptor; - if (isPossiblyUninitializedSingleton(classDescriptor) && isInsideSingleton(classDescriptor)) { + if (shouldGenerateSingletonAsThisOrOuterFromContext(classDescriptor)) { return generateThisOrOuterFromContext(classDescriptor, false, false); } if (isObject(classDescriptor)) { @@ -1759,6 +1759,27 @@ public class ExpressionCodegen extends KtVisitor impleme throw new UnsupportedOperationException("don't know how to generate reference " + descriptor); } + private boolean shouldGenerateSingletonAsThisOrOuterFromContext(ClassDescriptor classDescriptor) { + return isPossiblyUninitializedSingleton(classDescriptor) && + isInsideSingleton(classDescriptor) && + isThisInitialized(classDescriptor); + } + + private boolean isThisInitialized(ClassDescriptor classDescriptor) { + CodegenContext context = this.context; + while (context != null) { + if (context instanceof ConstructorContext) { + ConstructorContext constructorContext = (ConstructorContext) context; + ClassDescriptor constructedClass = constructorContext.getConstructorDescriptor().getConstructedClass(); + if (constructedClass == classDescriptor) { + return constructorContext.isThisInitialized(); + } + } + context = context.getParentContext(); + } + return true; + } + @Nullable private StackValue applyIntrinsic( DeclarationDescriptor descriptor, @@ -2601,7 +2622,7 @@ public class ExpressionCodegen extends KtVisitor impleme !CodegenUtilKt.isJvmStaticInObjectOrClass(context.getFunctionDescriptor())) { return StackValue.local(0, typeMapper.mapType(calleeContainingClass)); } - else if (CodegenUtilKt.isPossiblyUninitializedSingleton(calleeContainingClass) && isInsideSingleton(calleeContainingClass)) { + else if (shouldGenerateSingletonAsThisOrOuterFromContext(calleeContainingClass)) { return generateThisOrOuterFromContext(calleeContainingClass, isSuper, forceOuter); } else if (isEnumEntry(calleeContainingClass)) { diff --git a/compiler/backend/src/org/jetbrains/kotlin/codegen/ImplementationBodyCodegen.java b/compiler/backend/src/org/jetbrains/kotlin/codegen/ImplementationBodyCodegen.java index db60016cd46..e1cb8cf1f11 100644 --- a/compiler/backend/src/org/jetbrains/kotlin/codegen/ImplementationBodyCodegen.java +++ b/compiler/backend/src/org/jetbrains/kotlin/codegen/ImplementationBodyCodegen.java @@ -1382,10 +1382,28 @@ public class ImplementationBodyCodegen extends ClassBodyCodegen { @NotNull ClassConstructorDescriptor constructorDescriptor, @Nullable ResolvedCall delegationConstructorCall ) { + MethodContext codegenContext = codegen.context; + assert codegenContext instanceof ConstructorContext : + "Constructor context expected: " + codegenContext; + assert !((ConstructorContext) codegenContext).isThisInitialized() : + "Delegating constructor call is already generated for " + ((ConstructorContext) codegenContext).getConstructorDescriptor(); + if (delegationConstructorCall == null) { genSimpleSuperCall(iv); - return; } + else { + generateDelegationConstructorCall(iv, codegen, constructorDescriptor, delegationConstructorCall); + } + + ((ConstructorContext) codegenContext).setThisInitialized(true); + } + + private void generateDelegationConstructorCall( + @NotNull InstructionAdapter iv, + @NotNull ExpressionCodegen codegen, + @NotNull ClassConstructorDescriptor constructorDescriptor, + @NotNull ResolvedCall delegationConstructorCall + ) { iv.load(0, OBJECT_TYPE); ConstructorDescriptor delegateConstructor = SamCodegenUtil.resolveSamAdapter(codegen.getConstructorDescriptor(delegationConstructorCall)); diff --git a/compiler/backend/src/org/jetbrains/kotlin/codegen/context/ConstructorContext.java b/compiler/backend/src/org/jetbrains/kotlin/codegen/context/ConstructorContext.java index 6980b4a404d..3f00b96179d 100644 --- a/compiler/backend/src/org/jetbrains/kotlin/codegen/context/ConstructorContext.java +++ b/compiler/backend/src/org/jetbrains/kotlin/codegen/context/ConstructorContext.java @@ -27,6 +27,7 @@ import static org.jetbrains.kotlin.resolve.jvm.AsmTypes.OBJECT_TYPE; public class ConstructorContext extends MethodContext { private static final StackValue LOCAL_1 = StackValue.local(1, OBJECT_TYPE); + private boolean thisInitialized = false; public ConstructorContext( @NotNull ConstructorDescriptor contextDescriptor, @@ -46,6 +47,18 @@ public class ConstructorContext extends MethodContext { return stackValue; } + public ConstructorDescriptor getConstructorDescriptor() { + return (ConstructorDescriptor) getContextDescriptor(); + } + + public boolean isThisInitialized() { + return thisInitialized; + } + + public void setThisInitialized(boolean thisInitialized) { + this.thisInitialized = thisInitialized; + } + @Override public String toString() { return "Constructor: " + getContextDescriptor(); diff --git a/compiler/testData/codegen/box/enum/kt20651.kt b/compiler/testData/codegen/box/enum/kt20651.kt new file mode 100644 index 00000000000..8845e4c6d48 --- /dev/null +++ b/compiler/testData/codegen/box/enum/kt20651.kt @@ -0,0 +1,14 @@ +enum class Test(val x: String, val closure1: () -> String) { + FOO("O", { FOO.x }) { + override val y: String = "K" + val closure2 = { y } // Implicit 'FOO' + override val z: String = closure2() + }; + + abstract val y: String + abstract val z: String + + fun test() = closure1() + z +} + +fun box() = Test.FOO.test() \ No newline at end of file diff --git a/compiler/testData/codegen/box/enum/kt20651_inlineLambda.kt b/compiler/testData/codegen/box/enum/kt20651_inlineLambda.kt new file mode 100644 index 00000000000..d1f12734575 --- /dev/null +++ b/compiler/testData/codegen/box/enum/kt20651_inlineLambda.kt @@ -0,0 +1,14 @@ +enum class Test(val x: String, val closure1: () -> String) { + FOO("O", run { { FOO.x } }) { + override val y: String = "K" + val closure2 = { y } // Implicit 'FOO' + override val z: String = closure2() + }; + + abstract val y: String + abstract val z: String + + fun test() = closure1() + z +} + +fun box() = Test.FOO.test() \ No newline at end of file diff --git a/compiler/testData/codegen/box/objects/selfReferenceToCompanionObjectInAnonymousObjectInSuperConstructorCall.kt b/compiler/testData/codegen/box/objects/selfReferenceToCompanionObjectInAnonymousObjectInSuperConstructorCall.kt new file mode 100644 index 00000000000..099a68bfe1f --- /dev/null +++ b/compiler/testData/codegen/box/objects/selfReferenceToCompanionObjectInAnonymousObjectInSuperConstructorCall.kt @@ -0,0 +1,17 @@ +interface IFn { + operator fun invoke(): String +} + +abstract class Base(val fn: IFn) + +class Host { + companion object : Base( + object : IFn { + override fun invoke(): String = Host.ok() + } + ) { + fun ok() = "OK" + } +} + +fun box() = Host.Companion.fn() \ No newline at end of file diff --git a/compiler/testData/codegen/box/objects/selfReferenceToCompanionObjectInInlineLambdaInConstructorBody.kt b/compiler/testData/codegen/box/objects/selfReferenceToCompanionObjectInInlineLambdaInConstructorBody.kt new file mode 100644 index 00000000000..892e82811a1 --- /dev/null +++ b/compiler/testData/codegen/box/objects/selfReferenceToCompanionObjectInInlineLambdaInConstructorBody.kt @@ -0,0 +1,9 @@ +class Test { + companion object { + fun ok() = "OK" + val x = run { Test.ok() } + fun test() = x + } +} + +fun box() = Test.test() \ No newline at end of file diff --git a/compiler/testData/codegen/box/objects/selfReferenceToCompanionObjectInInlineLambdaInSuperConstructorCall.kt b/compiler/testData/codegen/box/objects/selfReferenceToCompanionObjectInInlineLambdaInSuperConstructorCall.kt new file mode 100644 index 00000000000..fc2a08dd42e --- /dev/null +++ b/compiler/testData/codegen/box/objects/selfReferenceToCompanionObjectInInlineLambdaInSuperConstructorCall.kt @@ -0,0 +1,9 @@ +abstract class Base(val fn: () -> String) + +class Host { + companion object : Base(run { { Host.ok() } }) { + fun ok() = "OK" + } +} + +fun box() = Host.Companion.fn() \ No newline at end of file diff --git a/compiler/testData/codegen/box/objects/selfReferenceToCompanionObjectInLambdaInSuperConstructorCall.kt b/compiler/testData/codegen/box/objects/selfReferenceToCompanionObjectInLambdaInSuperConstructorCall.kt new file mode 100644 index 00000000000..ff1e7b7f631 --- /dev/null +++ b/compiler/testData/codegen/box/objects/selfReferenceToCompanionObjectInLambdaInSuperConstructorCall.kt @@ -0,0 +1,9 @@ +abstract class Base(val fn: () -> String) + +class Host { + companion object : Base({ Host.ok() }) { + fun ok() = "OK" + } +} + +fun box() = Host.Companion.fn() \ No newline at end of file diff --git a/compiler/testData/codegen/box/objects/selfReferenceToInterfaceCompanionObjectInAnonymousObjectInSuperConstructorCall.kt b/compiler/testData/codegen/box/objects/selfReferenceToInterfaceCompanionObjectInAnonymousObjectInSuperConstructorCall.kt new file mode 100644 index 00000000000..f1b33e5ba20 --- /dev/null +++ b/compiler/testData/codegen/box/objects/selfReferenceToInterfaceCompanionObjectInAnonymousObjectInSuperConstructorCall.kt @@ -0,0 +1,17 @@ +interface IFn { + operator fun invoke(): String +} + +abstract class Base(val fn: IFn) + +interface Host { + companion object : Base( + object : IFn { + override fun invoke(): String = Host.ok() + } + ) { + fun ok() = "OK" + } +} + +fun box() = Host.Companion.fn() \ No newline at end of file diff --git a/compiler/testData/codegen/box/objects/selfReferenceToInterfaceCompanionObjectInInlineLambdaInConstructorBody.kt b/compiler/testData/codegen/box/objects/selfReferenceToInterfaceCompanionObjectInInlineLambdaInConstructorBody.kt new file mode 100644 index 00000000000..faccd52f1a4 --- /dev/null +++ b/compiler/testData/codegen/box/objects/selfReferenceToInterfaceCompanionObjectInInlineLambdaInConstructorBody.kt @@ -0,0 +1,9 @@ +interface Test { + companion object { + fun ok() = "OK" + val x = run { Test.ok() } + fun test() = x + } +} + +fun box() = Test.test() \ No newline at end of file diff --git a/compiler/testData/codegen/box/objects/selfReferenceToInterfaceCompanionObjectInInlineLambdaInSuperConstructorCall.kt b/compiler/testData/codegen/box/objects/selfReferenceToInterfaceCompanionObjectInInlineLambdaInSuperConstructorCall.kt new file mode 100644 index 00000000000..226506094b2 --- /dev/null +++ b/compiler/testData/codegen/box/objects/selfReferenceToInterfaceCompanionObjectInInlineLambdaInSuperConstructorCall.kt @@ -0,0 +1,9 @@ +abstract class Base(val fn: () -> String) + +interface Host { + companion object : Base(run { { Host.ok() } }) { + fun ok() = "OK" + } +} + +fun box() = Host.Companion.fn() \ No newline at end of file diff --git a/compiler/testData/codegen/box/objects/selfReferenceToInterfaceCompanionObjectInLambdaInSuperConstructorCall.kt b/compiler/testData/codegen/box/objects/selfReferenceToInterfaceCompanionObjectInLambdaInSuperConstructorCall.kt new file mode 100644 index 00000000000..a6e6f034c26 --- /dev/null +++ b/compiler/testData/codegen/box/objects/selfReferenceToInterfaceCompanionObjectInLambdaInSuperConstructorCall.kt @@ -0,0 +1,9 @@ +abstract class Base(val fn: () -> String) + +interface Host { + companion object : Base({ Host.ok() }) { + fun ok() = "OK" + } +} + +fun box() = Host.Companion.fn() \ No newline at end of file diff --git a/compiler/testData/codegen/box/objects/selfReferenceToObjectInAnonymousObjectInSuperConstructorCall.kt b/compiler/testData/codegen/box/objects/selfReferenceToObjectInAnonymousObjectInSuperConstructorCall.kt new file mode 100644 index 00000000000..2239c1b09e9 --- /dev/null +++ b/compiler/testData/codegen/box/objects/selfReferenceToObjectInAnonymousObjectInSuperConstructorCall.kt @@ -0,0 +1,15 @@ +interface IFn { + operator fun invoke(): String +} + +abstract class Base(val fn: IFn) + +object Test : Base( + object : IFn { + override fun invoke(): String = Test.ok() + } +) { + fun ok() = "OK" +} + +fun box() = Test.fn() \ No newline at end of file diff --git a/compiler/testData/codegen/box/objects/selfReferenceToObjectInInlineLambdaInConstructorBody.kt b/compiler/testData/codegen/box/objects/selfReferenceToObjectInInlineLambdaInConstructorBody.kt new file mode 100644 index 00000000000..88cfbb44f32 --- /dev/null +++ b/compiler/testData/codegen/box/objects/selfReferenceToObjectInInlineLambdaInConstructorBody.kt @@ -0,0 +1,7 @@ +object Test { + fun ok() = "OK" + val x = run { Test.ok() } + fun test() = x +} + +fun box() = Test.test() \ No newline at end of file diff --git a/compiler/testData/codegen/box/objects/selfReferenceToObjectInInlineLambdaInSuperConstructorCall.kt b/compiler/testData/codegen/box/objects/selfReferenceToObjectInInlineLambdaInSuperConstructorCall.kt new file mode 100644 index 00000000000..045499084e6 --- /dev/null +++ b/compiler/testData/codegen/box/objects/selfReferenceToObjectInInlineLambdaInSuperConstructorCall.kt @@ -0,0 +1,7 @@ +abstract class Base(val fn: () -> String) + +object Test : Base(run { { Test.ok() } }) { + fun ok() = "OK" +} + +fun box() = Test.fn() \ No newline at end of file diff --git a/compiler/testData/codegen/box/objects/selfReferenceToObjectInLambdaInSuperConstructorCall.kt b/compiler/testData/codegen/box/objects/selfReferenceToObjectInLambdaInSuperConstructorCall.kt new file mode 100644 index 00000000000..e12b6882c7d --- /dev/null +++ b/compiler/testData/codegen/box/objects/selfReferenceToObjectInLambdaInSuperConstructorCall.kt @@ -0,0 +1,7 @@ +abstract class Base(val fn: () -> String) + +object Test : Base({ Test.ok() }) { + fun ok() = "OK" +} + +fun box() = Test.fn() \ 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 301b9a4d0f5..9e6bbd64845 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 @@ -7982,6 +7982,18 @@ public class IrBlackBoxCodegenTestGenerated extends AbstractIrBlackBoxCodegenTes doTest(fileName); } + @TestMetadata("kt20651.kt") + public void testKt20651() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/codegen/box/enum/kt20651.kt"); + doTest(fileName); + } + + @TestMetadata("kt20651_inlineLambda.kt") + public void testKt20651_inlineLambda() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/codegen/box/enum/kt20651_inlineLambda.kt"); + doTest(fileName); + } + @TestMetadata("kt2350.kt") public void testKt2350() throws Exception { String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/codegen/box/enum/kt2350.kt"); @@ -12191,6 +12203,78 @@ public class IrBlackBoxCodegenTestGenerated extends AbstractIrBlackBoxCodegenTes doTest(fileName); } + @TestMetadata("selfReferenceToCompanionObjectInAnonymousObjectInSuperConstructorCall.kt") + public void testSelfReferenceToCompanionObjectInAnonymousObjectInSuperConstructorCall() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/codegen/box/objects/selfReferenceToCompanionObjectInAnonymousObjectInSuperConstructorCall.kt"); + doTest(fileName); + } + + @TestMetadata("selfReferenceToCompanionObjectInInlineLambdaInConstructorBody.kt") + public void testSelfReferenceToCompanionObjectInInlineLambdaInConstructorBody() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/codegen/box/objects/selfReferenceToCompanionObjectInInlineLambdaInConstructorBody.kt"); + doTest(fileName); + } + + @TestMetadata("selfReferenceToCompanionObjectInInlineLambdaInSuperConstructorCall.kt") + public void testSelfReferenceToCompanionObjectInInlineLambdaInSuperConstructorCall() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/codegen/box/objects/selfReferenceToCompanionObjectInInlineLambdaInSuperConstructorCall.kt"); + doTest(fileName); + } + + @TestMetadata("selfReferenceToCompanionObjectInLambdaInSuperConstructorCall.kt") + public void testSelfReferenceToCompanionObjectInLambdaInSuperConstructorCall() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/codegen/box/objects/selfReferenceToCompanionObjectInLambdaInSuperConstructorCall.kt"); + doTest(fileName); + } + + @TestMetadata("selfReferenceToInterfaceCompanionObjectInAnonymousObjectInSuperConstructorCall.kt") + public void testSelfReferenceToInterfaceCompanionObjectInAnonymousObjectInSuperConstructorCall() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/codegen/box/objects/selfReferenceToInterfaceCompanionObjectInAnonymousObjectInSuperConstructorCall.kt"); + doTest(fileName); + } + + @TestMetadata("selfReferenceToInterfaceCompanionObjectInInlineLambdaInConstructorBody.kt") + public void testSelfReferenceToInterfaceCompanionObjectInInlineLambdaInConstructorBody() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/codegen/box/objects/selfReferenceToInterfaceCompanionObjectInInlineLambdaInConstructorBody.kt"); + doTest(fileName); + } + + @TestMetadata("selfReferenceToInterfaceCompanionObjectInInlineLambdaInSuperConstructorCall.kt") + public void testSelfReferenceToInterfaceCompanionObjectInInlineLambdaInSuperConstructorCall() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/codegen/box/objects/selfReferenceToInterfaceCompanionObjectInInlineLambdaInSuperConstructorCall.kt"); + doTest(fileName); + } + + @TestMetadata("selfReferenceToInterfaceCompanionObjectInLambdaInSuperConstructorCall.kt") + public void testSelfReferenceToInterfaceCompanionObjectInLambdaInSuperConstructorCall() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/codegen/box/objects/selfReferenceToInterfaceCompanionObjectInLambdaInSuperConstructorCall.kt"); + doTest(fileName); + } + + @TestMetadata("selfReferenceToObjectInAnonymousObjectInSuperConstructorCall.kt") + public void testSelfReferenceToObjectInAnonymousObjectInSuperConstructorCall() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/codegen/box/objects/selfReferenceToObjectInAnonymousObjectInSuperConstructorCall.kt"); + doTest(fileName); + } + + @TestMetadata("selfReferenceToObjectInInlineLambdaInConstructorBody.kt") + public void testSelfReferenceToObjectInInlineLambdaInConstructorBody() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/codegen/box/objects/selfReferenceToObjectInInlineLambdaInConstructorBody.kt"); + doTest(fileName); + } + + @TestMetadata("selfReferenceToObjectInInlineLambdaInSuperConstructorCall.kt") + public void testSelfReferenceToObjectInInlineLambdaInSuperConstructorCall() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/codegen/box/objects/selfReferenceToObjectInInlineLambdaInSuperConstructorCall.kt"); + doTest(fileName); + } + + @TestMetadata("selfReferenceToObjectInLambdaInSuperConstructorCall.kt") + public void testSelfReferenceToObjectInLambdaInSuperConstructorCall() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/codegen/box/objects/selfReferenceToObjectInLambdaInSuperConstructorCall.kt"); + doTest(fileName); + } + @TestMetadata("simpleObject.kt") public void testSimpleObject() throws Exception { String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/codegen/box/objects/simpleObject.kt"); diff --git a/compiler/tests/org/jetbrains/kotlin/codegen/BlackBoxCodegenTestGenerated.java b/compiler/tests/org/jetbrains/kotlin/codegen/BlackBoxCodegenTestGenerated.java index d1b2baf72eb..dc57a24c912 100644 --- a/compiler/tests/org/jetbrains/kotlin/codegen/BlackBoxCodegenTestGenerated.java +++ b/compiler/tests/org/jetbrains/kotlin/codegen/BlackBoxCodegenTestGenerated.java @@ -7982,6 +7982,18 @@ public class BlackBoxCodegenTestGenerated extends AbstractBlackBoxCodegenTest { doTest(fileName); } + @TestMetadata("kt20651.kt") + public void testKt20651() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/codegen/box/enum/kt20651.kt"); + doTest(fileName); + } + + @TestMetadata("kt20651_inlineLambda.kt") + public void testKt20651_inlineLambda() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/codegen/box/enum/kt20651_inlineLambda.kt"); + doTest(fileName); + } + @TestMetadata("kt2350.kt") public void testKt2350() throws Exception { String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/codegen/box/enum/kt2350.kt"); @@ -12191,6 +12203,78 @@ public class BlackBoxCodegenTestGenerated extends AbstractBlackBoxCodegenTest { doTest(fileName); } + @TestMetadata("selfReferenceToCompanionObjectInAnonymousObjectInSuperConstructorCall.kt") + public void testSelfReferenceToCompanionObjectInAnonymousObjectInSuperConstructorCall() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/codegen/box/objects/selfReferenceToCompanionObjectInAnonymousObjectInSuperConstructorCall.kt"); + doTest(fileName); + } + + @TestMetadata("selfReferenceToCompanionObjectInInlineLambdaInConstructorBody.kt") + public void testSelfReferenceToCompanionObjectInInlineLambdaInConstructorBody() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/codegen/box/objects/selfReferenceToCompanionObjectInInlineLambdaInConstructorBody.kt"); + doTest(fileName); + } + + @TestMetadata("selfReferenceToCompanionObjectInInlineLambdaInSuperConstructorCall.kt") + public void testSelfReferenceToCompanionObjectInInlineLambdaInSuperConstructorCall() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/codegen/box/objects/selfReferenceToCompanionObjectInInlineLambdaInSuperConstructorCall.kt"); + doTest(fileName); + } + + @TestMetadata("selfReferenceToCompanionObjectInLambdaInSuperConstructorCall.kt") + public void testSelfReferenceToCompanionObjectInLambdaInSuperConstructorCall() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/codegen/box/objects/selfReferenceToCompanionObjectInLambdaInSuperConstructorCall.kt"); + doTest(fileName); + } + + @TestMetadata("selfReferenceToInterfaceCompanionObjectInAnonymousObjectInSuperConstructorCall.kt") + public void testSelfReferenceToInterfaceCompanionObjectInAnonymousObjectInSuperConstructorCall() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/codegen/box/objects/selfReferenceToInterfaceCompanionObjectInAnonymousObjectInSuperConstructorCall.kt"); + doTest(fileName); + } + + @TestMetadata("selfReferenceToInterfaceCompanionObjectInInlineLambdaInConstructorBody.kt") + public void testSelfReferenceToInterfaceCompanionObjectInInlineLambdaInConstructorBody() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/codegen/box/objects/selfReferenceToInterfaceCompanionObjectInInlineLambdaInConstructorBody.kt"); + doTest(fileName); + } + + @TestMetadata("selfReferenceToInterfaceCompanionObjectInInlineLambdaInSuperConstructorCall.kt") + public void testSelfReferenceToInterfaceCompanionObjectInInlineLambdaInSuperConstructorCall() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/codegen/box/objects/selfReferenceToInterfaceCompanionObjectInInlineLambdaInSuperConstructorCall.kt"); + doTest(fileName); + } + + @TestMetadata("selfReferenceToInterfaceCompanionObjectInLambdaInSuperConstructorCall.kt") + public void testSelfReferenceToInterfaceCompanionObjectInLambdaInSuperConstructorCall() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/codegen/box/objects/selfReferenceToInterfaceCompanionObjectInLambdaInSuperConstructorCall.kt"); + doTest(fileName); + } + + @TestMetadata("selfReferenceToObjectInAnonymousObjectInSuperConstructorCall.kt") + public void testSelfReferenceToObjectInAnonymousObjectInSuperConstructorCall() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/codegen/box/objects/selfReferenceToObjectInAnonymousObjectInSuperConstructorCall.kt"); + doTest(fileName); + } + + @TestMetadata("selfReferenceToObjectInInlineLambdaInConstructorBody.kt") + public void testSelfReferenceToObjectInInlineLambdaInConstructorBody() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/codegen/box/objects/selfReferenceToObjectInInlineLambdaInConstructorBody.kt"); + doTest(fileName); + } + + @TestMetadata("selfReferenceToObjectInInlineLambdaInSuperConstructorCall.kt") + public void testSelfReferenceToObjectInInlineLambdaInSuperConstructorCall() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/codegen/box/objects/selfReferenceToObjectInInlineLambdaInSuperConstructorCall.kt"); + doTest(fileName); + } + + @TestMetadata("selfReferenceToObjectInLambdaInSuperConstructorCall.kt") + public void testSelfReferenceToObjectInLambdaInSuperConstructorCall() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/codegen/box/objects/selfReferenceToObjectInLambdaInSuperConstructorCall.kt"); + doTest(fileName); + } + @TestMetadata("simpleObject.kt") public void testSimpleObject() throws Exception { String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/codegen/box/objects/simpleObject.kt"); diff --git a/compiler/tests/org/jetbrains/kotlin/codegen/LightAnalysisModeTestGenerated.java b/compiler/tests/org/jetbrains/kotlin/codegen/LightAnalysisModeTestGenerated.java index 9f0886b30ab..a87331c0240 100644 --- a/compiler/tests/org/jetbrains/kotlin/codegen/LightAnalysisModeTestGenerated.java +++ b/compiler/tests/org/jetbrains/kotlin/codegen/LightAnalysisModeTestGenerated.java @@ -7982,6 +7982,18 @@ public class LightAnalysisModeTestGenerated extends AbstractLightAnalysisModeTes doTest(fileName); } + @TestMetadata("kt20651.kt") + public void testKt20651() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/codegen/box/enum/kt20651.kt"); + doTest(fileName); + } + + @TestMetadata("kt20651_inlineLambda.kt") + public void testKt20651_inlineLambda() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/codegen/box/enum/kt20651_inlineLambda.kt"); + doTest(fileName); + } + @TestMetadata("kt2350.kt") public void testKt2350() throws Exception { String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/codegen/box/enum/kt2350.kt"); @@ -12191,6 +12203,78 @@ public class LightAnalysisModeTestGenerated extends AbstractLightAnalysisModeTes doTest(fileName); } + @TestMetadata("selfReferenceToCompanionObjectInAnonymousObjectInSuperConstructorCall.kt") + public void testSelfReferenceToCompanionObjectInAnonymousObjectInSuperConstructorCall() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/codegen/box/objects/selfReferenceToCompanionObjectInAnonymousObjectInSuperConstructorCall.kt"); + doTest(fileName); + } + + @TestMetadata("selfReferenceToCompanionObjectInInlineLambdaInConstructorBody.kt") + public void testSelfReferenceToCompanionObjectInInlineLambdaInConstructorBody() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/codegen/box/objects/selfReferenceToCompanionObjectInInlineLambdaInConstructorBody.kt"); + doTest(fileName); + } + + @TestMetadata("selfReferenceToCompanionObjectInInlineLambdaInSuperConstructorCall.kt") + public void testSelfReferenceToCompanionObjectInInlineLambdaInSuperConstructorCall() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/codegen/box/objects/selfReferenceToCompanionObjectInInlineLambdaInSuperConstructorCall.kt"); + doTest(fileName); + } + + @TestMetadata("selfReferenceToCompanionObjectInLambdaInSuperConstructorCall.kt") + public void testSelfReferenceToCompanionObjectInLambdaInSuperConstructorCall() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/codegen/box/objects/selfReferenceToCompanionObjectInLambdaInSuperConstructorCall.kt"); + doTest(fileName); + } + + @TestMetadata("selfReferenceToInterfaceCompanionObjectInAnonymousObjectInSuperConstructorCall.kt") + public void testSelfReferenceToInterfaceCompanionObjectInAnonymousObjectInSuperConstructorCall() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/codegen/box/objects/selfReferenceToInterfaceCompanionObjectInAnonymousObjectInSuperConstructorCall.kt"); + doTest(fileName); + } + + @TestMetadata("selfReferenceToInterfaceCompanionObjectInInlineLambdaInConstructorBody.kt") + public void testSelfReferenceToInterfaceCompanionObjectInInlineLambdaInConstructorBody() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/codegen/box/objects/selfReferenceToInterfaceCompanionObjectInInlineLambdaInConstructorBody.kt"); + doTest(fileName); + } + + @TestMetadata("selfReferenceToInterfaceCompanionObjectInInlineLambdaInSuperConstructorCall.kt") + public void testSelfReferenceToInterfaceCompanionObjectInInlineLambdaInSuperConstructorCall() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/codegen/box/objects/selfReferenceToInterfaceCompanionObjectInInlineLambdaInSuperConstructorCall.kt"); + doTest(fileName); + } + + @TestMetadata("selfReferenceToInterfaceCompanionObjectInLambdaInSuperConstructorCall.kt") + public void testSelfReferenceToInterfaceCompanionObjectInLambdaInSuperConstructorCall() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/codegen/box/objects/selfReferenceToInterfaceCompanionObjectInLambdaInSuperConstructorCall.kt"); + doTest(fileName); + } + + @TestMetadata("selfReferenceToObjectInAnonymousObjectInSuperConstructorCall.kt") + public void testSelfReferenceToObjectInAnonymousObjectInSuperConstructorCall() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/codegen/box/objects/selfReferenceToObjectInAnonymousObjectInSuperConstructorCall.kt"); + doTest(fileName); + } + + @TestMetadata("selfReferenceToObjectInInlineLambdaInConstructorBody.kt") + public void testSelfReferenceToObjectInInlineLambdaInConstructorBody() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/codegen/box/objects/selfReferenceToObjectInInlineLambdaInConstructorBody.kt"); + doTest(fileName); + } + + @TestMetadata("selfReferenceToObjectInInlineLambdaInSuperConstructorCall.kt") + public void testSelfReferenceToObjectInInlineLambdaInSuperConstructorCall() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/codegen/box/objects/selfReferenceToObjectInInlineLambdaInSuperConstructorCall.kt"); + doTest(fileName); + } + + @TestMetadata("selfReferenceToObjectInLambdaInSuperConstructorCall.kt") + public void testSelfReferenceToObjectInLambdaInSuperConstructorCall() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/codegen/box/objects/selfReferenceToObjectInLambdaInSuperConstructorCall.kt"); + doTest(fileName); + } + @TestMetadata("simpleObject.kt") public void testSimpleObject() throws Exception { String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/codegen/box/objects/simpleObject.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 c5f27ecf099..fb01342ef9a 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 @@ -8684,6 +8684,18 @@ public class JsCodegenBoxTestGenerated extends AbstractJsCodegenBoxTest { doTest(fileName); } + @TestMetadata("kt20651.kt") + public void testKt20651() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/codegen/box/enum/kt20651.kt"); + doTest(fileName); + } + + @TestMetadata("kt20651_inlineLambda.kt") + public void testKt20651_inlineLambda() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/codegen/box/enum/kt20651_inlineLambda.kt"); + doTest(fileName); + } + @TestMetadata("kt2350.kt") public void testKt2350() throws Exception { String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/codegen/box/enum/kt2350.kt"); @@ -13415,6 +13427,78 @@ public class JsCodegenBoxTestGenerated extends AbstractJsCodegenBoxTest { doTest(fileName); } + @TestMetadata("selfReferenceToCompanionObjectInAnonymousObjectInSuperConstructorCall.kt") + public void testSelfReferenceToCompanionObjectInAnonymousObjectInSuperConstructorCall() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/codegen/box/objects/selfReferenceToCompanionObjectInAnonymousObjectInSuperConstructorCall.kt"); + doTest(fileName); + } + + @TestMetadata("selfReferenceToCompanionObjectInInlineLambdaInConstructorBody.kt") + public void testSelfReferenceToCompanionObjectInInlineLambdaInConstructorBody() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/codegen/box/objects/selfReferenceToCompanionObjectInInlineLambdaInConstructorBody.kt"); + doTest(fileName); + } + + @TestMetadata("selfReferenceToCompanionObjectInInlineLambdaInSuperConstructorCall.kt") + public void testSelfReferenceToCompanionObjectInInlineLambdaInSuperConstructorCall() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/codegen/box/objects/selfReferenceToCompanionObjectInInlineLambdaInSuperConstructorCall.kt"); + doTest(fileName); + } + + @TestMetadata("selfReferenceToCompanionObjectInLambdaInSuperConstructorCall.kt") + public void testSelfReferenceToCompanionObjectInLambdaInSuperConstructorCall() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/codegen/box/objects/selfReferenceToCompanionObjectInLambdaInSuperConstructorCall.kt"); + doTest(fileName); + } + + @TestMetadata("selfReferenceToInterfaceCompanionObjectInAnonymousObjectInSuperConstructorCall.kt") + public void testSelfReferenceToInterfaceCompanionObjectInAnonymousObjectInSuperConstructorCall() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/codegen/box/objects/selfReferenceToInterfaceCompanionObjectInAnonymousObjectInSuperConstructorCall.kt"); + doTest(fileName); + } + + @TestMetadata("selfReferenceToInterfaceCompanionObjectInInlineLambdaInConstructorBody.kt") + public void testSelfReferenceToInterfaceCompanionObjectInInlineLambdaInConstructorBody() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/codegen/box/objects/selfReferenceToInterfaceCompanionObjectInInlineLambdaInConstructorBody.kt"); + doTest(fileName); + } + + @TestMetadata("selfReferenceToInterfaceCompanionObjectInInlineLambdaInSuperConstructorCall.kt") + public void testSelfReferenceToInterfaceCompanionObjectInInlineLambdaInSuperConstructorCall() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/codegen/box/objects/selfReferenceToInterfaceCompanionObjectInInlineLambdaInSuperConstructorCall.kt"); + doTest(fileName); + } + + @TestMetadata("selfReferenceToInterfaceCompanionObjectInLambdaInSuperConstructorCall.kt") + public void testSelfReferenceToInterfaceCompanionObjectInLambdaInSuperConstructorCall() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/codegen/box/objects/selfReferenceToInterfaceCompanionObjectInLambdaInSuperConstructorCall.kt"); + doTest(fileName); + } + + @TestMetadata("selfReferenceToObjectInAnonymousObjectInSuperConstructorCall.kt") + public void testSelfReferenceToObjectInAnonymousObjectInSuperConstructorCall() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/codegen/box/objects/selfReferenceToObjectInAnonymousObjectInSuperConstructorCall.kt"); + doTest(fileName); + } + + @TestMetadata("selfReferenceToObjectInInlineLambdaInConstructorBody.kt") + public void testSelfReferenceToObjectInInlineLambdaInConstructorBody() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/codegen/box/objects/selfReferenceToObjectInInlineLambdaInConstructorBody.kt"); + doTest(fileName); + } + + @TestMetadata("selfReferenceToObjectInInlineLambdaInSuperConstructorCall.kt") + public void testSelfReferenceToObjectInInlineLambdaInSuperConstructorCall() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/codegen/box/objects/selfReferenceToObjectInInlineLambdaInSuperConstructorCall.kt"); + doTest(fileName); + } + + @TestMetadata("selfReferenceToObjectInLambdaInSuperConstructorCall.kt") + public void testSelfReferenceToObjectInLambdaInSuperConstructorCall() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/codegen/box/objects/selfReferenceToObjectInLambdaInSuperConstructorCall.kt"); + doTest(fileName); + } + @TestMetadata("simpleObject.kt") public void testSimpleObject() throws Exception { String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/codegen/box/objects/simpleObject.kt");