KT-12707: (JS) proper translation of a constructor in subclass that calls secondary constructor of parent class. Fix #KT-12707

This commit is contained in:
Alexey Andreev
2016-09-14 15:53:59 +03:00
parent b1dc31a64e
commit c1b8e50734
5 changed files with 65 additions and 1 deletions
@@ -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
}
@@ -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"
}
@@ -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");
@@ -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");
@@ -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<JsExpression> 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<JsParameter> translatePrimaryConstructorParameters() {
List<KtParameter> parameterList = getPrimaryConstructorParameters(classDeclaration);