Index: editor/tools/plugins/com.google.dart.engine/src/com/google/dart/engine/internal/verifier/ConstantVerifier.java |
diff --git a/editor/tools/plugins/com.google.dart.engine/src/com/google/dart/engine/internal/verifier/ConstantVerifier.java b/editor/tools/plugins/com.google.dart.engine/src/com/google/dart/engine/internal/verifier/ConstantVerifier.java |
index 994376e5982b783d6fbafb9ca005298534cd8a99..ec7f92835b3257612e184c9233e0782726e708d4 100644 |
--- a/editor/tools/plugins/com.google.dart.engine/src/com/google/dart/engine/internal/verifier/ConstantVerifier.java |
+++ b/editor/tools/plugins/com.google.dart.engine/src/com/google/dart/engine/internal/verifier/ConstantVerifier.java |
@@ -36,6 +36,7 @@ import com.google.dart.engine.ast.SuperConstructorInvocation; |
import com.google.dart.engine.ast.SwitchCase; |
import com.google.dart.engine.ast.VariableDeclaration; |
import com.google.dart.engine.ast.visitor.RecursiveASTVisitor; |
+import com.google.dart.engine.constant.DartObject; |
import com.google.dart.engine.element.ConstructorElement; |
import com.google.dart.engine.element.Element; |
import com.google.dart.engine.element.ParameterElement; |
@@ -48,6 +49,15 @@ import com.google.dart.engine.internal.constant.EvaluationResultImpl; |
import com.google.dart.engine.internal.constant.ValidResult; |
import com.google.dart.engine.internal.element.VariableElementImpl; |
import com.google.dart.engine.internal.error.ErrorReporter; |
+import com.google.dart.engine.internal.object.BoolState; |
+import com.google.dart.engine.internal.object.DartObjectImpl; |
+import com.google.dart.engine.internal.object.DoubleState; |
+import com.google.dart.engine.internal.object.DynamicState; |
+import com.google.dart.engine.internal.object.GenericState; |
+import com.google.dart.engine.internal.object.InstanceState; |
+import com.google.dart.engine.internal.object.IntState; |
+import com.google.dart.engine.internal.object.NumState; |
+import com.google.dart.engine.internal.object.StringState; |
import com.google.dart.engine.internal.resolver.TypeProvider; |
import com.google.dart.engine.type.InterfaceType; |
import com.google.dart.engine.type.Type; |
@@ -69,6 +79,11 @@ public class ConstantVerifier extends RecursiveASTVisitor<Void> { |
private ErrorReporter errorReporter; |
/** |
+ * The type provider used to access the known types. |
+ */ |
+ private TypeProvider typeProvider; |
+ |
+ /** |
* The type representing the type 'bool'. |
*/ |
private InterfaceType boolType; |
@@ -95,6 +110,7 @@ public class ConstantVerifier extends RecursiveASTVisitor<Void> { |
*/ |
public ConstantVerifier(ErrorReporter errorReporter, TypeProvider typeProvider) { |
this.errorReporter = errorReporter; |
+ this.typeProvider = typeProvider; |
this.boolType = typeProvider.getBoolType(); |
this.intType = typeProvider.getIntType(); |
this.numType = typeProvider.getNumType(); |
@@ -163,7 +179,7 @@ public class ConstantVerifier extends RecursiveASTVisitor<Void> { |
super.visitMapLiteral(node); |
boolean isConst = node.getConstKeyword() != null; |
boolean reportEqualKeys = true; |
- HashSet<Object> keys = new HashSet<Object>(); |
+ HashSet<DartObject> keys = new HashSet<DartObject>(); |
ArrayList<Expression> invalidKeys = new ArrayList<Expression>(); |
for (MapLiteralEntry entry : node.getEntries()) { |
Expression key = entry.getKey(); |
@@ -171,7 +187,7 @@ public class ConstantVerifier extends RecursiveASTVisitor<Void> { |
EvaluationResultImpl result = validate(key, CompileTimeErrorCode.NON_CONSTANT_MAP_KEY); |
validate(entry.getValue(), CompileTimeErrorCode.NON_CONSTANT_MAP_VALUE); |
if (result instanceof ValidResult) { |
- Object value = ((ValidResult) result).getValue(); |
+ DartObject value = ((ValidResult) result).getValue(); |
if (keys.contains(value)) { |
invalidKeys.add(key); |
} else { |
@@ -179,9 +195,9 @@ public class ConstantVerifier extends RecursiveASTVisitor<Void> { |
} |
} |
} else { |
- EvaluationResultImpl result = key.accept(new ConstantVisitor()); |
+ EvaluationResultImpl result = key.accept(new ConstantVisitor(typeProvider)); |
if (result instanceof ValidResult) { |
- Object value = ((ValidResult) result).getValue(); |
+ DartObject value = ((ValidResult) result).getValue(); |
if (keys.contains(value)) { |
invalidKeys.add(key); |
} else { |
@@ -263,6 +279,10 @@ public class ConstantVerifier extends RecursiveASTVisitor<Void> { |
} |
} |
+ private ValidResult valid(InterfaceType type, InstanceState state) { |
+ return new ValidResult(new DartObjectImpl(type, state)); |
+ } |
+ |
/** |
* Validate that the given expression is a compile time constant. Return the value of the compile |
* time constant, or {@code null} if the expression is not a compile time constant. |
@@ -272,7 +292,7 @@ public class ConstantVerifier extends RecursiveASTVisitor<Void> { |
* @return the value of the compile time constant |
*/ |
private EvaluationResultImpl validate(Expression expression, ErrorCode errorCode) { |
- EvaluationResultImpl result = expression.accept(new ConstantVisitor()); |
+ EvaluationResultImpl result = expression.accept(new ConstantVisitor(typeProvider)); |
reportErrors(result, errorCode); |
return result; |
} |
@@ -342,7 +362,7 @@ public class ConstantVerifier extends RecursiveASTVisitor<Void> { |
*/ |
private void validateInitializerExpression(final ParameterElement[] parameterElements, |
Expression expression) { |
- EvaluationResultImpl result = expression.accept(new ConstantVisitor() { |
+ EvaluationResultImpl result = expression.accept(new ConstantVisitor(typeProvider) { |
@Override |
public EvaluationResultImpl visitSimpleIdentifier(SimpleIdentifier node) { |
Element element = node.getStaticElement(); |
@@ -351,22 +371,28 @@ public class ConstantVerifier extends RecursiveASTVisitor<Void> { |
Type type = parameterElement.getType(); |
if (type != null) { |
if (type.isDynamic()) { |
- return ValidResult.RESULT_DYNAMIC; |
- } |
- if (type.isSubtypeOf(boolType)) { |
- return ValidResult.RESULT_BOOL; |
- } |
- if (type.isSubtypeOf(intType)) { |
- return ValidResult.RESULT_INT; |
- } |
- if (type.isSubtypeOf(numType)) { |
- return ValidResult.RESULT_NUM; |
- } |
- if (type.isSubtypeOf(stringType)) { |
- return ValidResult.RESULT_STRING; |
+ return valid(typeProvider.getObjectType(), DynamicState.DYNAMIC_STATE); |
+ } else if (type.isSubtypeOf(boolType)) { |
+ return valid(typeProvider.getBoolType(), BoolState.UNKNOWN_VALUE); |
+ } else if (type.isSubtypeOf(typeProvider.getDoubleType())) { |
+ return valid(typeProvider.getDoubleType(), DoubleState.UNKNOWN_VALUE); |
+ } else if (type.isSubtypeOf(intType)) { |
+ return valid(typeProvider.getIntType(), IntState.UNKNOWN_VALUE); |
+ } else if (type.isSubtypeOf(numType)) { |
+ return valid(typeProvider.getNumType(), NumState.UNKNOWN_VALUE); |
+ } else if (type.isSubtypeOf(stringType)) { |
+ return valid(typeProvider.getStringType(), StringState.UNKNOWN_VALUE); |
} |
+ // |
+ // We don't test for other types of objects (such as List, Map, Function or Type) |
+ // because there are no operations allowed on such types other than '==' and '!=', |
+ // which means that we don't need to know the type when there is no specific data |
+ // about the state of such objects. |
+ // |
} |
- return ValidResult.RESULT_OBJECT; |
+ return valid( |
+ type instanceof InterfaceType ? (InterfaceType) type : typeProvider.getObjectType(), |
+ GenericState.UNKNOWN_VALUE); |
} |
} |
return super.visitSimpleIdentifier(node); |