Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(178)

Unified Diff: editor/tools/plugins/com.google.dart.engine/src/com/google/dart/engine/internal/verifier/ErrorVerifier.java

Issue 267923004: Check const map literal keys and switch case exprs using type of constant. (Closed) Base URL: https://dart.googlecode.com/svn/branches/bleeding_edge/dart
Patch Set: Created 6 years, 8 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: editor/tools/plugins/com.google.dart.engine/src/com/google/dart/engine/internal/verifier/ErrorVerifier.java
diff --git a/editor/tools/plugins/com.google.dart.engine/src/com/google/dart/engine/internal/verifier/ErrorVerifier.java b/editor/tools/plugins/com.google.dart.engine/src/com/google/dart/engine/internal/verifier/ErrorVerifier.java
index 152a3c9a322529e36a8fb37fa6649a3f34d50635..88f2205fb339c1d7a0af056601c685d46a89bcc3 100644
--- a/editor/tools/plugins/com.google.dart.engine/src/com/google/dart/engine/internal/verifier/ErrorVerifier.java
+++ b/editor/tools/plugins/com.google.dart.engine/src/com/google/dart/engine/internal/verifier/ErrorVerifier.java
@@ -907,7 +907,6 @@ public class ErrorVerifier extends RecursiveAstVisitor<Void> {
checkForMapTypeNotAssignable(node, typeArguments);
}
checkForNonConstMapAsExpressionStatement(node);
- checkForConstMapKeyExpressionTypeImplementsEquals(node);
return super.visitMapLiteral(node);
}
@@ -1073,7 +1072,6 @@ public class ErrorVerifier extends RecursiveAstVisitor<Void> {
@Override
public Void visitSwitchStatement(SwitchStatement node) {
- checkForInconsistentCaseExpressionTypes(node);
checkForSwitchExpressionNotAssignable(node);
checkForCaseBlocksNotTerminated(node);
return super.visitSwitchStatement(node);
@@ -2196,27 +2194,6 @@ public class ErrorVerifier extends RecursiveAstVisitor<Void> {
}
/**
- * This verifies that the passed switch statement does not have a case expression with the
- * operator '==' overridden.
- *
- * @param node the switch statement to evaluate
- * @param type the common type of all 'case' expressions
- * @return {@code true} if and only if an error code is generated on the passed node
- * @see CompileTimeErrorCode#CASE_EXPRESSION_TYPE_IMPLEMENTS_EQUALS
- */
- private boolean checkForCaseExpressionTypeImplementsEquals(SwitchStatement node, Type type) {
- if (!implementsEqualsWhenNotAllowed(type)) {
- return false;
- }
- // report error
- errorReporter.reportErrorForToken(
- CompileTimeErrorCode.CASE_EXPRESSION_TYPE_IMPLEMENTS_EQUALS,
- node.getKeyword(),
- type.getDisplayName());
- return true;
- }
-
- /**
* This verifies that the passed method declaration is abstract only if the enclosing class is
* also abstract.
*
@@ -2778,35 +2755,6 @@ public class ErrorVerifier extends RecursiveAstVisitor<Void> {
}
/**
- * This verifies that the all keys of the passed map literal have class type that does not declare
- * operator <i>==<i>.
- *
- * @param key the map literal to evaluate
- * @return {@code true} if and only if an error code is generated on the passed node
- * @see CompileTimeErrorCode#CONST_MAP_KEY_EXPRESSION_TYPE_IMPLEMENTS_EQUALS
- */
- private boolean checkForConstMapKeyExpressionTypeImplementsEquals(MapLiteral node) {
- // OK, not const.
- if (node.getConstKeyword() == null) {
- return false;
- }
- // Check every map entry.
- boolean hasProblems = false;
- for (MapLiteralEntry entry : node.getEntries()) {
- Expression key = entry.getKey();
- Type type = key.getStaticType();
- if (implementsEqualsWhenNotAllowed(type)) {
- errorReporter.reportErrorForNode(
- CompileTimeErrorCode.CONST_MAP_KEY_EXPRESSION_TYPE_IMPLEMENTS_EQUALS,
- key,
- type.getDisplayName());
- hasProblems = true;
- }
- }
- return hasProblems;
- }
-
- /**
* This verifies that the passed instance creation expression is not being invoked on an abstract
* class.
*
@@ -3658,46 +3606,6 @@ public class ErrorVerifier extends RecursiveAstVisitor<Void> {
}
/**
- * This verifies that the passed switch statement case expressions all have the same type.
- *
- * @param node the switch statement to evaluate
- * @return {@code true} if and only if an error code is generated on the passed node
- * @see CompileTimeErrorCode#INCONSISTENT_CASE_EXPRESSION_TYPES
- */
- private boolean checkForInconsistentCaseExpressionTypes(SwitchStatement node) {
- // TODO(jwren) Revisit this algorithm, should there up to n-1 errors?
- NodeList<SwitchMember> switchMembers = node.getMembers();
- boolean foundError = false;
- Type firstType = null;
- for (SwitchMember switchMember : switchMembers) {
- if (switchMember instanceof SwitchCase) {
- SwitchCase switchCase = (SwitchCase) switchMember;
- Expression expression = switchCase.getExpression();
- if (firstType == null) {
- // TODO(brianwilkerson) This is failing with const variables whose declared type is
- // dynamic. The problem is that we don't have any way to propagate type information for
- // the variable.
- firstType = expression.getBestType();
- } else {
- Type nType = expression.getBestType();
- if (!firstType.equals(nType)) {
- errorReporter.reportErrorForNode(
- CompileTimeErrorCode.INCONSISTENT_CASE_EXPRESSION_TYPES,
- expression,
- expression.toSource(),
- firstType.getDisplayName());
- foundError = true;
- }
- }
- }
- }
- if (!foundError) {
- checkForCaseExpressionTypeImplementsEquals(node, firstType);
- }
- return foundError;
- }
-
- /**
* For each class declaration, this method is called which verifies that all inherited members are
* inherited consistently.
*
@@ -5735,39 +5643,6 @@ public class ErrorVerifier extends RecursiveAstVisitor<Void> {
}
}
- /**
- * @return {@code true} if given {@link Type} implements operator <i>==</i>, and it is not
- * <i>int</i> or <i>String</i>.
- */
- private boolean implementsEqualsWhenNotAllowed(Type type) {
- // ignore int or String
- if (type == null || type.equals(intType) || type.equals(typeProvider.getStringType())) {
- return false;
- } else if (type.equals(typeProvider.getDoubleType())) {
- return true;
- }
- // prepare ClassElement
- Element element = type.getElement();
- if (!(element instanceof ClassElement)) {
- return false;
- }
- ClassElement classElement = (ClassElement) element;
- // lookup for ==
- MethodElement method = classElement.lookUpMethod("==", currentLibrary);
- while (method != null && method.isAbstract()) {
- ClassElement definingClass = method.getEnclosingElement();
- if (definingClass == null) {
- return false;
- }
- method = definingClass.lookUpInheritedMethod("==", currentLibrary);
- }
- if (method == null || method.getEnclosingElement().getType().isObject()) {
- return false;
- }
- // there is == that we don't like
- return true;
- }
-
private boolean isFunctionType(Type type) {
if (type.isDynamic() || type.isBottom()) {
return true;

Powered by Google App Engine
This is Rietveld 408576698