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);
|
||||
}
|
||||
|
||||
@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");
|
||||
|
||||
+12
@@ -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");
|
||||
|
||||
+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());
|
||||
}
|
||||
|
||||
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);
|
||||
|
||||
Reference in New Issue
Block a user