| Index: sdk/lib/_internal/compiler/implementation/dart_types.dart
|
| diff --git a/sdk/lib/_internal/compiler/implementation/dart_types.dart b/sdk/lib/_internal/compiler/implementation/dart_types.dart
|
| index 5f00a6239398959059aec7c69a12f529a4a0d9a7..b0a900246a95a1a9d68401c44d893518bf04344a 100644
|
| --- a/sdk/lib/_internal/compiler/implementation/dart_types.dart
|
| +++ b/sdk/lib/_internal/compiler/implementation/dart_types.dart
|
| @@ -864,6 +864,8 @@ class Member {
|
| }
|
|
|
| abstract class DartTypeVisitor<R, A> {
|
| + const DartTypeVisitor();
|
| +
|
| R visitType(DartType type, A argument);
|
|
|
| R visitVoidType(VoidType type, A argument) =>
|
| @@ -1044,6 +1046,7 @@ class Types {
|
| final VoidType voidType;
|
| final DynamicType dynamicType;
|
| final SubtypeVisitor subtypeVisitor;
|
| + final PotentialSubtypeVisitor potentialSubtypeVisitor;
|
|
|
| factory Types(Compiler compiler, ClassElement dynamicElement) {
|
| LibraryElement library = new LibraryElementX(new Script(null, null));
|
| @@ -1052,11 +1055,15 @@ class Types {
|
| dynamicElement.rawType = dynamicElement.thisType = dynamicType;
|
| SubtypeVisitor subtypeVisitor =
|
| new SubtypeVisitor(compiler, dynamicType, voidType);
|
| - return new Types.internal(compiler, voidType, dynamicType, subtypeVisitor);
|
| + PotentialSubtypeVisitor potentialSubtypeVisitor =
|
| + new PotentialSubtypeVisitor(compiler, dynamicType, voidType);
|
| +
|
| + return new Types.internal(compiler, voidType, dynamicType,
|
| + subtypeVisitor, potentialSubtypeVisitor);
|
| }
|
|
|
| Types.internal(this.compiler, this.voidType, this.dynamicType,
|
| - this.subtypeVisitor);
|
| + this.subtypeVisitor, this.potentialSubtypeVisitor);
|
|
|
| /** Returns true if t is a subtype of s */
|
| bool isSubtype(DartType t, DartType s) {
|
| @@ -1067,6 +1074,11 @@ class Types {
|
| return subtypeVisitor.isAssignable(r, s);
|
| }
|
|
|
| + bool isPotentialSubtype(DartType t, DartType s) {
|
| + // TODO(johnniwinther): Return a set of variable points in the positive
|
| + // cases.
|
| + return potentialSubtypeVisitor.isSubtype(t, s);
|
| + }
|
|
|
| /**
|
| * Helper method for performing substitution of a linked list of types.
|
| @@ -1121,3 +1133,18 @@ class Types {
|
| return typeVariable.element.enclosingElement;
|
| }
|
| }
|
| +
|
| +class PotentialSubtypeVisitor extends SubtypeVisitor {
|
| + PotentialSubtypeVisitor(Compiler compiler,
|
| + DynamicType dynamicType,
|
| + VoidType voidType)
|
| + : super(compiler, dynamicType, voidType);
|
| +
|
| +
|
| + bool isSubtype(DartType t, DartType s) {
|
| + if (t is TypeVariableType || s is TypeVariableType) {
|
| + return true;
|
| + }
|
| + return super.isSubtype(t, s);
|
| + }
|
| +}
|
|
|