JS: fix error in generation of if/else statements in some cases
See KT-19495
This commit is contained in:
@@ -644,7 +644,7 @@ public class JsToStringGenerationVisitor extends JsVisitor {
|
|||||||
|
|
||||||
JsStatement thenStmt = x.getThenStatement();
|
JsStatement thenStmt = x.getThenStatement();
|
||||||
JsStatement elseStatement = x.getElseStatement();
|
JsStatement elseStatement = x.getElseStatement();
|
||||||
if (elseStatement != null && thenStmt instanceof JsIf && ((JsIf)thenStmt).getElseStatement() == null) {
|
if (elseStatement != null && isIfWithoutElse(thenStmt)) {
|
||||||
thenStmt = new JsBlock(thenStmt);
|
thenStmt = new JsBlock(thenStmt);
|
||||||
}
|
}
|
||||||
nestedPush(thenStmt);
|
nestedPush(thenStmt);
|
||||||
@@ -680,6 +680,18 @@ public class JsToStringGenerationVisitor extends JsVisitor {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private static boolean isIfWithoutElse(@NotNull JsStatement statement) {
|
||||||
|
while (statement instanceof JsIf) {
|
||||||
|
JsIf ifStatement = (JsIf) statement;
|
||||||
|
if (ifStatement.getElseStatement() == null) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
statement = ifStatement.getElseStatement();
|
||||||
|
}
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void visitInvocation(@NotNull JsInvocation invocation) {
|
public void visitInvocation(@NotNull JsInvocation invocation) {
|
||||||
pushSourceInfo(invocation.getSource());
|
pushSourceInfo(invocation.getSource());
|
||||||
|
|||||||
@@ -2578,6 +2578,12 @@ public class BoxJsTestGenerated extends AbstractBoxJsTest {
|
|||||||
doTest(fileName);
|
doTest(fileName);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@TestMetadata("ifElseCurlyBraces.kt")
|
||||||
|
public void testIfElseCurlyBraces() throws Exception {
|
||||||
|
String fileName = KotlinTestUtils.navigationMetadata("js/js.translator/testData/box/expression/if/ifElseCurlyBraces.kt");
|
||||||
|
doTest(fileName);
|
||||||
|
}
|
||||||
|
|
||||||
@TestMetadata("ifInsideLambda.kt")
|
@TestMetadata("ifInsideLambda.kt")
|
||||||
public void testIfInsideLambda() throws Exception {
|
public void testIfInsideLambda() throws Exception {
|
||||||
String fileName = KotlinTestUtils.navigationMetadata("js/js.translator/testData/box/expression/if/ifInsideLambda.kt");
|
String fileName = KotlinTestUtils.navigationMetadata("js/js.translator/testData/box/expression/if/ifInsideLambda.kt");
|
||||||
|
|||||||
@@ -0,0 +1,24 @@
|
|||||||
|
// EXPECTED_REACHABLE_NODES: 996
|
||||||
|
var log = ""
|
||||||
|
|
||||||
|
fun foo(s: String, a: Int, b: Int) {
|
||||||
|
when (s) {
|
||||||
|
"A" -> if (a > b) {
|
||||||
|
log += "1"
|
||||||
|
}
|
||||||
|
else if (b > a) {
|
||||||
|
log += "2"
|
||||||
|
}
|
||||||
|
"B" -> log += "3"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fun box(): String {
|
||||||
|
foo("A", 3, 2)
|
||||||
|
foo("A", 2, 3)
|
||||||
|
foo("B", 2, 3)
|
||||||
|
|
||||||
|
if (log != "123") return "fail: $log"
|
||||||
|
|
||||||
|
return "OK"
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user