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 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
@@ -665,6 +634,28 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
@@ -740,11 +731,11 @@
-
-
-
-
-
+
+
+
+
+
localhost
@@ -780,7 +771,7 @@
-
+
@@ -796,7 +787,7 @@
-
+
@@ -834,7 +825,7 @@
-
+
@@ -851,6 +842,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;
+}
+