From 209315baad998af9c09a840aca1791529758e5e7 Mon Sep 17 00:00:00 2001 From: Michael Nedzelsky Date: Wed, 18 Jun 2014 12:55:40 +0400 Subject: [PATCH] JS backend: fix translation `when` statement -- now WhenTranslator returns JsBlock instead of hackish adding statements to context block. It fixed the compiler crashing when translating `for`/`when`/`if` with `when` statement(KT-5234) and KT-5058. #KT-5234 fixed #EA-57346 fixed #KT-5058 fixed --- .../k2js/test/semantics/MiscTest.java | 4 +++ .../test/semantics/PatternMatchingTest.java | 16 ++++++++++++ .../translate/expression/WhenTranslator.java | 5 ++-- .../testData/expression/misc/cases/KT-5058.kt | 25 +++++++++++++++++++ .../cases/doWhileWithOneStmWhen.kt | 15 +++++++++++ .../cases/forWithOneStmWhen.kt | 13 ++++++++++ .../patternMatching/cases/ifWithOneStmWhen.kt | 13 ++++++++++ .../cases/whileWithOneStmWhen.kt | 14 +++++++++++ 8 files changed, 103 insertions(+), 2 deletions(-) create mode 100644 js/js.translator/testData/expression/misc/cases/KT-5058.kt create mode 100644 js/js.translator/testData/patternMatching/cases/doWhileWithOneStmWhen.kt create mode 100644 js/js.translator/testData/patternMatching/cases/forWithOneStmWhen.kt create mode 100644 js/js.translator/testData/patternMatching/cases/ifWithOneStmWhen.kt create mode 100644 js/js.translator/testData/patternMatching/cases/whileWithOneStmWhen.kt diff --git a/js/js.tests/test/org/jetbrains/k2js/test/semantics/MiscTest.java b/js/js.tests/test/org/jetbrains/k2js/test/semantics/MiscTest.java index ecc090ab29a..a6f3f105edf 100644 --- a/js/js.tests/test/org/jetbrains/k2js/test/semantics/MiscTest.java +++ b/js/js.tests/test/org/jetbrains/k2js/test/semantics/MiscTest.java @@ -190,4 +190,8 @@ public final class MiscTest extends AbstractExpressionTest { public void testStringInterpolationEvaluationOrder() throws Exception { fooBoxTest(); } + + public void testKt5058() throws Exception { + checkFooBoxIsTrue("KT-5058.kt"); + } } diff --git a/js/js.tests/test/org/jetbrains/k2js/test/semantics/PatternMatchingTest.java b/js/js.tests/test/org/jetbrains/k2js/test/semantics/PatternMatchingTest.java index bc76c3d1bf0..755dce1002d 100644 --- a/js/js.tests/test/org/jetbrains/k2js/test/semantics/PatternMatchingTest.java +++ b/js/js.tests/test/org/jetbrains/k2js/test/semantics/PatternMatchingTest.java @@ -89,4 +89,20 @@ public final class PatternMatchingTest extends SingleFileTranslationTest { public void testIfInWhen() throws Exception { checkFooBoxIsOk(); } + + public void testForWithOneStmWhen() throws Exception { + fooBoxTest(); + } + + public void testWhileWithOneStmWhen() throws Exception { + fooBoxTest(); + } + + public void testDoWhileWithOneStmWhen() throws Exception { + fooBoxTest(); + } + + public void testIfWithOneStmWhen() throws Exception { + fooBoxTest(); + } } \ No newline at end of file diff --git a/js/js.translator/src/org/jetbrains/k2js/translate/expression/WhenTranslator.java b/js/js.translator/src/org/jetbrains/k2js/translate/expression/WhenTranslator.java index 31fccce0a60..bd8ce45cdbc 100644 --- a/js/js.translator/src/org/jetbrains/k2js/translate/expression/WhenTranslator.java +++ b/js/js.translator/src/org/jetbrains/k2js/translate/expression/WhenTranslator.java @@ -40,8 +40,9 @@ public final class WhenTranslator extends AbstractTranslator { WhenTranslator translator = new WhenTranslator(expression, context); if (BindingUtils.isStatement(context.bindingContext(), expression)) { - translator.translateAsStatement(context.dynamicContext().jsBlock().getStatements()); - return null; + JsBlock jsBlock = new JsBlock(); + translator.translateAsStatement(jsBlock.getStatements()); + return jsBlock; } return translator.translateAsExpression(); diff --git a/js/js.translator/testData/expression/misc/cases/KT-5058.kt b/js/js.translator/testData/expression/misc/cases/KT-5058.kt new file mode 100644 index 00000000000..f4280804cad --- /dev/null +++ b/js/js.translator/testData/expression/misc/cases/KT-5058.kt @@ -0,0 +1,25 @@ +package foo + +fun test():Any { + val a: Any = "OK" + val f: Any = + if (true) { + when { + false -> "1" + ((a as? String)?.size ?: 0 > 0) -> a + else -> "2" + } + } + else { + "3" + + } + + return f +} + +fun box(): Boolean { + var result = test() + return result == "OK"; +} + diff --git a/js/js.translator/testData/patternMatching/cases/doWhileWithOneStmWhen.kt b/js/js.translator/testData/patternMatching/cases/doWhileWithOneStmWhen.kt new file mode 100644 index 00000000000..aa9b0e9c8c6 --- /dev/null +++ b/js/js.translator/testData/patternMatching/cases/doWhileWithOneStmWhen.kt @@ -0,0 +1,15 @@ +package foo + + +fun box(): Boolean { + var result = false + var i = 1 + do + when (i) { + 1 -> result = true + else -> result = false + } + while (i==0) + return result; +} + diff --git a/js/js.translator/testData/patternMatching/cases/forWithOneStmWhen.kt b/js/js.translator/testData/patternMatching/cases/forWithOneStmWhen.kt new file mode 100644 index 00000000000..a9adca6a303 --- /dev/null +++ b/js/js.translator/testData/patternMatching/cases/forWithOneStmWhen.kt @@ -0,0 +1,13 @@ +package foo + + +fun box(): Boolean { + var result = false + for (i in array(1)) + when (i) { + 1 -> result = true + else -> result = false + } + return result; +} + diff --git a/js/js.translator/testData/patternMatching/cases/ifWithOneStmWhen.kt b/js/js.translator/testData/patternMatching/cases/ifWithOneStmWhen.kt new file mode 100644 index 00000000000..d901082f6c1 --- /dev/null +++ b/js/js.translator/testData/patternMatching/cases/ifWithOneStmWhen.kt @@ -0,0 +1,13 @@ +package foo + + +fun box(): Boolean { + var result = false + var i = 1 + if (i==1) + when (i) { + 1 -> result = true + else -> result = false + } + return result; +} \ No newline at end of file diff --git a/js/js.translator/testData/patternMatching/cases/whileWithOneStmWhen.kt b/js/js.translator/testData/patternMatching/cases/whileWithOneStmWhen.kt new file mode 100644 index 00000000000..81e9f4e8315 --- /dev/null +++ b/js/js.translator/testData/patternMatching/cases/whileWithOneStmWhen.kt @@ -0,0 +1,14 @@ +package foo + + +fun box(): Boolean { + var result = false + var i = 1 + while(i==1) + when (i) { + 1 -> { result = true; break } + else -> result = false + } + return result; +} +