| 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);
|
| }
|
|
|