From 629d9a275bf36a5610d131e332818f8646b86936 Mon Sep 17 00:00:00 2001 From: Michael Nedzelsky Date: Tue, 19 Aug 2014 19:14:50 +0400 Subject: [PATCH] JS backend: fix dangling else issue in generated code for JsToStringGenerationVisitor JS backend: fix KT-5253: when with if inside #KT-5253 Fixed --- .../js/JsToStringGenerationVisitor.java | 5 +++- .../k2js/test/semantics/WhenTest.java | 4 +++ .../when/cases/ifInWhenDanglingElseIssue.kt | 27 +++++++++++++++++++ 3 files changed, 35 insertions(+), 1 deletion(-) create mode 100644 js/js.translator/testData/expression/when/cases/ifInWhenDanglingElseIssue.kt diff --git a/js/js.dart-ast/src/com/google/dart/compiler/backend/js/JsToStringGenerationVisitor.java b/js/js.dart-ast/src/com/google/dart/compiler/backend/js/JsToStringGenerationVisitor.java index 28c45fa9aaa..39649dd0ee0 100644 --- a/js/js.dart-ast/src/com/google/dart/compiler/backend/js/JsToStringGenerationVisitor.java +++ b/js/js.dart-ast/src/com/google/dart/compiler/backend/js/JsToStringGenerationVisitor.java @@ -558,10 +558,13 @@ public class JsToStringGenerationVisitor extends JsVisitor { accept(x.getIfExpression()); rightParen(); JsStatement thenStmt = x.getThenStatement(); + JsStatement elseStatement = x.getElseStatement(); + if (elseStatement != null && thenStmt instanceof JsIf && ((JsIf)thenStmt).getElseStatement() == null) { + thenStmt = new JsBlock(thenStmt); + } nestedPush(thenStmt); accept(thenStmt); nestedPop(thenStmt); - JsStatement elseStatement = x.getElseStatement(); if (elseStatement != null) { if (needSemi) { semi(); diff --git a/js/js.tests/test/org/jetbrains/k2js/test/semantics/WhenTest.java b/js/js.tests/test/org/jetbrains/k2js/test/semantics/WhenTest.java index 2155feab807..cc0fd7b5118 100644 --- a/js/js.tests/test/org/jetbrains/k2js/test/semantics/WhenTest.java +++ b/js/js.tests/test/org/jetbrains/k2js/test/semantics/WhenTest.java @@ -108,4 +108,8 @@ public final class WhenTest extends AbstractExpressionTest { public void testWhenWithOneStmWhen() throws Exception { fooBoxTest(); } + + public void testIfInWhenDanglingElseIssue() throws Exception { + checkFooBoxIsOk(); + } } diff --git a/js/js.translator/testData/expression/when/cases/ifInWhenDanglingElseIssue.kt b/js/js.translator/testData/expression/when/cases/ifInWhenDanglingElseIssue.kt new file mode 100644 index 00000000000..ddff26549c0 --- /dev/null +++ b/js/js.translator/testData/expression/when/cases/ifInWhenDanglingElseIssue.kt @@ -0,0 +1,27 @@ +// http://youtrack.jetbrains.com/issue/KT-5253 +// JS: generated wrong code when use `if` inside `when` + +package foo + + +fun test(caseId: Int, value: Int, expected: Int) { + var actual: Int = 0 + when (caseId) { + 2 -> if (value < 0) actual = -value + 3 -> actual = if (value < 0) {-value} else value + else -> throw Exception("Unexpected case: $caseId") + } + + if (expected != actual) throw Exception("expected = $expected, actual = $actual") +} + + +fun box(): String { + + test(2, 33, 0) + test(2, -1, 1) + test(3, 23, 23) + test(3, -3, 3) + + return "OK" +} \ No newline at end of file