diff --git a/.idea/workspace.xml b/.idea/workspace.xml index 237b96ffdaa..d960230bdc0 100644 --- a/.idea/workspace.xml +++ b/.idea/workspace.xml @@ -6,13 +6,13 @@ - - + + + + - - @@ -105,7 +105,7 @@ - + @@ -196,7 +196,7 @@ - + @@ -204,10 +204,46 @@ - - + + - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -216,70 +252,25 @@ - + - - + + - + - - + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + @@ -301,11 +292,6 @@ @@ -555,28 +546,6 @@ - - - - - - - - - + + + + + + + + + - - - - - + + + + + localhost @@ -780,7 +771,7 @@ - + @@ -796,7 +787,7 @@ - + @@ -834,7 +825,7 @@ @@ -860,91 +852,6 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - @@ -952,13 +859,6 @@ - - - - - - - @@ -975,7 +875,88 @@ - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/translator/src/org/jetbrains/k2js/translate/ExpressionVisitor.java b/translator/src/org/jetbrains/k2js/translate/ExpressionVisitor.java index a8932aec233..3be265225f8 100644 --- a/translator/src/org/jetbrains/k2js/translate/ExpressionVisitor.java +++ b/translator/src/org/jetbrains/k2js/translate/ExpressionVisitor.java @@ -177,26 +177,26 @@ public final class ExpressionVisitor extends TranslatorVisitor { @NotNull public JsNode visitIfExpression(@NotNull JetIfExpression expression, @NotNull TranslationContext context) { JsIf result = new JsIf(); - result.setIfExpr(translateIfExpression(expression, context)); - result.setThenStmt(translateThenStatement(expression, context)); + result.setIfExpr(translateConditionExpression(expression.getCondition(), context)); + result.setThenStmt(translateNullableExpressionToNotNullStatement(expression.getThen(), context)); result.setElseStmt(translateElseStatement(expression, context)); return result; } @NotNull - private JsExpression translateIfExpression(@NotNull JetIfExpression expression, - @NotNull TranslationContext context) { - JsNode jsCondition = translateNullableExpression(expression.getCondition(), context); + private JsExpression translateConditionExpression(@Nullable JetExpression expression, + @NotNull TranslationContext context) { + JsNode jsCondition = translateNullableExpression(expression, context); if (jsCondition == context.program().getEmptyStmt()) { - throw new AssertionError("Empty condition in if clause!"); + throw new AssertionError("Empty condition clause!"); } return AstUtil.convertToExpression(jsCondition); } @NotNull - private JsStatement translateThenStatement(@NotNull JetIfExpression expression, - @NotNull TranslationContext context) { - return AstUtil.convertToStatement(translateNullableExpression(expression.getThen(), context)); + private JsStatement translateNullableExpressionToNotNullStatement(@NotNull JetExpression expression, + @NotNull TranslationContext context) { + return AstUtil.convertToStatement(translateNullableExpression(expression, context)); } @Nullable @@ -217,4 +217,24 @@ public final class ExpressionVisitor extends TranslatorVisitor { return expression.accept(this, context); } + @Override + @NotNull + public JsNode visitWhileExpression(@NotNull JetWhileExpression expression, @NotNull TranslationContext context) { + JsWhile result = new JsWhile(); + result.setCondition(translateConditionExpression(expression.getCondition(), context)); + result.setBody(translateNullableExpressionToNotNullStatement(expression.getBody(), context)); + return result; + } + + @Override + @NotNull + public JsNode visitDoWhileExpression(@NotNull JetDoWhileExpression expression, @NotNull TranslationContext context) { + JsDoWhile result = new JsDoWhile(); + result.setCondition(translateConditionExpression(expression.getCondition(), context)); + result.setBody(translateNullableExpressionToNotNullStatement(expression.getBody(), context)); + return result; + } + + + } diff --git a/translator/test/org/jetbrains/k2js/test/FunctionTest.java b/translator/test/org/jetbrains/k2js/test/FunctionTest.java index 96c697eeb22..8904119e983 100644 --- a/translator/test/org/jetbrains/k2js/test/FunctionTest.java +++ b/translator/test/org/jetbrains/k2js/test/FunctionTest.java @@ -28,13 +28,35 @@ public final class FunctionTest extends TranslationTest { } @Test - public void ifElseTest() throws Exception { + public void ifElse() throws Exception { performTest("if.kt", "foo", "box", 5); } @Test - public void ifElseIfTest() throws Exception { + public void ifElseIf() throws Exception { performTest("elseif.kt", "foo", "box", 5); } + @Test + public void whileSimpleTest() throws Exception { + testFooBoxIsTrue("while.kt"); + } + + @Test + public void doWhileSimpleTest() throws Exception { + testFooBoxIsTrue("doWhile.kt"); + } + + @Test + public void doWhileExecutesAtLeastOnce() throws Exception { + testFooBoxIsTrue("doWhile2.kt"); + } + + @Test + public void whileDoesntExecuteEvenOnceIfConditionIsFalse() throws Exception { + testFooBoxIsTrue("while2.kt"); + } + + + } diff --git a/translator/test_files/test_cases/doWhile.kt b/translator/test_files/test_cases/doWhile.kt new file mode 100644 index 00000000000..00307c58ffa --- /dev/null +++ b/translator/test_files/test_cases/doWhile.kt @@ -0,0 +1,17 @@ +namespace foo + +fun box() : Boolean { + + val a = 50; + var b = 0; + var c = 0; + do { + b = b + 1; + c = c + 2; + } while (b < a) + if (c == 100) { + return true; + } + return false; +} + diff --git a/translator/test_files/test_cases/doWhile2.kt b/translator/test_files/test_cases/doWhile2.kt new file mode 100644 index 00000000000..5be92df7bd6 --- /dev/null +++ b/translator/test_files/test_cases/doWhile2.kt @@ -0,0 +1,13 @@ +namespace foo + +fun box() : Boolean { + var x = 2; + do { + x = 1; + } while(3 < 2) + if (x == 1) { + return true; + } + return false; +} + diff --git a/translator/test_files/test_cases/while.kt b/translator/test_files/test_cases/while.kt new file mode 100644 index 00000000000..0d7e81f6395 --- /dev/null +++ b/translator/test_files/test_cases/while.kt @@ -0,0 +1,17 @@ +namespace foo + +fun box() : Boolean { + + val a = 50; + var b = 0; + var c = 0; + while (b < a) { + b = b + 1; + c = c + 2; + } + if (c == 100) { + return true; + } + return false; +} + diff --git a/translator/test_files/test_cases/while2.kt b/translator/test_files/test_cases/while2.kt new file mode 100644 index 00000000000..8fb8597ecdd --- /dev/null +++ b/translator/test_files/test_cases/while2.kt @@ -0,0 +1,10 @@ +namespace foo + +fun box() : Boolean { + + while(2 < 1) { + return false; + } + return true; +} +