diff --git a/idea/src/org/jetbrains/jet/codegen/ExpressionCodegen.java b/idea/src/org/jetbrains/jet/codegen/ExpressionCodegen.java index 462d86f8232..76517833b61 100644 --- a/idea/src/org/jetbrains/jet/codegen/ExpressionCodegen.java +++ b/idea/src/org/jetbrains/jet/codegen/ExpressionCodegen.java @@ -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(); diff --git a/idea/tests/org/jetbrains/jet/codegen/NamespaceGenTest.java b/idea/tests/org/jetbrains/jet/codegen/NamespaceGenTest.java index daf24b69b3d..d2afec870a4 100644 --- a/idea/tests/org/jetbrains/jet/codegen/NamespaceGenTest.java +++ b/idea/tests/org/jetbrains/jet/codegen/NamespaceGenTest.java @@ -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")); + } }