From ff0efe59f66423fee8da9e028e45a5782f575699 Mon Sep 17 00:00:00 2001 From: Alexey Andreev Date: Thu, 7 Sep 2017 19:21:14 +0300 Subject: [PATCH] JS: fix error in generation of if/else statements in some cases See KT-19495 --- .../backend/JsToStringGenerationVisitor.java | 14 ++++++++++- .../js/test/semantics/BoxJsTestGenerated.java | 6 +++++ .../box/expression/if/ifElseCurlyBraces.kt | 24 +++++++++++++++++++ 3 files changed, 43 insertions(+), 1 deletion(-) create mode 100644 js/js.translator/testData/box/expression/if/ifElseCurlyBraces.kt diff --git a/js/js.ast/src/org/jetbrains/kotlin/js/backend/JsToStringGenerationVisitor.java b/js/js.ast/src/org/jetbrains/kotlin/js/backend/JsToStringGenerationVisitor.java index ea257a966b9..bb6bcd6377d 100644 --- a/js/js.ast/src/org/jetbrains/kotlin/js/backend/JsToStringGenerationVisitor.java +++ b/js/js.ast/src/org/jetbrains/kotlin/js/backend/JsToStringGenerationVisitor.java @@ -644,7 +644,7 @@ public class JsToStringGenerationVisitor extends JsVisitor { JsStatement thenStmt = x.getThenStatement(); JsStatement elseStatement = x.getElseStatement(); - if (elseStatement != null && thenStmt instanceof JsIf && ((JsIf)thenStmt).getElseStatement() == null) { + if (elseStatement != null && isIfWithoutElse(thenStmt)) { thenStmt = new JsBlock(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 public void visitInvocation(@NotNull JsInvocation invocation) { pushSourceInfo(invocation.getSource()); diff --git a/js/js.tests/test/org/jetbrains/kotlin/js/test/semantics/BoxJsTestGenerated.java b/js/js.tests/test/org/jetbrains/kotlin/js/test/semantics/BoxJsTestGenerated.java index c84682fbdbd..86d72e5a374 100644 --- a/js/js.tests/test/org/jetbrains/kotlin/js/test/semantics/BoxJsTestGenerated.java +++ b/js/js.tests/test/org/jetbrains/kotlin/js/test/semantics/BoxJsTestGenerated.java @@ -2578,6 +2578,12 @@ public class BoxJsTestGenerated extends AbstractBoxJsTest { 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") public void testIfInsideLambda() throws Exception { String fileName = KotlinTestUtils.navigationMetadata("js/js.translator/testData/box/expression/if/ifInsideLambda.kt"); diff --git a/js/js.translator/testData/box/expression/if/ifElseCurlyBraces.kt b/js/js.translator/testData/box/expression/if/ifElseCurlyBraces.kt new file mode 100644 index 00000000000..e0fa3cc9fb8 --- /dev/null +++ b/js/js.translator/testData/box/expression/if/ifElseCurlyBraces.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" +} \ No newline at end of file