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:
@@ -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);
|
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")
|
@TestMetadata("clashingDefaultConstructors.kt")
|
||||||
public void testClashingDefaultConstructors() throws Exception {
|
public void testClashingDefaultConstructors() throws Exception {
|
||||||
String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/codegen/box/secondaryConstructors/clashingDefaultConstructors.kt");
|
String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/codegen/box/secondaryConstructors/clashingDefaultConstructors.kt");
|
||||||
|
|||||||
+12
@@ -95,6 +95,18 @@ public class SecondaryConstructorTestGenerated extends AbstractSecondaryConstruc
|
|||||||
doTest(fileName);
|
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")
|
@TestMetadata("clashingDefaultConstructors.kt")
|
||||||
public void testClashingDefaultConstructors() throws Exception {
|
public void testClashingDefaultConstructors() throws Exception {
|
||||||
String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/codegen/box/secondaryConstructors/clashingDefaultConstructors.kt");
|
String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/codegen/box/secondaryConstructors/clashingDefaultConstructors.kt");
|
||||||
|
|||||||
+14
-1
@@ -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());
|
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
|
@NotNull
|
||||||
private List<JsParameter> translatePrimaryConstructorParameters() {
|
private List<JsParameter> translatePrimaryConstructorParameters() {
|
||||||
List<KtParameter> parameterList = getPrimaryConstructorParameters(classDeclaration);
|
List<KtParameter> parameterList = getPrimaryConstructorParameters(classDeclaration);
|
||||||
|
|||||||
Reference in New Issue
Block a user