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); 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); generateThisOrOuter(calleeContainingClass);
} }
} }
@@ -1009,6 +1010,23 @@ public class ExpressionCodegen extends JetVisitor {
v.mark(end); 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 @Override
public void visitBinaryExpression(JetBinaryExpression expression) { public void visitBinaryExpression(JetBinaryExpression expression) {
final IElementType opToken = expression.getOperationReference().getReferencedNameElementType(); final IElementType opToken = expression.getOperationReference().getReferencedNameElementType();
@@ -444,4 +444,11 @@ public class NamespaceGenTest extends CodegenTestCase {
assertEquals(1, tuple2._1); assertEquals(1, tuple2._1);
assertEquals("foo", tuple2._2); 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"));
}
} }