diff --git a/.idea/runConfigurations/All_Tests.xml b/.idea/runConfigurations/All_Tests.xml
index 80abd8cce40..6ebba66deda 100644
--- a/.idea/runConfigurations/All_Tests.xml
+++ b/.idea/runConfigurations/All_Tests.xml
@@ -13,7 +13,7 @@
-
+
diff --git a/idea/src/org/jetbrains/jet/JetNodeTypes.java b/idea/src/org/jetbrains/jet/JetNodeTypes.java
index 8fab0c1cb73..ff21e5e4ed1 100644
--- a/idea/src/org/jetbrains/jet/JetNodeTypes.java
+++ b/idea/src/org/jetbrains/jet/JetNodeTypes.java
@@ -117,7 +117,7 @@ public interface JetNodeTypes {
JetNodeType ROOT_NAMESPACE = new JetNodeType("ROOT_NAMESPACE", JetRootNamespaceExpression.class);
JetNodeType DECOMPOSER_ARGUMENT_LIST = new JetNodeType("DECOMPOSER_ARGUMENT_LIST");
JetNodeType DECOMPOSER_ARGUMENT = new JetNodeType("DECOMPOSER_ARGUMENT");
- JetNodeType TYPE_PATTERN = new JetNodeType("TYPE_PATTERN");
+ JetNodeType TYPE_PATTERN = new JetNodeType("TYPE_PATTERN", JetTypePattern.class);
JetNodeType EXPRESSION_PATTERN = new JetNodeType("EXPRESSION_PATTERN");
JetNodeType BINDING_PATTERN = new JetNodeType("BINDING_PATTERN");
JetNodeType WILDCARD_PATTERN = new JetNodeType("WILDCARD_PATTERN");
diff --git a/idea/src/org/jetbrains/jet/lang/cfg/JetControlFlowProcessor.java b/idea/src/org/jetbrains/jet/lang/cfg/JetControlFlowProcessor.java
index 6e52be0a950..923bbe808a2 100644
--- a/idea/src/org/jetbrains/jet/lang/cfg/JetControlFlowProcessor.java
+++ b/idea/src/org/jetbrains/jet/lang/cfg/JetControlFlowProcessor.java
@@ -601,6 +601,14 @@ public class JetControlFlowProcessor {
builder.read(expression);
}
+
+ @Override
+ public void visitIsExpression(JetIsExpression expression) {
+ value(expression.getLeftHandSide(), false, inCondition);
+ // TODO : builder.read(expression.getPattern());
+ builder.read(expression);
+ }
+
@Override
public void visitTypeProjection(JetTypeProjection typeProjection) {
// TODO : Support Type Arguments. Class object may be initialized at this point");
diff --git a/idea/src/org/jetbrains/jet/lang/psi/JetIsExpression.java b/idea/src/org/jetbrains/jet/lang/psi/JetIsExpression.java
index e4d7b426aa9..a4e8ffb2a33 100644
--- a/idea/src/org/jetbrains/jet/lang/psi/JetIsExpression.java
+++ b/idea/src/org/jetbrains/jet/lang/psi/JetIsExpression.java
@@ -2,6 +2,7 @@ package org.jetbrains.jet.lang.psi;
import com.intellij.lang.ASTNode;
import org.jetbrains.annotations.NotNull;
+import org.jetbrains.annotations.Nullable;
/**
* @author abreslav
@@ -15,4 +16,15 @@ public class JetIsExpression extends JetExpression {
public void accept(JetVisitor visitor) {
visitor.visitIsExpression(this);
}
+
+ @NotNull
+ public JetExpression getLeftHandSide() {
+ return findChildByClass(JetExpression.class);
+ }
+
+ @Nullable @IfNotParsed
+ public JetPattern getPattern() {
+ return findChildByClass(JetPattern.class);
+ }
+
}
diff --git a/idea/src/org/jetbrains/jet/lang/psi/JetPattern.java b/idea/src/org/jetbrains/jet/lang/psi/JetPattern.java
new file mode 100644
index 00000000000..4c8d03ebec9
--- /dev/null
+++ b/idea/src/org/jetbrains/jet/lang/psi/JetPattern.java
@@ -0,0 +1,13 @@
+package org.jetbrains.jet.lang.psi;
+
+import com.intellij.lang.ASTNode;
+import org.jetbrains.annotations.NotNull;
+
+/**
+ * @author abreslav
+ */
+public class JetPattern extends JetElement {
+ public JetPattern(@NotNull ASTNode node) {
+ super(node);
+ }
+}
diff --git a/idea/src/org/jetbrains/jet/lang/psi/JetTypePattern.java b/idea/src/org/jetbrains/jet/lang/psi/JetTypePattern.java
new file mode 100644
index 00000000000..acec30077f3
--- /dev/null
+++ b/idea/src/org/jetbrains/jet/lang/psi/JetTypePattern.java
@@ -0,0 +1,19 @@
+package org.jetbrains.jet.lang.psi;
+
+import com.intellij.lang.ASTNode;
+import org.jetbrains.annotations.NotNull;
+import org.jetbrains.annotations.Nullable;
+
+/**
+ * @author abreslav
+ */
+public class JetTypePattern extends JetPattern {
+ public JetTypePattern(@NotNull ASTNode node) {
+ super(node);
+ }
+
+ @Nullable @IfNotParsed
+ public JetTypeReference getTypeReference() {
+ return findChildByClass(JetTypeReference.class);
+ }
+}
diff --git a/idea/src/org/jetbrains/jet/lang/types/JetTypeInferrer.java b/idea/src/org/jetbrains/jet/lang/types/JetTypeInferrer.java
index 807c2c002e9..6b9a295fc09 100644
--- a/idea/src/org/jetbrains/jet/lang/types/JetTypeInferrer.java
+++ b/idea/src/org/jetbrains/jet/lang/types/JetTypeInferrer.java
@@ -864,6 +864,8 @@ public class JetTypeInferrer {
}
}
+
+
@Override
public void visitTupleExpression(JetTupleExpression expression) {
List entries = expression.getEntries();
@@ -1255,6 +1257,19 @@ public class JetTypeInferrer {
@Override
public void visitIsExpression(JetIsExpression expression) {
// TODO : patterns and everything
+ JetType knownType = getType(scope, expression.getLeftHandSide(), false);
+ JetPattern pattern = expression.getPattern();
+ if (pattern instanceof JetTypePattern) {
+ JetTypePattern typePattern = (JetTypePattern) pattern;
+ JetTypeReference typeReference = typePattern.getTypeReference();
+ if (typeReference != null && knownType != null) {
+ JetType targetType = typeResolver.resolveType(scope, typeReference);
+ if (!semanticServices.getTypeChecker().isSubtypeOf(targetType, knownType)) {
+ trace.getErrorHandler().genericWarning(expression.getNode(), "Expression always evaluates to false"); // TODO : make an error?
+ }
+ }
+
+ }
result = semanticServices.getStandardLibrary().getBooleanType();
}
diff --git a/idea/testData/checker/IsExpressions.jet b/idea/testData/checker/IsExpressions.jet
new file mode 100644
index 00000000000..a88f9578186
--- /dev/null
+++ b/idea/testData/checker/IsExpressions.jet
@@ -0,0 +1,7 @@
+fun test() {
+ if (1 is Int) {
+ if (1 is Boolean) {
+
+ }
+ }
+}
\ No newline at end of file