diff --git a/compiler/backend/src/org/jetbrains/kotlin/codegen/FunctionCodegen.java b/compiler/backend/src/org/jetbrains/kotlin/codegen/FunctionCodegen.java index 44e9564615f..ff7e2beb30a 100644 --- a/compiler/backend/src/org/jetbrains/kotlin/codegen/FunctionCodegen.java +++ b/compiler/backend/src/org/jetbrains/kotlin/codegen/FunctionCodegen.java @@ -1207,6 +1207,10 @@ public class FunctionCodegen { @NotNull MemberCodegen parentCodegen, @NotNull Method defaultMethod ) { + if (methodContext instanceof ConstructorContext) { + ((ConstructorContext) methodContext).setThisInitialized(false); + } + GenerationState state = parentCodegen.state; JvmMethodSignature signature = state.getTypeMapper().mapSignatureWithGeneric(functionDescriptor, methodContext.getContextKind()); diff --git a/compiler/backend/src/org/jetbrains/kotlin/codegen/binding/CodegenAnnotatingVisitor.java b/compiler/backend/src/org/jetbrains/kotlin/codegen/binding/CodegenAnnotatingVisitor.java index 05e4dfe4678..1c8a964ae51 100644 --- a/compiler/backend/src/org/jetbrains/kotlin/codegen/binding/CodegenAnnotatingVisitor.java +++ b/compiler/backend/src/org/jetbrains/kotlin/codegen/binding/CodegenAnnotatingVisitor.java @@ -854,6 +854,19 @@ class CodegenAnnotatingVisitor extends KtVisitorVoid { checkSamCall(call); } + @Override + public void visitParameter(@NotNull KtParameter parameter) { + PsiElement parent = parameter.getParent(); // KtParameterList + if (parent != null && parent.getParent() instanceof KtConstructor) { + KtExpression defaultValue = parameter.getDefaultValue(); + if (defaultValue != null) { + withinUninitializedClass(defaultValue, () -> defaultValue.accept(this)); + } + } else { + super.visitParameter(parameter); + } + } + private void withinUninitializedClass(@NotNull KtElement element, @NotNull Runnable operation) { ClassDescriptor currentClass = peekFromStack(classStack); assert currentClass != null : element.getClass().getSimpleName() + " should be inside a class: " + element.getText(); 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 9b6f34829f2..2d873460aa9 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 @@ -4349,6 +4349,16 @@ public class FirBlackBoxCodegenTestGenerated extends AbstractFirBlackBoxCodegenT runTest("compiler/testData/codegen/box/closures/captureInSuperConstructorCall/outerCapturedInObject2.kt"); } + @TestMetadata("outerCapturedInPrimaryConstructorDefaultParameter.kt") + public void testOuterCapturedInPrimaryConstructorDefaultParameter() throws Exception { + runTest("compiler/testData/codegen/box/closures/captureInSuperConstructorCall/outerCapturedInPrimaryConstructorDefaultParameter.kt"); + } + + @TestMetadata("outerCapturedInSecondaryConstructorDefaultParameter.kt") + public void testOuterCapturedInSecondaryConstructorDefaultParameter() throws Exception { + runTest("compiler/testData/codegen/box/closures/captureInSuperConstructorCall/outerCapturedInSecondaryConstructorDefaultParameter.kt"); + } + @TestMetadata("outerEnumEntryCapturedInLambdaInInnerClass.kt") public void testOuterEnumEntryCapturedInLambdaInInnerClass() throws Exception { runTest("compiler/testData/codegen/box/closures/captureInSuperConstructorCall/outerEnumEntryCapturedInLambdaInInnerClass.kt"); diff --git a/compiler/testData/codegen/box/closures/captureInSuperConstructorCall/outerCapturedInPrimaryConstructorDefaultParameter.kt b/compiler/testData/codegen/box/closures/captureInSuperConstructorCall/outerCapturedInPrimaryConstructorDefaultParameter.kt new file mode 100644 index 00000000000..e75a58682fc --- /dev/null +++ b/compiler/testData/codegen/box/closures/captureInSuperConstructorCall/outerCapturedInPrimaryConstructorDefaultParameter.kt @@ -0,0 +1,10 @@ +// IGNORE_BACKEND: JS_IR +// IGNORE_BACKEND_FIR: JVM_IR + +class Outer(val x: Any) { + inner class Inner( + val fn: () -> String = { x.toString() } + ) +} + +fun box() = Outer("OK").Inner().fn() \ No newline at end of file diff --git a/compiler/testData/codegen/box/closures/captureInSuperConstructorCall/outerCapturedInSecondaryConstructorDefaultParameter.kt b/compiler/testData/codegen/box/closures/captureInSuperConstructorCall/outerCapturedInSecondaryConstructorDefaultParameter.kt new file mode 100644 index 00000000000..1508d95f2b0 --- /dev/null +++ b/compiler/testData/codegen/box/closures/captureInSuperConstructorCall/outerCapturedInSecondaryConstructorDefaultParameter.kt @@ -0,0 +1,15 @@ +// IGNORE_BACKEND: JS_IR +// IGNORE_BACKEND_FIR: JVM_IR + +class Outer(val x: Any) { + inner class Inner( + val fn: () -> String + ) { + constructor( + unused: Int, + fn: () -> String = { x.toString() } + ) : this(fn) + } +} + +fun box() = Outer("OK").Inner(1).fn() \ No newline at end of file diff --git a/compiler/tests/org/jetbrains/kotlin/codegen/BlackBoxCodegenTestGenerated.java b/compiler/tests/org/jetbrains/kotlin/codegen/BlackBoxCodegenTestGenerated.java index a5aaa640263..8417ccde734 100644 --- a/compiler/tests/org/jetbrains/kotlin/codegen/BlackBoxCodegenTestGenerated.java +++ b/compiler/tests/org/jetbrains/kotlin/codegen/BlackBoxCodegenTestGenerated.java @@ -4369,6 +4369,16 @@ public class BlackBoxCodegenTestGenerated extends AbstractBlackBoxCodegenTest { runTest("compiler/testData/codegen/box/closures/captureInSuperConstructorCall/outerCapturedInObject2.kt"); } + @TestMetadata("outerCapturedInPrimaryConstructorDefaultParameter.kt") + public void testOuterCapturedInPrimaryConstructorDefaultParameter() throws Exception { + runTest("compiler/testData/codegen/box/closures/captureInSuperConstructorCall/outerCapturedInPrimaryConstructorDefaultParameter.kt"); + } + + @TestMetadata("outerCapturedInSecondaryConstructorDefaultParameter.kt") + public void testOuterCapturedInSecondaryConstructorDefaultParameter() throws Exception { + runTest("compiler/testData/codegen/box/closures/captureInSuperConstructorCall/outerCapturedInSecondaryConstructorDefaultParameter.kt"); + } + @TestMetadata("outerEnumEntryCapturedInLambdaInInnerClass.kt") public void testOuterEnumEntryCapturedInLambdaInInnerClass() throws Exception { runTest("compiler/testData/codegen/box/closures/captureInSuperConstructorCall/outerEnumEntryCapturedInLambdaInInnerClass.kt"); diff --git a/compiler/tests/org/jetbrains/kotlin/codegen/LightAnalysisModeTestGenerated.java b/compiler/tests/org/jetbrains/kotlin/codegen/LightAnalysisModeTestGenerated.java index 60bc87e3d09..84680c830c6 100644 --- a/compiler/tests/org/jetbrains/kotlin/codegen/LightAnalysisModeTestGenerated.java +++ b/compiler/tests/org/jetbrains/kotlin/codegen/LightAnalysisModeTestGenerated.java @@ -4369,6 +4369,16 @@ public class LightAnalysisModeTestGenerated extends AbstractLightAnalysisModeTes runTest("compiler/testData/codegen/box/closures/captureInSuperConstructorCall/outerCapturedInObject2.kt"); } + @TestMetadata("outerCapturedInPrimaryConstructorDefaultParameter.kt") + public void testOuterCapturedInPrimaryConstructorDefaultParameter() throws Exception { + runTest("compiler/testData/codegen/box/closures/captureInSuperConstructorCall/outerCapturedInPrimaryConstructorDefaultParameter.kt"); + } + + @TestMetadata("outerCapturedInSecondaryConstructorDefaultParameter.kt") + public void testOuterCapturedInSecondaryConstructorDefaultParameter() throws Exception { + runTest("compiler/testData/codegen/box/closures/captureInSuperConstructorCall/outerCapturedInSecondaryConstructorDefaultParameter.kt"); + } + @TestMetadata("outerEnumEntryCapturedInLambdaInInnerClass.kt") public void testOuterEnumEntryCapturedInLambdaInInnerClass() throws Exception { runTest("compiler/testData/codegen/box/closures/captureInSuperConstructorCall/outerEnumEntryCapturedInLambdaInInnerClass.kt"); diff --git a/compiler/tests/org/jetbrains/kotlin/codegen/ir/IrBlackBoxCodegenTestGenerated.java b/compiler/tests/org/jetbrains/kotlin/codegen/ir/IrBlackBoxCodegenTestGenerated.java index 2e114811179..0df28d658d9 100644 --- a/compiler/tests/org/jetbrains/kotlin/codegen/ir/IrBlackBoxCodegenTestGenerated.java +++ b/compiler/tests/org/jetbrains/kotlin/codegen/ir/IrBlackBoxCodegenTestGenerated.java @@ -4349,6 +4349,16 @@ public class IrBlackBoxCodegenTestGenerated extends AbstractIrBlackBoxCodegenTes runTest("compiler/testData/codegen/box/closures/captureInSuperConstructorCall/outerCapturedInObject2.kt"); } + @TestMetadata("outerCapturedInPrimaryConstructorDefaultParameter.kt") + public void testOuterCapturedInPrimaryConstructorDefaultParameter() throws Exception { + runTest("compiler/testData/codegen/box/closures/captureInSuperConstructorCall/outerCapturedInPrimaryConstructorDefaultParameter.kt"); + } + + @TestMetadata("outerCapturedInSecondaryConstructorDefaultParameter.kt") + public void testOuterCapturedInSecondaryConstructorDefaultParameter() throws Exception { + runTest("compiler/testData/codegen/box/closures/captureInSuperConstructorCall/outerCapturedInSecondaryConstructorDefaultParameter.kt"); + } + @TestMetadata("outerEnumEntryCapturedInLambdaInInnerClass.kt") public void testOuterEnumEntryCapturedInLambdaInInnerClass() throws Exception { runTest("compiler/testData/codegen/box/closures/captureInSuperConstructorCall/outerEnumEntryCapturedInLambdaInInnerClass.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 fb6bbd2c925..c4ed607700e 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 @@ -3609,6 +3609,16 @@ public class IrJsCodegenBoxTestGenerated extends AbstractIrJsCodegenBoxTest { runTest("compiler/testData/codegen/box/closures/captureInSuperConstructorCall/outerCapturedInObject2.kt"); } + @TestMetadata("outerCapturedInPrimaryConstructorDefaultParameter.kt") + public void testOuterCapturedInPrimaryConstructorDefaultParameter() throws Exception { + runTest("compiler/testData/codegen/box/closures/captureInSuperConstructorCall/outerCapturedInPrimaryConstructorDefaultParameter.kt"); + } + + @TestMetadata("outerCapturedInSecondaryConstructorDefaultParameter.kt") + public void testOuterCapturedInSecondaryConstructorDefaultParameter() throws Exception { + runTest("compiler/testData/codegen/box/closures/captureInSuperConstructorCall/outerCapturedInSecondaryConstructorDefaultParameter.kt"); + } + @TestMetadata("outerEnumEntryCapturedInLambdaInInnerClass.kt") public void testOuterEnumEntryCapturedInLambdaInInnerClass() throws Exception { runTest("compiler/testData/codegen/box/closures/captureInSuperConstructorCall/outerEnumEntryCapturedInLambdaInInnerClass.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 a730a9ad736..c313e7a18d6 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 @@ -3609,6 +3609,16 @@ public class JsCodegenBoxTestGenerated extends AbstractJsCodegenBoxTest { runTest("compiler/testData/codegen/box/closures/captureInSuperConstructorCall/outerCapturedInObject2.kt"); } + @TestMetadata("outerCapturedInPrimaryConstructorDefaultParameter.kt") + public void testOuterCapturedInPrimaryConstructorDefaultParameter() throws Exception { + runTest("compiler/testData/codegen/box/closures/captureInSuperConstructorCall/outerCapturedInPrimaryConstructorDefaultParameter.kt"); + } + + @TestMetadata("outerCapturedInSecondaryConstructorDefaultParameter.kt") + public void testOuterCapturedInSecondaryConstructorDefaultParameter() throws Exception { + runTest("compiler/testData/codegen/box/closures/captureInSuperConstructorCall/outerCapturedInSecondaryConstructorDefaultParameter.kt"); + } + @TestMetadata("outerEnumEntryCapturedInLambdaInInnerClass.kt") public void testOuterEnumEntryCapturedInLambdaInInnerClass() throws Exception { runTest("compiler/testData/codegen/box/closures/captureInSuperConstructorCall/outerEnumEntryCapturedInLambdaInInnerClass.kt");