diff --git a/idea/src/org/jetbrains/jet/codegen/ExpressionCodegen.java b/idea/src/org/jetbrains/jet/codegen/ExpressionCodegen.java index 736082b0022..4767cf6d25d 100644 --- a/idea/src/org/jetbrains/jet/codegen/ExpressionCodegen.java +++ b/idea/src/org/jetbrains/jet/codegen/ExpressionCodegen.java @@ -1310,7 +1310,8 @@ public class ExpressionCodegen extends JetVisitor { Type type = typeMapper.jvmType((ClassDescriptor) descriptor, OwnerKind.INTERFACE); v.instanceOf(type); } - myStack.push(StackValue.onStack(Type.BOOLEAN_TYPE)); + StackValue value = StackValue.onStack(Type.BOOLEAN_TYPE); + myStack.push(expression.isNot() ? StackValue.not(value) : value); } private void newTypeInfo(JetType jetType) { diff --git a/idea/src/org/jetbrains/jet/lang/psi/JetIsExpression.java b/idea/src/org/jetbrains/jet/lang/psi/JetIsExpression.java index a4e8ffb2a33..b3fa7f19d54 100644 --- a/idea/src/org/jetbrains/jet/lang/psi/JetIsExpression.java +++ b/idea/src/org/jetbrains/jet/lang/psi/JetIsExpression.java @@ -3,6 +3,8 @@ package org.jetbrains.jet.lang.psi; import com.intellij.lang.ASTNode; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; +import org.jetbrains.jet.JetNodeTypes; +import org.jetbrains.jet.lexer.JetTokens; /** * @author abreslav @@ -27,4 +29,13 @@ public class JetIsExpression extends JetExpression { return findChildByClass(JetPattern.class); } + @NotNull + public JetSimpleNameExpression getOperationReference() { + return (JetSimpleNameExpression) findChildByType(JetNodeTypes.OPERATION_REFERENCE); + } + + public boolean isNot() { + return getOperationReference().getReferencedNameElementType() == JetTokens.NOT_IS; + } + } diff --git a/idea/tests/org/jetbrains/jet/codegen/TypeInfoTest.java b/idea/tests/org/jetbrains/jet/codegen/TypeInfoTest.java index d9f7a070b07..998704da068 100644 --- a/idea/tests/org/jetbrains/jet/codegen/TypeInfoTest.java +++ b/idea/tests/org/jetbrains/jet/codegen/TypeInfoTest.java @@ -52,6 +52,13 @@ public class TypeInfoTest extends CodegenTestCase { assertFalse((Boolean) foo.invoke(null)); } + public void testNotIsOperator() throws Exception { + loadText("fun foo(x: Any) = x !is Runnable"); + Method foo = generateFunction(); + assertTrue((Boolean) foo.invoke(null, new Object())); + assertFalse((Boolean) foo.invoke(null, newRunnable())); + } + private Runnable newRunnable() { return new Runnable() { @Override