Added support for multiple cases in one when entry.

This commit is contained in:
Pavel Talanov
2011-11-18 12:38:06 +04:00
parent d1c49f80c8
commit 95ab245f15
3 changed files with 31 additions and 8 deletions
@@ -3,6 +3,7 @@ package org.jetbrains.k2js.translate;
import com.google.dart.compiler.backend.js.ast.*;
import com.google.dart.compiler.util.AstUtil;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import org.jetbrains.jet.lang.psi.*;
import java.util.ArrayList;
@@ -105,13 +106,35 @@ public class WhenTranslator extends AbstractTranslator {
//TODO: ask what these conditions mean
@NotNull
private JsExpression translateConditions(@NotNull JetWhenEntry entry) {
JetWhenCondition[] conditions = entry.getConditions();
// for (JetWhenCondition condition : conditions) {
// translateCondition(condition);
// }
return translateCondition(conditions[0]);
List<JsExpression> conditions = new ArrayList<JsExpression>();
for (JetWhenCondition condition : entry.getConditions()) {
conditions.add(translateCondition(condition));
}
return anyOfThemIsTrue(conditions);
}
@NotNull
private JsExpression anyOfThemIsTrue(List<JsExpression> conditions) {
assert !conditions.isEmpty() : "When entry (not else) should have at least one condition";
JsExpression current = null;
for (JsExpression condition : conditions) {
current = addCaseCondition(current, condition);
}
assert current != null;
return current;
}
@NotNull
private JsExpression addCaseCondition(@Nullable JsExpression current, @NotNull JsExpression condition) {
if (current == null) {
current = condition;
} else {
current = new JsBinaryOperation(JsBinaryOperator.OR, current, condition);
}
return current;
}
@NotNull
private JsExpression translateCondition(@NotNull JetWhenCondition condition) {
if (condition instanceof JetWhenConditionIsPattern) {
@@ -46,7 +46,7 @@ public final class PatternMatchingTest extends IncludeLibraryTest {
@Test
public void multipleCases() throws Exception {
testFooBoxIsTrue("multipleCases.kt");
testFunctionOutput("multipleCases.kt", "foo", "box", 2.0);
}
}
@@ -1,6 +1,6 @@
namespace foo
fun box() : Boolean {
fun box() : Int {
val c = 3
val d = 5
var z = 0
@@ -13,5 +13,5 @@ fun box() : Boolean {
is 5, is 3 => z++;
else => z = -1000;
}
return c == 2
return z
}