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