JS: fix translation of delegated constructor call from secondary constructor when argument is a complex expression which translates to multiple statements. See KT-15357
This commit is contained in:
@@ -0,0 +1,19 @@
|
|||||||
|
var log = ""
|
||||||
|
|
||||||
|
open class Base(val s: String)
|
||||||
|
|
||||||
|
class A(i: Int) : Base("O" + if (i == 23) {
|
||||||
|
log += "logged"
|
||||||
|
"K"
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
"fail"
|
||||||
|
})
|
||||||
|
|
||||||
|
fun box(): String {
|
||||||
|
val result = A(23).s
|
||||||
|
if (result != "OK") return "fail: $result"
|
||||||
|
if (log != "logged") return "fail log: $log"
|
||||||
|
|
||||||
|
return "OK"
|
||||||
|
}
|
||||||
+46
@@ -0,0 +1,46 @@
|
|||||||
|
var log = ""
|
||||||
|
|
||||||
|
open class Base(val s: String)
|
||||||
|
|
||||||
|
class A(s: String) : Base(s) {
|
||||||
|
constructor(i: Int) : this("O" + if (i == 23) {
|
||||||
|
log += "logged1;"
|
||||||
|
"K"
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
"fail"
|
||||||
|
})
|
||||||
|
|
||||||
|
constructor(i: Long) : this(if (i == 23L) {
|
||||||
|
log += "logged2;"
|
||||||
|
23
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
42
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
class B : Base {
|
||||||
|
constructor(i: Int) : super("O" + if (i == 23) {
|
||||||
|
log += "logged3;"
|
||||||
|
"K"
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
"fail"
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
fun box(): String {
|
||||||
|
var result = A(23).s
|
||||||
|
if (result != "OK") return "fail1: $result"
|
||||||
|
|
||||||
|
result = A(23L).s
|
||||||
|
if (result != "OK") return "fail2: $result"
|
||||||
|
|
||||||
|
result = B(23).s
|
||||||
|
if (result != "OK") return "fail3: $result"
|
||||||
|
|
||||||
|
if (log != "logged1;logged2;logged1;logged3;") return "fail log: $log"
|
||||||
|
|
||||||
|
return "OK"
|
||||||
|
}
|
||||||
+18
@@ -0,0 +1,18 @@
|
|||||||
|
public final class A {
|
||||||
|
public method <init>(p0: int): void
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
public class Base {
|
||||||
|
private final @org.jetbrains.annotations.NotNull field s: java.lang.String
|
||||||
|
public method <init>(@org.jetbrains.annotations.NotNull p0: java.lang.String): void
|
||||||
|
public final @org.jetbrains.annotations.NotNull method getS(): java.lang.String
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
public final class SuperConstructorCallWithComplexArgKt {
|
||||||
|
private static @org.jetbrains.annotations.NotNull field log: java.lang.String
|
||||||
|
public final static @org.jetbrains.annotations.NotNull method box(): java.lang.String
|
||||||
|
public final static @org.jetbrains.annotations.NotNull method getLog(): java.lang.String
|
||||||
|
public final static method setLog(@org.jetbrains.annotations.NotNull p0: java.lang.String): void
|
||||||
|
}
|
||||||
Vendored
+25
@@ -0,0 +1,25 @@
|
|||||||
|
public final class A {
|
||||||
|
public method <init>(@org.jetbrains.annotations.NotNull p0: java.lang.String): void
|
||||||
|
public method <init>(p0: int): void
|
||||||
|
public method <init>(p0: long): void
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
public final class B {
|
||||||
|
public method <init>(p0: int): void
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
public class Base {
|
||||||
|
private final @org.jetbrains.annotations.NotNull field s: java.lang.String
|
||||||
|
public method <init>(@org.jetbrains.annotations.NotNull p0: java.lang.String): void
|
||||||
|
public final @org.jetbrains.annotations.NotNull method getS(): java.lang.String
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
public final class DelegateWithComplexExpressionKt {
|
||||||
|
private static @org.jetbrains.annotations.NotNull field log: java.lang.String
|
||||||
|
public final static @org.jetbrains.annotations.NotNull method box(): java.lang.String
|
||||||
|
public final static @org.jetbrains.annotations.NotNull method getLog(): java.lang.String
|
||||||
|
public final static method setLog(@org.jetbrains.annotations.NotNull p0: java.lang.String): void
|
||||||
|
}
|
||||||
+12
@@ -3245,6 +3245,12 @@ public class IrBlackBoxCodegenTestGenerated extends AbstractIrBlackBoxCodegenTes
|
|||||||
doTest(fileName);
|
doTest(fileName);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@TestMetadata("superConstructorCallWithComplexArg.kt")
|
||||||
|
public void testSuperConstructorCallWithComplexArg() throws Exception {
|
||||||
|
String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/codegen/box/classes/superConstructorCallWithComplexArg.kt");
|
||||||
|
doTest(fileName);
|
||||||
|
}
|
||||||
|
|
||||||
@TestMetadata("typedDelegation.kt")
|
@TestMetadata("typedDelegation.kt")
|
||||||
public void testTypedDelegation() throws Exception {
|
public void testTypedDelegation() throws Exception {
|
||||||
String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/codegen/box/classes/typedDelegation.kt");
|
String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/codegen/box/classes/typedDelegation.kt");
|
||||||
@@ -15464,6 +15470,12 @@ public class IrBlackBoxCodegenTestGenerated extends AbstractIrBlackBoxCodegenTes
|
|||||||
doTest(fileName);
|
doTest(fileName);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@TestMetadata("delegateWithComplexExpression.kt")
|
||||||
|
public void testDelegateWithComplexExpression() throws Exception {
|
||||||
|
String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/codegen/box/secondaryConstructors/delegateWithComplexExpression.kt");
|
||||||
|
doTest(fileName);
|
||||||
|
}
|
||||||
|
|
||||||
@TestMetadata("delegatedThisWithLambda.kt")
|
@TestMetadata("delegatedThisWithLambda.kt")
|
||||||
public void testDelegatedThisWithLambda() throws Exception {
|
public void testDelegatedThisWithLambda() throws Exception {
|
||||||
String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/codegen/box/secondaryConstructors/delegatedThisWithLambda.kt");
|
String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/codegen/box/secondaryConstructors/delegatedThisWithLambda.kt");
|
||||||
|
|||||||
@@ -3245,6 +3245,12 @@ public class BlackBoxCodegenTestGenerated extends AbstractBlackBoxCodegenTest {
|
|||||||
doTest(fileName);
|
doTest(fileName);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@TestMetadata("superConstructorCallWithComplexArg.kt")
|
||||||
|
public void testSuperConstructorCallWithComplexArg() throws Exception {
|
||||||
|
String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/codegen/box/classes/superConstructorCallWithComplexArg.kt");
|
||||||
|
doTest(fileName);
|
||||||
|
}
|
||||||
|
|
||||||
@TestMetadata("typedDelegation.kt")
|
@TestMetadata("typedDelegation.kt")
|
||||||
public void testTypedDelegation() throws Exception {
|
public void testTypedDelegation() throws Exception {
|
||||||
String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/codegen/box/classes/typedDelegation.kt");
|
String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/codegen/box/classes/typedDelegation.kt");
|
||||||
@@ -15464,6 +15470,12 @@ public class BlackBoxCodegenTestGenerated extends AbstractBlackBoxCodegenTest {
|
|||||||
doTest(fileName);
|
doTest(fileName);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@TestMetadata("delegateWithComplexExpression.kt")
|
||||||
|
public void testDelegateWithComplexExpression() throws Exception {
|
||||||
|
String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/codegen/box/secondaryConstructors/delegateWithComplexExpression.kt");
|
||||||
|
doTest(fileName);
|
||||||
|
}
|
||||||
|
|
||||||
@TestMetadata("delegatedThisWithLambda.kt")
|
@TestMetadata("delegatedThisWithLambda.kt")
|
||||||
public void testDelegatedThisWithLambda() throws Exception {
|
public void testDelegatedThisWithLambda() throws Exception {
|
||||||
String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/codegen/box/secondaryConstructors/delegatedThisWithLambda.kt");
|
String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/codegen/box/secondaryConstructors/delegatedThisWithLambda.kt");
|
||||||
|
|||||||
+12
@@ -3245,6 +3245,12 @@ public class LightAnalysisModeCodegenTestGenerated extends AbstractLightAnalysis
|
|||||||
doTest(fileName);
|
doTest(fileName);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@TestMetadata("superConstructorCallWithComplexArg.kt")
|
||||||
|
public void testSuperConstructorCallWithComplexArg() throws Exception {
|
||||||
|
String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/codegen/box/classes/superConstructorCallWithComplexArg.kt");
|
||||||
|
doTest(fileName);
|
||||||
|
}
|
||||||
|
|
||||||
@TestMetadata("typedDelegation.kt")
|
@TestMetadata("typedDelegation.kt")
|
||||||
public void testTypedDelegation() throws Exception {
|
public void testTypedDelegation() throws Exception {
|
||||||
String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/codegen/box/classes/typedDelegation.kt");
|
String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/codegen/box/classes/typedDelegation.kt");
|
||||||
@@ -15464,6 +15470,12 @@ public class LightAnalysisModeCodegenTestGenerated extends AbstractLightAnalysis
|
|||||||
doTest(fileName);
|
doTest(fileName);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@TestMetadata("delegateWithComplexExpression.kt")
|
||||||
|
public void testDelegateWithComplexExpression() throws Exception {
|
||||||
|
String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/codegen/box/secondaryConstructors/delegateWithComplexExpression.kt");
|
||||||
|
doTest(fileName);
|
||||||
|
}
|
||||||
|
|
||||||
@TestMetadata("delegatedThisWithLambda.kt")
|
@TestMetadata("delegatedThisWithLambda.kt")
|
||||||
public void testDelegatedThisWithLambda() throws Exception {
|
public void testDelegatedThisWithLambda() throws Exception {
|
||||||
String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/codegen/box/secondaryConstructors/delegatedThisWithLambda.kt");
|
String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/codegen/box/secondaryConstructors/delegatedThisWithLambda.kt");
|
||||||
|
|||||||
+12
@@ -3996,6 +3996,12 @@ public class JsCodegenBoxTestGenerated extends AbstractJsCodegenBoxTest {
|
|||||||
doTest(fileName);
|
doTest(fileName);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@TestMetadata("superConstructorCallWithComplexArg.kt")
|
||||||
|
public void testSuperConstructorCallWithComplexArg() throws Exception {
|
||||||
|
String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/codegen/box/classes/superConstructorCallWithComplexArg.kt");
|
||||||
|
doTest(fileName);
|
||||||
|
}
|
||||||
|
|
||||||
@TestMetadata("typedDelegation.kt")
|
@TestMetadata("typedDelegation.kt")
|
||||||
public void testTypedDelegation() throws Exception {
|
public void testTypedDelegation() throws Exception {
|
||||||
String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/codegen/box/classes/typedDelegation.kt");
|
String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/codegen/box/classes/typedDelegation.kt");
|
||||||
@@ -19750,6 +19756,12 @@ public class JsCodegenBoxTestGenerated extends AbstractJsCodegenBoxTest {
|
|||||||
doTest(fileName);
|
doTest(fileName);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@TestMetadata("delegateWithComplexExpression.kt")
|
||||||
|
public void testDelegateWithComplexExpression() throws Exception {
|
||||||
|
String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/codegen/box/secondaryConstructors/delegateWithComplexExpression.kt");
|
||||||
|
doTest(fileName);
|
||||||
|
}
|
||||||
|
|
||||||
@TestMetadata("delegatedThisWithLambda.kt")
|
@TestMetadata("delegatedThisWithLambda.kt")
|
||||||
public void testDelegatedThisWithLambda() throws Exception {
|
public void testDelegatedThisWithLambda() throws Exception {
|
||||||
String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/codegen/box/secondaryConstructors/delegatedThisWithLambda.kt");
|
String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/codegen/box/secondaryConstructors/delegatedThisWithLambda.kt");
|
||||||
|
|||||||
+6
-2
@@ -214,12 +214,13 @@ class ClassTranslator private constructor(
|
|||||||
// Translate constructor body
|
// Translate constructor body
|
||||||
val constructorInitializer = context.getFunctionObject(constructorDescriptor)
|
val constructorInitializer = context.getFunctionObject(constructorDescriptor)
|
||||||
constructorInitializer.name = context.getInnerNameForDescriptor(constructorDescriptor)
|
constructorInitializer.name = context.getInnerNameForDescriptor(constructorDescriptor)
|
||||||
context.addTopLevelStatement(constructorInitializer.makeStmt())
|
context.addDeclarationStatement(constructorInitializer.makeStmt())
|
||||||
FunctionTranslator.newInstance(constructor, context, constructorInitializer).translateAsMethodWithoutMetadata()
|
FunctionTranslator.newInstance(constructor, context, constructorInitializer).translateAsMethodWithoutMetadata()
|
||||||
|
|
||||||
// Translate super/this call
|
// Translate super/this call
|
||||||
val superCallGenerators = mutableListOf<(MutableList<JsStatement>) -> Unit>()
|
val superCallGenerators = mutableListOf<(MutableList<JsStatement>) -> Unit>()
|
||||||
val referenceToClass = context.getInnerReference(classDescriptor)
|
val referenceToClass = context.getInnerReference(classDescriptor)
|
||||||
|
context = context.contextWithScope(constructorInitializer)
|
||||||
|
|
||||||
superCallGenerators += { it += FunctionBodyTranslator.setDefaultValueForArguments(constructorDescriptor, context) }
|
superCallGenerators += { it += FunctionBodyTranslator.setDefaultValueForArguments(constructorDescriptor, context) }
|
||||||
|
|
||||||
@@ -250,8 +251,11 @@ class ClassTranslator private constructor(
|
|||||||
if (resolvedCall != null && !KotlinBuiltIns.isAny(delegationClassDescriptor!!)) {
|
if (resolvedCall != null && !KotlinBuiltIns.isAny(delegationClassDescriptor!!)) {
|
||||||
superCallGenerators += {
|
superCallGenerators += {
|
||||||
val delegationConstructor = resolvedCall.resultingDescriptor
|
val delegationConstructor = resolvedCall.resultingDescriptor
|
||||||
it += CallTranslator.translate(context, resolvedCall)
|
val innerContext = context.innerBlock()
|
||||||
|
val statement = CallTranslator.translate(innerContext, resolvedCall)
|
||||||
.toInvocationWith(leadingArgs, delegationConstructor.valueParameters.size, thisNameRef).makeStmt()
|
.toInvocationWith(leadingArgs, delegationConstructor.valueParameters.size, thisNameRef).makeStmt()
|
||||||
|
it += innerContext.currentBlock.statements
|
||||||
|
it += statement
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user