predicate operator implemented

This commit is contained in:
Dmitry Jemerov
2011-07-08 13:12:56 +02:00
parent fc9f1eec4f
commit a691de74bc
2 changed files with 26 additions and 1 deletions
@@ -878,7 +878,8 @@ public class ExpressionCodegen extends JetVisitor {
myStack.pop().put(JetTypeMapper.TYPE_OBJECT, v);
}
}
else if (!(expression.getParent() instanceof JetSafeQualifiedExpression)) {
else if (!(expression.getParent() instanceof JetSafeQualifiedExpression) &&
!(expression.getParent() instanceof JetPredicateExpression)) {
generateThisOrOuter(calleeContainingClass);
}
}
@@ -1009,6 +1010,23 @@ public class ExpressionCodegen extends JetVisitor {
v.mark(end);
}
@Override
public void visitPredicateExpression(JetPredicateExpression expression) {
genToJVMStack(expression.getReceiverExpression());
Label ifFalse = new Label();
Label end = new Label();
v.dup();
gen(expression.getSelectorExpression());
StackValue result = myStack.pop();
result.condJump(ifFalse, true, v);
v.goTo(end);
v.mark(ifFalse);
v.pop();
v.aconst(null);
v.mark(end);
myStack.push(StackValue.onStack(typeMapper.mapType(bindingContext.getExpressionType(expression))));
}
@Override
public void visitBinaryExpression(JetBinaryExpression expression) {
final IElementType opToken = expression.getOperationReference().getReferencedNameElementType();
@@ -444,4 +444,11 @@ public class NamespaceGenTest extends CodegenTestCase {
assertEquals(1, tuple2._1);
assertEquals("foo", tuple2._2);
}
public void testPredicateOperator() throws Exception {
loadText("fun foo(s: String) = s?startsWith(\"J\")");
final Method main = generateFunction();
assertEquals("JetBrains", main.invoke(null, "JetBrains"));
assertNull(main.invoke(null, "IntelliJ"));
}
}