Supported another case of when expression.

This commit is contained in:
Pavel Talanov
2011-11-17 17:39:44 +04:00
parent bd33b23f51
commit d0239085c1
6 changed files with 42 additions and 9 deletions
@@ -269,7 +269,7 @@ public class AstUtil {
return result; return result;
} }
public static JsPrefixOperation negation(JsExpression expression) { public static JsPrefixOperation negated(JsExpression expression) {
return new JsPrefixOperation(JsUnaryOperator.NOT, expression); return new JsPrefixOperation(JsUnaryOperator.NOT, expression);
} }
} }
@@ -46,7 +46,7 @@ public final class PatternTranslator extends AbstractTranslator {
JetPattern pattern = getPattern(expression); JetPattern pattern = getPattern(expression);
JsExpression resultingExpression = translatePattern(pattern, left); JsExpression resultingExpression = translatePattern(pattern, left);
if (expression.isNegated()) { if (expression.isNegated()) {
return AstUtil.negation(resultingExpression); return AstUtil.negated(resultingExpression);
} }
return resultingExpression; return resultingExpression;
} }
@@ -25,6 +25,7 @@ public class WhenTranslator extends AbstractTranslator {
private final JsExpression expressionToMatch; private final JsExpression expressionToMatch;
@NotNull @NotNull
private final JsName dummyCounterName; private final JsName dummyCounterName;
private int currentEntryNumber = 0;
private WhenTranslator(@NotNull JetWhenExpression expression, @NotNull TranslationContext context) { private WhenTranslator(@NotNull JetWhenExpression expression, @NotNull TranslationContext context) {
super(context); super(context);
@@ -35,16 +36,27 @@ public class WhenTranslator extends AbstractTranslator {
@NotNull @NotNull
JsNode translate() { JsNode translate() {
return translateEntries(); JsFor resultingFor = generateDummyFor();
List<JsStatement> entries = translateEntries();
resultingFor.setBody(AstUtil.newBlock(entries));
return resultingFor;
} }
private JsBlock translateEntries() { @NotNull
//JsFor resultingFor = generateDummyFor(); private List<JsStatement> translateEntries() {
List<JsStatement> entries = new ArrayList<JsStatement>(); List<JsStatement> entries = new ArrayList<JsStatement>();
for (JetWhenEntry entry : whenExpression.getEntries()) { 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 @NotNull
@@ -110,8 +122,12 @@ public class WhenTranslator extends AbstractTranslator {
@NotNull @NotNull
private JsExpression translatePatternCondition(@NotNull JetWhenConditionIsPattern condition) { private JsExpression translatePatternCondition(@NotNull JetWhenConditionIsPattern condition) {
return Translation.typeOperationTranslator(translationContext()). JsExpression patternMatchExpression = Translation.typeOperationTranslator(translationContext()).
translatePattern(getPattern(condition), expressionToMatch); translatePattern(getPattern(condition), expressionToMatch);
if (condition.isNegated()) {
return AstUtil.negated(patternMatchExpression);
}
return patternMatchExpression;
} }
@NotNull @NotNull
@@ -19,4 +19,9 @@ public final class PatternMatchingTest extends IncludeLibraryTest {
testFooBoxIsTrue("whenType.kt"); testFooBoxIsTrue("whenType.kt");
} }
@Test
public void whenNotType() throws Exception {
testFooBoxIsTrue("whenNotType.kt");
}
} }
@@ -30,7 +30,7 @@ public final class RhinoFunctionResultChecker implements RhinoResultChecker {
@Override @Override
public void runChecks(Context context, Scriptable scope) throws Exception { public void runChecks(Context context, Scriptable scope) throws Exception {
Object result = extractAndCallFunctionObject(namespaceName, functionName, context, scope); 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)); result.equals(expectedResult));
String report = namespaceName + "." + functionName + "() = " + Context.toString(result); String report = namespaceName + "." + functionName + "() = " + Context.toString(result);
System.out.println(report); System.out.println(report);
@@ -0,0 +1,12 @@
namespace foo
class A() {
}
fun box() : Boolean {
when(A()) {
!is A => return false;
else => return true;
}
}