predicate operator implemented
This commit is contained in:
@@ -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"));
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user