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

Unified Diff: pkg/analyzer/lib/src/generated/resolver.dart

Issue 1329743005: Abstract over the type system. (Closed) Base URL: git@github.com:dart-lang/sdk.git@master
Patch Set: Created 5 years, 3 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: pkg/analyzer/lib/src/generated/resolver.dart
diff --git a/pkg/analyzer/lib/src/generated/resolver.dart b/pkg/analyzer/lib/src/generated/resolver.dart
index eb7bacf41f3cb4b8f571cb3feed09e9273cd051c..5c1f5774252482accc8cbedc2eadddd7e5d8740d 100644
--- a/pkg/analyzer/lib/src/generated/resolver.dart
+++ b/pkg/analyzer/lib/src/generated/resolver.dart
@@ -73,11 +73,16 @@ class BestPracticesVerifier extends RecursiveAstVisitor<Object> {
final InterfaceType _futureNullType;
/**
+ * The type system primitives
+ */
+ TypeSystem _typeSystem;
+
+ /**
* Create a new instance of the [BestPracticesVerifier].
*
* @param errorReporter the error reporter
*/
- BestPracticesVerifier(this._errorReporter, TypeProvider typeProvider)
+ BestPracticesVerifier(this._errorReporter, TypeProvider typeProvider, this._typeSystem)
: _futureNullType = typeProvider.futureNullType;
@override
@@ -304,7 +309,7 @@ class BestPracticesVerifier extends RecursiveAstVisitor<Object> {
// Warning case: test static type information
//
if (actualStaticType != null && expectedStaticType != null) {
- if (!actualStaticType.isAssignableTo(expectedStaticType)) {
+ if (!_typeSystem.isAssignableTo(actualStaticType, expectedStaticType)) {
// A warning was created in the ErrorVerifier, return false, don't
// create a hint when a warning has already been created.
return false;
@@ -320,7 +325,7 @@ class BestPracticesVerifier extends RecursiveAstVisitor<Object> {
DartType actualBestType =
actualPropagatedType != null ? actualPropagatedType : actualStaticType;
if (actualBestType != null && expectedBestType != null) {
- if (!actualBestType.isAssignableTo(expectedBestType)) {
+ if (!_typeSystem.isAssignableTo(actualBestType, expectedBestType)) {
_errorReporter.reportTypeErrorForNode(
hintCode, expression, [actualBestType, expectedBestType]);
return true;
@@ -519,14 +524,14 @@ class BestPracticesVerifier extends RecursiveAstVisitor<Object> {
? ErrorVerifier.getStaticType(lhs)
: leftVariableElement.type;
DartType staticRightType = ErrorVerifier.getStaticType(rhs);
- if (!staticRightType.isAssignableTo(leftType)) {
+ if (!_typeSystem.isAssignableTo(staticRightType, leftType)) {
// The warning was generated on this rhs
return false;
}
// Test for, and then generate the hint
DartType bestRightType = rhs.bestType;
if (leftType != null && bestRightType != null) {
- if (!bestRightType.isAssignableTo(leftType)) {
+ if (!_typeSystem.isAssignableTo(bestRightType, leftType)) {
_errorReporter.reportTypeErrorForNode(
HintCode.INVALID_ASSIGNMENT, rhs, [bestRightType, leftType]);
return true;
@@ -593,7 +598,7 @@ class BestPracticesVerifier extends RecursiveAstVisitor<Object> {
}
// For async, give no hint if Future<Null> is assignable to the return
// type.
- if (body.isAsynchronous && _futureNullType.isAssignableTo(returnTypeType)) {
+ if (body.isAsynchronous && _typeSystem.isAssignableTo(_futureNullType, returnTypeType)) {
return false;
}
// Check the block for a return statement, if not, create the hint
@@ -839,6 +844,11 @@ class ConstantVerifier extends RecursiveAstVisitor<Object> {
final TypeProvider _typeProvider;
/**
+ * The type system in use.
+ */
+ final TypeSystem _typeSystem;
+
+ /**
* The set of variables declared using '-D' on the command line.
*/
final DeclaredVariables declaredVariables;
@@ -874,7 +884,7 @@ class ConstantVerifier extends RecursiveAstVisitor<Object> {
* @param errorReporter the error reporter by which errors will be reported
*/
ConstantVerifier(this._errorReporter, this._currentLibrary,
- this._typeProvider, this.declaredVariables) {
+ this._typeProvider, this._typeSystem, this.declaredVariables) {
this._boolType = _typeProvider.boolType;
this._intType = _typeProvider.intType;
this._numType = _typeProvider.numType;
@@ -1349,7 +1359,7 @@ class ConstantVerifier extends RecursiveAstVisitor<Object> {
ErrorReporter subErrorReporter =
new ErrorReporter(errorListener, _errorReporter.source);
DartObjectImpl result = expression.accept(
- new _ConstantVerifier_validateInitializerExpression(_typeProvider,
+ new _ConstantVerifier_validateInitializerExpression(_typeProvider, _typeSystem,
subErrorReporter, this, parameterElements, declaredVariables));
_reportErrors(errorListener.errors,
CompileTimeErrorCode.NON_CONSTANT_VALUE_IN_INITIALIZER);
@@ -1475,11 +1485,16 @@ class DeadCodeVerifier extends RecursiveAstVisitor<Object> {
final ErrorReporter _errorReporter;
/**
+ * The type system for this visitor
+ */
+ final TypeSystem _typeSystem;
+
+ /**
* Create a new instance of the [DeadCodeVerifier].
*
* @param errorReporter the error reporter
*/
- DeadCodeVerifier(this._errorReporter);
+ DeadCodeVerifier(this._errorReporter, this._typeSystem);
@override
Object visitBinaryExpression(BinaryExpression node) {
@@ -1644,7 +1659,7 @@ class DeadCodeVerifier extends RecursiveAstVisitor<Object> {
}
}
for (DartType type in visitedTypes) {
- if (currentType.isSubtypeOf(type)) {
+ if (_typeSystem.isSubtypeOf(currentType, type)) {
CatchClause lastCatchClause = catchClauses[numOfCatchClauses - 1];
int offset = catchClause.offset;
int length = lastCatchClause.end - offset;
@@ -4775,7 +4790,7 @@ class HintGenerator {
ErrorReporter errorReporter = new ErrorReporter(_errorListener, source);
unit.accept(_usedImportedElementsVisitor);
// dead code analysis
- unit.accept(new DeadCodeVerifier(errorReporter));
+ unit.accept(new DeadCodeVerifier(errorReporter, _context.typeSystem));
unit.accept(_usedLocalElementsVisitor);
// dart2js analysis
if (_enableDart2JSHints) {
@@ -4783,7 +4798,7 @@ class HintGenerator {
}
// Dart best practices
unit.accept(
- new BestPracticesVerifier(errorReporter, _context.typeProvider));
+ new BestPracticesVerifier(errorReporter, _context.typeProvider, _context.typeSystem));
unit.accept(new OverrideVerifier(errorReporter, _manager));
// Find to-do comments
new ToDoFinder(errorReporter).findIn(unit);
@@ -6244,11 +6259,12 @@ class InheritanceManager {
continue;
}
bool subtypeOfAllTypes = true;
+ TypeSystem typeSystem = _library.context.typeSystem;
for (int j = 0;
j < numOfEltsWithMatchingNames && subtypeOfAllTypes;
j++) {
if (i != j) {
- if (!subtype.isSubtypeOf(executableElementTypes[j])) {
+ if (!typeSystem.isSubtypeOf(subtype, executableElementTypes[j])) {
subtypeOfAllTypes = false;
break;
}
@@ -7546,6 +7562,11 @@ class LibraryResolver {
TypeProvider _typeProvider;
/**
+ * The type system in use for the library
+ */
+ TypeSystem _typeSystem;
+
+ /**
* A table mapping library sources to the information being maintained for those libraries.
*/
HashMap<Source, Library> _libraryMap = new HashMap<Source, Library>();
@@ -7588,6 +7609,11 @@ class LibraryResolver {
TypeProvider get typeProvider => _typeProvider;
/**
+ * The type system in use.
+ */
+ TypeSystem get typeSystem => _typeSystem;
+
+ /**
* Create an object to represent the information about the library defined by the compilation unit
* with the given source.
*
@@ -7672,6 +7698,7 @@ class LibraryResolver {
}
_buildDirectiveModels();
_typeProvider = new TypeProviderImpl(coreElement, asyncElement);
+ _typeSystem = new TypeSystemImpl(typeProvider);
_buildTypeHierarchies();
//
// Perform resolution and type analysis.
@@ -7750,6 +7777,7 @@ class LibraryResolver {
}
_buildDirectiveModels();
_typeProvider = new TypeProviderImpl(coreElement, asyncElement);
+ _typeSystem = new TypeSystemImpl(typeProvider);
_buildEnumMembers();
_buildTypeHierarchies();
//
@@ -8290,6 +8318,7 @@ class LibraryResolver {
errorReporter,
library.libraryElement,
_typeProvider,
+ _typeSystem,
analysisContext.declaredVariables);
unit.accept(constantVerifier);
} on AnalysisException catch (exception, stackTrace) {
@@ -8780,6 +8809,7 @@ class LibraryResolver2 {
errorReporter,
library.libraryElement,
_typeProvider,
+ analysisContext.typeSystem,
analysisContext.declaredVariables);
ast.accept(constantVerifier);
}
@@ -14730,6 +14760,12 @@ abstract class TypeSystem {
DartType getLeastUpperBound(DartType type1, DartType type2);
/**
+ * Return `true` if the [leftType] is assignable to the [rightType] (that is,
+ * if leftType <==> rightType).
+ */
+ bool isAssignableTo(DartType leftType, DartType rightType);
+
+ /**
* Return `true` if the [leftType] is a subtype of the [rightType] (that is,
* if leftType <: rightType).
*/
@@ -14825,6 +14861,11 @@ class TypeSystemImpl implements TypeSystem {
}
@override
+ bool isAssignableTo(DartType leftType, DartType rightType) {
+ return leftType.isAssignableTo(rightType);
+ }
+
+ @override
bool isSubtypeOf(DartType leftType, DartType rightType) {
return leftType.isSubtypeOf(rightType);
}
@@ -15232,8 +15273,11 @@ class _ConstantVerifier_validateInitializerExpression extends ConstantVisitor {
List<ParameterElement> parameterElements;
+ TypeSystem _typeSystem;
+
_ConstantVerifier_validateInitializerExpression(
TypeProvider typeProvider,
+ this._typeSystem,
ErrorReporter errorReporter,
this.verifier,
this.parameterElements,
@@ -15251,19 +15295,19 @@ class _ConstantVerifier_validateInitializerExpression extends ConstantVisitor {
if (type.isDynamic) {
return new DartObjectImpl(
verifier._typeProvider.objectType, DynamicState.DYNAMIC_STATE);
- } else if (type.isSubtypeOf(verifier._boolType)) {
+ } else if (_typeSystem.isSubtypeOf(type, verifier._boolType)) {
return new DartObjectImpl(
verifier._typeProvider.boolType, BoolState.UNKNOWN_VALUE);
- } else if (type.isSubtypeOf(verifier._typeProvider.doubleType)) {
+ } else if (_typeSystem.isSubtypeOf(type, verifier._typeProvider.doubleType)) {
return new DartObjectImpl(
verifier._typeProvider.doubleType, DoubleState.UNKNOWN_VALUE);
- } else if (type.isSubtypeOf(verifier._intType)) {
+ } else if (_typeSystem.isSubtypeOf(type, verifier._intType)) {
return new DartObjectImpl(
verifier._typeProvider.intType, IntState.UNKNOWN_VALUE);
- } else if (type.isSubtypeOf(verifier._numType)) {
+ } else if (_typeSystem.isSubtypeOf(type, verifier._numType)) {
return new DartObjectImpl(
verifier._typeProvider.numType, NumState.UNKNOWN_VALUE);
- } else if (type.isSubtypeOf(verifier._stringType)) {
+ } else if (_typeSystem.isSubtypeOf(type, verifier._stringType)) {
return new DartObjectImpl(
verifier._typeProvider.stringType, StringState.UNKNOWN_VALUE);
}

Powered by Google App Engine
This is Rietveld 408576698