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
@@ -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);