diff --git a/js/src/com/google/dart/compiler/util/AstUtil.java b/js/src/com/google/dart/compiler/util/AstUtil.java index a1ba71ce077..2bc025b1c21 100644 --- a/js/src/com/google/dart/compiler/util/AstUtil.java +++ b/js/src/com/google/dart/compiler/util/AstUtil.java @@ -269,7 +269,7 @@ public class AstUtil { return result; } - public static JsPrefixOperation negation(JsExpression expression) { + public static JsPrefixOperation negated(JsExpression expression) { return new JsPrefixOperation(JsUnaryOperator.NOT, expression); } } diff --git a/translator/src/org/jetbrains/k2js/translate/PatternTranslator.java b/translator/src/org/jetbrains/k2js/translate/PatternTranslator.java index d73984ddc2b..2abb504754d 100644 --- a/translator/src/org/jetbrains/k2js/translate/PatternTranslator.java +++ b/translator/src/org/jetbrains/k2js/translate/PatternTranslator.java @@ -46,7 +46,7 @@ public final class PatternTranslator extends AbstractTranslator { JetPattern pattern = getPattern(expression); JsExpression resultingExpression = translatePattern(pattern, left); if (expression.isNegated()) { - return AstUtil.negation(resultingExpression); + return AstUtil.negated(resultingExpression); } return resultingExpression; } diff --git a/translator/src/org/jetbrains/k2js/translate/WhenTranslator.java b/translator/src/org/jetbrains/k2js/translate/WhenTranslator.java index 9ad7f3205ef..86777d87df2 100644 --- a/translator/src/org/jetbrains/k2js/translate/WhenTranslator.java +++ b/translator/src/org/jetbrains/k2js/translate/WhenTranslator.java @@ -25,6 +25,7 @@ public class WhenTranslator extends AbstractTranslator { private final JsExpression expressionToMatch; @NotNull private final JsName dummyCounterName; + private int currentEntryNumber = 0; private WhenTranslator(@NotNull JetWhenExpression expression, @NotNull TranslationContext context) { super(context); @@ -35,16 +36,27 @@ public class WhenTranslator extends AbstractTranslator { @NotNull JsNode translate() { - return translateEntries(); + JsFor resultingFor = generateDummyFor(); + List entries = translateEntries(); + resultingFor.setBody(AstUtil.newBlock(entries)); + return resultingFor; } - private JsBlock translateEntries() { - //JsFor resultingFor = generateDummyFor(); + @NotNull + private List translateEntries() { List entries = new ArrayList(); for (JetWhenEntry entry : whenExpression.getEntries()) { - entries.add(translateEntry(entry)); + entries.add(surroundWithDummyIf(translateEntry(entry))); } - return AstUtil.newBlock(entries); + return entries; + } + + @NotNull + private JsStatement surroundWithDummyIf(@NotNull JsStatement entryStatement) { + JsExpression stepNumberEqualsCurrentEntryNumber = new JsBinaryOperation(JsBinaryOperator.EQ, + dummyCounterName.makeRef(), translationContext().program().getNumberLiteral(currentEntryNumber)); + currentEntryNumber++; + return new JsIf(stepNumberEqualsCurrentEntryNumber, entryStatement, null); } @NotNull @@ -110,8 +122,12 @@ public class WhenTranslator extends AbstractTranslator { @NotNull private JsExpression translatePatternCondition(@NotNull JetWhenConditionIsPattern condition) { - return Translation.typeOperationTranslator(translationContext()). + JsExpression patternMatchExpression = Translation.typeOperationTranslator(translationContext()). translatePattern(getPattern(condition), expressionToMatch); + if (condition.isNegated()) { + return AstUtil.negated(patternMatchExpression); + } + return patternMatchExpression; } @NotNull diff --git a/translator/test/org/jetbrains/k2js/test/PatternMatchingTest.java b/translator/test/org/jetbrains/k2js/test/PatternMatchingTest.java index 8b73a74f9df..2973f6999f7 100644 --- a/translator/test/org/jetbrains/k2js/test/PatternMatchingTest.java +++ b/translator/test/org/jetbrains/k2js/test/PatternMatchingTest.java @@ -19,4 +19,9 @@ public final class PatternMatchingTest extends IncludeLibraryTest { testFooBoxIsTrue("whenType.kt"); } + @Test + public void whenNotType() throws Exception { + testFooBoxIsTrue("whenNotType.kt"); + } + } diff --git a/translator/test/org/jetbrains/k2js/test/RhinoFunctionResultChecker.java b/translator/test/org/jetbrains/k2js/test/RhinoFunctionResultChecker.java index 34a40a3ae17..8be5474e5bc 100644 --- a/translator/test/org/jetbrains/k2js/test/RhinoFunctionResultChecker.java +++ b/translator/test/org/jetbrains/k2js/test/RhinoFunctionResultChecker.java @@ -30,7 +30,7 @@ public final class RhinoFunctionResultChecker implements RhinoResultChecker { @Override public void runChecks(Context context, Scriptable scope) throws Exception { Object result = extractAndCallFunctionObject(namespaceName, functionName, context, scope); - assertTrue("Result is not what expected! Exprected: " + expectedResult + " Evaluated : " + result, + assertTrue("Result is not what expected! Expected: " + expectedResult + " Evaluated : " + result, result.equals(expectedResult)); String report = namespaceName + "." + functionName + "() = " + Context.toString(result); System.out.println(report); diff --git a/translator/testFiles/patternMatching/cases/whenNotType.kt b/translator/testFiles/patternMatching/cases/whenNotType.kt new file mode 100644 index 00000000000..be7d077a352 --- /dev/null +++ b/translator/testFiles/patternMatching/cases/whenNotType.kt @@ -0,0 +1,12 @@ +namespace foo + +class A() { + +} + +fun box() : Boolean { + when(A()) { + !is A => return false; + else => return true; + } +} \ No newline at end of file