diff --git a/compiler/testData/codegen/box/secondaryConstructors/callFromLocalSubClass.kt b/compiler/testData/codegen/box/secondaryConstructors/callFromLocalSubClass.kt new file mode 100644 index 00000000000..e74d65b029d --- /dev/null +++ b/compiler/testData/codegen/box/secondaryConstructors/callFromLocalSubClass.kt @@ -0,0 +1,15 @@ +fun box(): String { + val z = "K" + open class A(val x: String) { + constructor() : this("O") + + val y: String + get() = z + } + + class B : A() + + val b = B() + + return b.x + b.y +} diff --git a/compiler/testData/codegen/box/secondaryConstructors/callFromSubClass.kt b/compiler/testData/codegen/box/secondaryConstructors/callFromSubClass.kt new file mode 100644 index 00000000000..7dd165dbc23 --- /dev/null +++ b/compiler/testData/codegen/box/secondaryConstructors/callFromSubClass.kt @@ -0,0 +1,12 @@ +open class A(val x: String, val z: String) { + constructor(z: String) : this("O", z) +} + +class B(val y: String) : A("_") + +fun box(): String { + val b = B("K") + val result = b.z + b.x + b.y + if (result != "_OK") return "fail: $result" + return "OK" +} \ 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 a2991f3971d..d42f48519c0 100644 --- a/compiler/tests/org/jetbrains/kotlin/codegen/BlackBoxCodegenTestGenerated.java +++ b/compiler/tests/org/jetbrains/kotlin/codegen/BlackBoxCodegenTestGenerated.java @@ -14476,6 +14476,18 @@ public class BlackBoxCodegenTestGenerated extends AbstractBlackBoxCodegenTest { doTest(fileName); } + @TestMetadata("callFromLocalSubClass.kt") + public void testCallFromLocalSubClass() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/codegen/box/secondaryConstructors/callFromLocalSubClass.kt"); + doTest(fileName); + } + + @TestMetadata("callFromSubClass.kt") + public void testCallFromSubClass() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/codegen/box/secondaryConstructors/callFromSubClass.kt"); + doTest(fileName); + } + @TestMetadata("clashingDefaultConstructors.kt") public void testClashingDefaultConstructors() throws Exception { String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/codegen/box/secondaryConstructors/clashingDefaultConstructors.kt"); diff --git a/js/js.tests/test/org/jetbrains/kotlin/js/test/semantics/SecondaryConstructorTestGenerated.java b/js/js.tests/test/org/jetbrains/kotlin/js/test/semantics/SecondaryConstructorTestGenerated.java index e2c64f89ada..b0564c04637 100644 --- a/js/js.tests/test/org/jetbrains/kotlin/js/test/semantics/SecondaryConstructorTestGenerated.java +++ b/js/js.tests/test/org/jetbrains/kotlin/js/test/semantics/SecondaryConstructorTestGenerated.java @@ -95,6 +95,18 @@ public class SecondaryConstructorTestGenerated extends AbstractSecondaryConstruc doTest(fileName); } + @TestMetadata("callFromLocalSubClass.kt") + public void testCallFromLocalSubClass() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/codegen/box/secondaryConstructors/callFromLocalSubClass.kt"); + doTest(fileName); + } + + @TestMetadata("callFromSubClass.kt") + public void testCallFromSubClass() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/codegen/box/secondaryConstructors/callFromSubClass.kt"); + doTest(fileName); + } + @TestMetadata("clashingDefaultConstructors.kt") public void testClashingDefaultConstructors() throws Exception { String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/codegen/box/secondaryConstructors/clashingDefaultConstructors.kt"); diff --git a/js/js.translator/src/org/jetbrains/kotlin/js/translate/initializer/ClassInitializerTranslator.java b/js/js.translator/src/org/jetbrains/kotlin/js/translate/initializer/ClassInitializerTranslator.java index dd0831fcfe7..ad8ddea2de1 100644 --- a/js/js.translator/src/org/jetbrains/kotlin/js/translate/initializer/ClassInitializerTranslator.java +++ b/js/js.translator/src/org/jetbrains/kotlin/js/translate/initializer/ClassInitializerTranslator.java @@ -202,7 +202,12 @@ public final class ClassInitializerTranslator extends AbstractTranslator { } } - addCallToSuperMethod(arguments, initializer); + if (superDescriptor.isPrimary()) { + addCallToSuperMethod(arguments, initializer); + } + else { + addCallToSuperSecondaryConstructor(arguments, superDescriptor); + } } } } @@ -219,6 +224,14 @@ public final class ClassInitializerTranslator extends AbstractTranslator { initFunction.getBody().getStatements().add(call.makeStmt()); } + private void addCallToSuperSecondaryConstructor(@NotNull List arguments, @NotNull ConstructorDescriptor descriptor) { + JsExpression reference = context.getQualifiedReference(descriptor); + JsInvocation call = new JsInvocation(reference); + call.getArguments().addAll(arguments); + call.getArguments().add(JsLiteral.THIS); + initFunction.getBody().getStatements().add(call.makeStmt()); + } + @NotNull private List translatePrimaryConstructorParameters() { List parameterList = getPrimaryConstructorParameters(classDeclaration);