diff --git a/idea/src/org/jetbrains/jet/lang/cfg/JetControlFlowProcessor.java b/idea/src/org/jetbrains/jet/lang/cfg/JetControlFlowProcessor.java index 3b62afcb70a..be753b341f1 100644 --- a/idea/src/org/jetbrains/jet/lang/cfg/JetControlFlowProcessor.java +++ b/idea/src/org/jetbrains/jet/lang/cfg/JetControlFlowProcessor.java @@ -649,12 +649,25 @@ public class JetControlFlowProcessor { @Override public void visitWhenConditionIsPattern(JetWhenConditionIsPattern condition) { - super.visitWhenConditionIsPattern(condition); // TODO + JetPattern pattern = condition.getPattern(); + if (pattern != null) { + pattern.accept(new JetVisitor() { + @Override + public void visitTypePattern(JetTypePattern typePattern) { + // TODO + } + + @Override + public void visitJetElement(JetElement elem) { + throw new UnsupportedOperationException(elem.toString()); + } + }); + } } @Override public void visitJetElement(JetElement elem) { - throw new UnsupportedOperationException(); + throw new UnsupportedOperationException(elem.toString()); } }); } diff --git a/idea/src/org/jetbrains/jet/lang/psi/JetTypePattern.java b/idea/src/org/jetbrains/jet/lang/psi/JetTypePattern.java index acec30077f3..08bb92a47cd 100644 --- a/idea/src/org/jetbrains/jet/lang/psi/JetTypePattern.java +++ b/idea/src/org/jetbrains/jet/lang/psi/JetTypePattern.java @@ -16,4 +16,9 @@ public class JetTypePattern extends JetPattern { public JetTypeReference getTypeReference() { return findChildByClass(JetTypeReference.class); } + + @Override + public void accept(@NotNull JetVisitor visitor) { + visitor.visitTypePattern(this); + } } diff --git a/idea/src/org/jetbrains/jet/lang/psi/JetVisitor.java b/idea/src/org/jetbrains/jet/lang/psi/JetVisitor.java index 1f9d202dcc9..b347d15176a 100644 --- a/idea/src/org/jetbrains/jet/lang/psi/JetVisitor.java +++ b/idea/src/org/jetbrains/jet/lang/psi/JetVisitor.java @@ -365,4 +365,12 @@ public class JetVisitor extends PsiElementVisitor { public void visitWhenConditionInRange(JetWhenConditionInRange condition) { visitJetElement(condition); } + + public void visitTypePattern(JetTypePattern typePattern) { + visitPattern(typePattern); + } + + public void visitPattern(JetPattern pattern) { + visitJetElement(pattern); + } } diff --git a/idea/src/org/jetbrains/jet/lang/types/JetTypeInferrer.java b/idea/src/org/jetbrains/jet/lang/types/JetTypeInferrer.java index 1e48186c714..4263ef7523a 100644 --- a/idea/src/org/jetbrains/jet/lang/types/JetTypeInferrer.java +++ b/idea/src/org/jetbrains/jet/lang/types/JetTypeInferrer.java @@ -1019,7 +1019,26 @@ public class JetTypeInferrer { @Override public void visitWhenConditionIsPattern(JetWhenConditionIsPattern condition) { - super.visitWhenConditionIsPattern(condition); // TODO + JetPattern pattern = condition.getPattern(); + if (pattern != null) { + pattern.accept(new JetVisitor() { + @Override + public void visitTypePattern(JetTypePattern typePattern) { + JetTypeReference typeReference = typePattern.getTypeReference(); + if (typeReference != null) { + JetType type = typeResolver.resolveType(scope, typeReference); + if (TypeUtils.intersect(semanticServices.getTypeChecker(), Sets.newHashSet(type, finalSubjectType)) == null) { + trace.getErrorHandler().genericError(typePattern.getNode(), "Incompatible types"); // TODO : message + } + } + } + + @Override + public void visitJetElement(JetElement elem) { + trace.getErrorHandler().genericError(elem.getNode(), "Unsupported [JetTypeInferrer]"); + } + }); + } } @Override diff --git a/idea/testData/checker/When.jet b/idea/testData/checker/When.jet index 7eb6e6b582f..13a68794b33 100644 --- a/idea/testData/checker/When.jet +++ b/idea/testData/checker/When.jet @@ -2,6 +2,9 @@ fun foo() { val s = "" val x = 1 when (x) { + is String => 1 + !is Int => 1 + is Any? => 1 s => 1 1 => 1 1 + a => 1