| Index: pkg/compiler/lib/src/elements/resolution_types.dart
|
| diff --git a/pkg/compiler/lib/src/elements/resolution_types.dart b/pkg/compiler/lib/src/elements/resolution_types.dart
|
| index d37ef6be28ac0b1219f095fa8d70dd57ec52f8f1..050914f213915ed16236e086bd094dccd0f12310 100644
|
| --- a/pkg/compiler/lib/src/elements/resolution_types.dart
|
| +++ b/pkg/compiler/lib/src/elements/resolution_types.dart
|
| @@ -59,8 +59,8 @@ abstract class ResolutionDartType implements DartType {
|
| *
|
| * Invariant: There must be the same number of [arguments] and [parameters].
|
| */
|
| - ResolutionDartType subst(
|
| - List<ResolutionDartType> arguments, List<ResolutionDartType> parameters);
|
| + ResolutionDartType subst(covariant List<ResolutionDartType> arguments,
|
| + covariant List<ResolutionDartType> parameters);
|
|
|
| /// Performs the substitution of the type arguments of [type] for their
|
| /// corresponding type variables in this type.
|
| @@ -162,12 +162,13 @@ abstract class ResolutionDartType implements DartType {
|
| return new TypeDeclarationFormatter().format(this, name);
|
| }
|
|
|
| - R accept<R, A>(ResolutionDartTypeVisitor<R, A> visitor, A argument);
|
| + R accept<R, A>(covariant ResolutionDartTypeVisitor<R, A> visitor, A argument);
|
|
|
| - void visitChildren<R, A>(ResolutionDartTypeVisitor visitor, var argument) {}
|
| + void visitChildren<R, A>(
|
| + ResolutionDartTypeVisitor<R, A> visitor, A argument) {}
|
|
|
| - static void visitList<R, A>(
|
| - List<ResolutionDartType> types, DartTypeVisitor visitor, var argument) {
|
| + static void visitList<R, A>(List<ResolutionDartType> types,
|
| + ResolutionDartTypeVisitor<R, A> visitor, A argument) {
|
| for (ResolutionDartType type in types) {
|
| type.accept(visitor, argument);
|
| }
|
| @@ -216,8 +217,8 @@ class ResolutionTypeVariableType extends ResolutionDartType
|
|
|
| String get name => element.name;
|
|
|
| - ResolutionDartType subst(
|
| - List<ResolutionDartType> arguments, List<ResolutionDartType> parameters) {
|
| + ResolutionDartType subst(covariant List<ResolutionDartType> arguments,
|
| + covariant List<ResolutionDartType> parameters) {
|
| assert(arguments.length == parameters.length);
|
| if (parameters.isEmpty) {
|
| // Return fast on empty substitutions.
|
| @@ -283,8 +284,8 @@ class ResolutionVoidType extends ResolutionDartType implements VoidType {
|
|
|
| Element get element => null;
|
|
|
| - ResolutionDartType subst(
|
| - List<ResolutionDartType> arguments, List<ResolutionDartType> parameters) {
|
| + ResolutionDartType subst(covariant List<ResolutionDartType> arguments,
|
| + covariant List<ResolutionDartType> parameters) {
|
| // Void cannot be substituted.
|
| return this;
|
| }
|
| @@ -331,8 +332,8 @@ class MalformedType extends ResolutionDartType {
|
|
|
| String get name => element.name;
|
|
|
| - ResolutionDartType subst(
|
| - List<ResolutionDartType> arguments, List<ResolutionDartType> parameters) {
|
| + ResolutionDartType subst(covariant List<ResolutionDartType> arguments,
|
| + covariant List<ResolutionDartType> parameters) {
|
| // Malformed types are not substitutable.
|
| return this;
|
| }
|
| @@ -343,7 +344,8 @@ class MalformedType extends ResolutionDartType {
|
| @override
|
| bool get isMalformed => true;
|
|
|
| - R accept<R, A>(ResolutionDartTypeVisitor<R, A> visitor, A argument) {
|
| + R accept<R, A>(
|
| + covariant ResolutionDartTypeVisitor<R, A> visitor, A argument) {
|
| return visitor.visitMalformedType(this, argument);
|
| }
|
|
|
| @@ -367,8 +369,7 @@ class MalformedType extends ResolutionDartType {
|
| }
|
| }
|
|
|
| -abstract class GenericType<T extends GenericType<T>>
|
| - extends ResolutionDartType {
|
| +abstract class GenericType extends ResolutionDartType {
|
| final TypeDeclarationElement element;
|
| final List<ResolutionDartType> typeArguments;
|
|
|
| @@ -398,10 +399,10 @@ abstract class GenericType<T extends GenericType<T>>
|
| }
|
|
|
| /// Creates a new instance of this type using the provided type arguments.
|
| - T createInstantiation(List<ResolutionDartType> newTypeArguments);
|
| + GenericType createInstantiation(List<ResolutionDartType> newTypeArguments);
|
|
|
| - T subst(
|
| - List<ResolutionDartType> arguments, List<ResolutionDartType> parameters) {
|
| + GenericType subst(covariant List<ResolutionDartType> arguments,
|
| + covariant List<ResolutionDartType> parameters) {
|
| if (typeArguments.isEmpty) {
|
| // Return fast on non-generic types.
|
| return this;
|
| @@ -430,7 +431,8 @@ abstract class GenericType<T extends GenericType<T>>
|
| }
|
| }
|
|
|
| - void visitChildren(DartTypeVisitor visitor, var argument) {
|
| + void visitChildren<R, A>(
|
| + ResolutionDartTypeVisitor<R, A> visitor, var argument) {
|
| ResolutionDartType.visitList(typeArguments, visitor, argument);
|
| }
|
|
|
| @@ -489,9 +491,7 @@ abstract class GenericType<T extends GenericType<T>>
|
| }
|
| }
|
|
|
| -// ignore: INCONSISTENT_METHOD_INHERITANCE
|
| -class ResolutionInterfaceType extends GenericType<ResolutionInterfaceType>
|
| - implements InterfaceType {
|
| +class ResolutionInterfaceType extends GenericType implements InterfaceType {
|
| int _hashCode;
|
|
|
| ResolutionInterfaceType(ClassElement element,
|
| @@ -565,6 +565,11 @@ class ResolutionInterfaceType extends GenericType<ResolutionInterfaceType>
|
| ResolutionFunctionType type = element.callType;
|
| return type != null && isGeneric ? type.substByContext(this) : type;
|
| }
|
| +
|
| + ResolutionInterfaceType subst(covariant List<ResolutionDartType> arguments,
|
| + covariant List<ResolutionDartType> parameters) {
|
| + return super.subst(arguments, parameters);
|
| + }
|
| }
|
|
|
| /// Special subclass of [ResolutionInterfaceType] used for generic interface
|
| @@ -696,8 +701,8 @@ class ResolutionFunctionType extends ResolutionDartType
|
| return null;
|
| }
|
|
|
| - ResolutionDartType subst(
|
| - List<ResolutionDartType> arguments, List<ResolutionDartType> parameters) {
|
| + ResolutionDartType subst(covariant List<ResolutionDartType> arguments,
|
| + covariant List<ResolutionDartType> parameters) {
|
| if (parameters.isEmpty) {
|
| assert(arguments.isEmpty);
|
| // Return fast on empty substitutions.
|
| @@ -757,11 +762,12 @@ class ResolutionFunctionType extends ResolutionDartType
|
| });
|
| }
|
|
|
| - R accept<R, A>(DartTypeVisitor<R, A> visitor, A argument) {
|
| + R accept<R, A>(covariant DartTypeVisitor<R, A> visitor, A argument) {
|
| return visitor.visitFunctionType(this, argument);
|
| }
|
|
|
| - void visitChildren(DartTypeVisitor visitor, var argument) {
|
| + void visitChildren<R, A>(
|
| + ResolutionDartTypeVisitor<R, A> visitor, var argument) {
|
| returnType.accept(visitor, argument);
|
| ResolutionDartType.visitList(parameterTypes, visitor, argument);
|
| ResolutionDartType.visitList(optionalParameterTypes, visitor, argument);
|
| @@ -860,7 +866,7 @@ class ResolutionFunctionType extends ResolutionDartType
|
| bool _typeContainsMethodTypeVariableType(ResolutionDartType type) =>
|
| type.containsMethodTypeVariableType;
|
|
|
| -class ResolutionTypedefType extends GenericType<ResolutionTypedefType> {
|
| +class ResolutionTypedefType extends GenericType {
|
| ResolutionDartType _unaliased;
|
|
|
| ResolutionTypedefType(TypedefElement element,
|
| @@ -907,7 +913,8 @@ class ResolutionTypedefType extends GenericType<ResolutionTypedefType> {
|
|
|
| ResolutionTypedefType asRaw() => super.asRaw();
|
|
|
| - R accept<R, A>(ResolutionDartTypeVisitor<R, A> visitor, A argument) {
|
| + R accept<R, A>(
|
| + covariant ResolutionDartTypeVisitor<R, A> visitor, A argument) {
|
| return visitor.visitTypedefType(this, argument);
|
| }
|
| }
|
| @@ -926,8 +933,8 @@ class ResolutionDynamicType extends ResolutionDartType implements DynamicType {
|
|
|
| ResolutionTypeKind get kind => ResolutionTypeKind.DYNAMIC;
|
|
|
| - ResolutionDartType subst(List<ResolutionDartType> arguments,
|
| - List<ResolutionDartType> parameters) =>
|
| + ResolutionDartType subst(covariant List<ResolutionDartType> arguments,
|
| + covariant List<ResolutionDartType> parameters) =>
|
| this;
|
|
|
| R accept<R, A>(DartTypeVisitor<R, A> visitor, A argument) {
|
| @@ -1000,7 +1007,7 @@ abstract class BaseResolutionDartTypeVisitor<R, A>
|
| R visitGenericType(GenericType type, A argument) => visitType(type, argument);
|
|
|
| @override
|
| - R visitInterfaceType(ResolutionInterfaceType type, A argument) =>
|
| + R visitInterfaceType(covariant ResolutionInterfaceType type, A argument) =>
|
| visitGenericType(type, argument);
|
|
|
| @override
|
| @@ -1009,33 +1016,38 @@ abstract class BaseResolutionDartTypeVisitor<R, A>
|
| }
|
|
|
| abstract class AbstractTypeRelationMixin
|
| - implements AbstractTypeRelation, ResolutionDartTypeVisitor<bool, DartType> {
|
| + implements
|
| + AbstractTypeRelation<ResolutionDartType>,
|
| + ResolutionDartTypeVisitor<bool, ResolutionDartType> {
|
| Resolution get resolution;
|
|
|
| @override
|
| CommonElements get commonElements => resolution.commonElements;
|
|
|
| /// Ensures that the super hierarchy of [type] is computed.
|
| - void ensureResolved(ResolutionInterfaceType type) {
|
| + void ensureResolved(covariant ResolutionInterfaceType type) {
|
| // TODO(johnniwinther): Currently needed since literal types like int,
|
| // double, bool etc. might not have been resolved yet.
|
| type.element.ensureResolved(resolution);
|
| }
|
|
|
| /// Returns the unaliased version of [type].
|
| - DartType getUnaliased(ResolutionDartType type) {
|
| + ResolutionDartType getUnaliased(covariant ResolutionDartType type) {
|
| type.computeUnaliased(resolution);
|
| return type.unaliased;
|
| }
|
|
|
| @override
|
| - DartType getTypeVariableBound(TypeVariableElement element) => element.bound;
|
| + DartType getTypeVariableBound(covariant TypeVariableElement element) =>
|
| + element.bound;
|
|
|
| @override
|
| - FunctionType getCallType(ResolutionInterfaceType type) => type.callType;
|
| + FunctionType getCallType(covariant ResolutionInterfaceType type) =>
|
| + type.callType;
|
|
|
| @override
|
| - InterfaceType asInstanceOf(ResolutionInterfaceType type, ClassEntity cls) =>
|
| + InterfaceType asInstanceOf(
|
| + covariant ResolutionInterfaceType type, ClassEntity cls) =>
|
| type.asInstanceOf(cls);
|
|
|
| /// Handle as dynamic for both subtype and more specific relation to avoid
|
| @@ -1046,21 +1058,23 @@ abstract class AbstractTypeRelationMixin
|
| visitType(t, s);
|
| }
|
|
|
| -class ResolutionMoreSpecificVisitor extends MoreSpecificVisitor
|
| +class ResolutionMoreSpecificVisitor
|
| + extends MoreSpecificVisitor<ResolutionDartType>
|
| with AbstractTypeRelationMixin {
|
| final Resolution resolution;
|
|
|
| ResolutionMoreSpecificVisitor(this.resolution);
|
| }
|
|
|
| -class ResolutionSubtypeVisitor extends SubtypeVisitor
|
| +class ResolutionSubtypeVisitor extends SubtypeVisitor<ResolutionDartType>
|
| with AbstractTypeRelationMixin {
|
| final Resolution resolution;
|
|
|
| ResolutionSubtypeVisitor(this.resolution);
|
| }
|
|
|
| -class ResolutionPotentialSubtypeVisitor extends PotentialSubtypeVisitor
|
| +class ResolutionPotentialSubtypeVisitor
|
| + extends PotentialSubtypeVisitor<ResolutionDartType>
|
| with AbstractTypeRelationMixin {
|
| final Resolution resolution;
|
|
|
| @@ -1072,8 +1086,8 @@ class ResolutionPotentialSubtypeVisitor extends PotentialSubtypeVisitor
|
| * substitute for the bound of [typeVariable]. [bound] holds the bound against
|
| * which [typeArgument] should be checked.
|
| */
|
| -typedef void CheckTypeVariableBound<T extends GenericType>(T type,
|
| - DartType typeArgument, TypeVariableType typeVariable, DartType bound);
|
| +typedef void CheckTypeVariableBound(GenericType type, DartType typeArgument,
|
| + TypeVariableType typeVariable, DartType bound);
|
|
|
| class Types extends DartTypes {
|
| final Resolution resolution;
|
| @@ -1098,35 +1112,34 @@ class Types extends DartTypes {
|
| }
|
|
|
| @override
|
| - InterfaceType asInstanceOf(ResolutionInterfaceType type, ClassEntity cls) {
|
| + InterfaceType asInstanceOf(
|
| + covariant ResolutionInterfaceType type, ClassEntity cls) {
|
| return type.asInstanceOf(cls);
|
| }
|
|
|
| @override
|
| - ResolutionDartType substByContext(
|
| - ResolutionDartType base, ResolutionInterfaceType context) {
|
| + ResolutionDartType substByContext(covariant ResolutionDartType base,
|
| + covariant ResolutionInterfaceType context) {
|
| return base.substByContext(context);
|
| }
|
|
|
| @override
|
| - InterfaceType getThisType(ClassElement cls) {
|
| - return cls.thisType;
|
| - }
|
| + InterfaceType getThisType(covariant ClassElement cls) => cls.thisType;
|
|
|
| @override
|
| - ResolutionInterfaceType getSupertype(ClassElement cls) {
|
| - return cls.supertype;
|
| - }
|
| + ResolutionInterfaceType getSupertype(covariant ClassElement cls) =>
|
| + cls.supertype;
|
|
|
| @override
|
| - Iterable<InterfaceType> getSupertypes(ClassElement cls) {
|
| + Iterable<InterfaceType> getSupertypes(covariant ClassElement cls) {
|
| assert(cls.allSupertypes != null,
|
| failedAt(cls, 'Supertypes have not been computed for $cls.'));
|
| return cls.allSupertypes;
|
| }
|
|
|
| @override
|
| - FunctionType getCallType(ResolutionInterfaceType type) => type.callType;
|
| + FunctionType getCallType(covariant ResolutionInterfaceType type) =>
|
| + type.callType;
|
|
|
| /// Flatten [type] by recursively removing enclosing `Future` annotations.
|
| ///
|
| @@ -1179,15 +1192,18 @@ class Types extends DartTypes {
|
| }
|
|
|
| /** Returns true if t is a subtype of s */
|
| - bool isSubtype(ResolutionDartType t, ResolutionDartType s) {
|
| + bool isSubtype(
|
| + covariant ResolutionDartType t, covariant ResolutionDartType s) {
|
| return subtypeVisitor.isSubtype(t, s);
|
| }
|
|
|
| - bool isAssignable(ResolutionDartType r, ResolutionDartType s) {
|
| + bool isAssignable(
|
| + covariant ResolutionDartType r, covariant ResolutionDartType s) {
|
| return subtypeVisitor.isAssignable(r, s);
|
| }
|
|
|
| - bool isPotentialSubtype(ResolutionDartType t, ResolutionDartType s) {
|
| + bool isPotentialSubtype(
|
| + covariant ResolutionDartType t, covariant ResolutionDartType s) {
|
| // TODO(johnniwinther): Return a set of variable points in the positive
|
| // cases.
|
| return potentialSubtypeVisitor.isSubtype(t, s);
|
| @@ -1195,10 +1211,13 @@ class Types extends DartTypes {
|
|
|
| @override
|
| void checkTypeVariableBounds(
|
| - ResolutionInterfaceType type,
|
| + covariant ResolutionInterfaceType type,
|
| void checkTypeVariableBound(InterfaceType type, DartType typeArgument,
|
| TypeVariableType typeVariable, DartType bound)) {
|
| - genericCheckTypeVariableBounds(type, checkTypeVariableBound);
|
| + void f(DartType type, DartType typeArgument, TypeVariableType typeVariable,
|
| + DartType bound) =>
|
| + checkTypeVariableBound(type, typeArgument, typeVariable, bound);
|
| + genericCheckTypeVariableBounds(type, f);
|
| }
|
|
|
| /**
|
| @@ -1206,8 +1225,8 @@ class Types extends DartTypes {
|
| * declared on [element]. Calls [checkTypeVariableBound] on each type
|
| * argument and bound.
|
| */
|
| - void genericCheckTypeVariableBounds<T extends GenericType>(
|
| - T type, CheckTypeVariableBound<T> checkTypeVariableBound) {
|
| + void genericCheckTypeVariableBounds(
|
| + GenericType type, CheckTypeVariableBound checkTypeVariableBound) {
|
| TypeDeclarationElement element = type.element;
|
| List<ResolutionDartType> typeArguments = type.typeArguments;
|
| List<ResolutionDartType> typeVariables = element.typeVariables;
|
| @@ -1653,7 +1672,8 @@ class MoreSpecificSubtypeVisitor
|
| return null;
|
| }
|
|
|
| - bool visitType(ResolutionDartType type, ResolutionDartType argument) {
|
| + bool visitType(
|
| + covariant ResolutionDartType type, ResolutionDartType argument) {
|
| return types.isMoreSpecific(type, argument);
|
| }
|
|
|
| @@ -1666,7 +1686,7 @@ class MoreSpecificSubtypeVisitor
|
| }
|
|
|
| bool visitTypeVariableType(
|
| - ResolutionTypeVariableType type, ResolutionDartType argument) {
|
| + covariant ResolutionTypeVariableType type, ResolutionDartType argument) {
|
| ResolutionDartType constraint =
|
| types.getMostSpecific(constraintMap[type], argument);
|
| constraintMap[type] = constraint;
|
| @@ -1674,7 +1694,7 @@ class MoreSpecificSubtypeVisitor
|
| }
|
|
|
| bool visitFunctionType(
|
| - ResolutionFunctionType type, ResolutionDartType argument) {
|
| + covariant ResolutionFunctionType type, ResolutionDartType argument) {
|
| if (argument is ResolutionFunctionType) {
|
| if (type.parameterTypes.length != argument.parameterTypes.length) {
|
| return false;
|
| @@ -1741,7 +1761,7 @@ class TypeDeclarationFormatter
|
| return proposal;
|
| }
|
|
|
| - void visit(ResolutionDartType type, [_]) {
|
| + void visit(covariant ResolutionDartType type, [_]) {
|
| type.accept(this, null);
|
| }
|
|
|
| @@ -1756,7 +1776,7 @@ class TypeDeclarationFormatter
|
| }
|
| }
|
|
|
| - void visitType(ResolutionDartType type, String name) {
|
| + void visitType(covariant ResolutionDartType type, String name) {
|
| if (name == null) {
|
| sb.write(type);
|
| } else {
|
| @@ -1777,7 +1797,7 @@ class TypeDeclarationFormatter
|
| }
|
| }
|
|
|
| - void visitFunctionType(ResolutionFunctionType type, String name) {
|
| + void visitFunctionType(covariant ResolutionFunctionType type, String name) {
|
| visit(type.returnType);
|
| sb.write(' ');
|
| if (name != null) {
|
|
|