Index: compiler/java/com/google/dart/compiler/type/TypeAnalyzer.java |
diff --git a/compiler/java/com/google/dart/compiler/type/TypeAnalyzer.java b/compiler/java/com/google/dart/compiler/type/TypeAnalyzer.java |
index 5ce4099ee2c2f29109d571d22900f96183743212..b9d42c008333bb0c8deded7e094f603fb0637e08 100644 |
--- a/compiler/java/com/google/dart/compiler/type/TypeAnalyzer.java |
+++ b/compiler/java/com/google/dart/compiler/type/TypeAnalyzer.java |
@@ -1924,11 +1924,26 @@ public class TypeAnalyzer implements DartCompilationPhase { |
DartExpression expression = node.getExpression(); |
Type switchType = nonVoidTypeOf(expression); |
// check "case" expressions compatibility |
+ Type sameCaseType = null; |
for (DartSwitchMember switchMember : node.getMembers()) { |
if (switchMember instanceof DartCase) { |
DartCase caseMember = (DartCase) switchMember; |
DartExpression caseExpr = caseMember.getExpr(); |
Type caseType = nonVoidTypeOf(caseExpr); |
+ // should be "int" or "String" |
+ if (!Objects.equal(caseType, intType) && !Objects.equal(caseType, stringType)) { |
+ onError(caseExpr, TypeErrorCode.CASE_EXPRESSION_SHOULD_BE_INT_STRING, caseType); |
+ continue; |
+ } |
+ // all "case expressions" should be same type |
+ if (sameCaseType == null) { |
+ sameCaseType = caseType; |
+ } |
+ if (!Objects.equal(caseType, sameCaseType)) { |
+ onError(caseExpr, TypeErrorCode.CASE_EXPRESSIONS_SHOULD_BE_SAME_TYPE, sameCaseType, |
+ caseType); |
+ } |
+ // compatibility of "switch expression" and "case expression" types |
checkAssignable(caseExpr, switchType, caseType); |
} |
} |