anchor.diff:    }
   }
   
  -//class Mix with ElementsTypesMixin {
  -//  TypeProvider typeProvider;
  -//  Dart2TypeSystem typeSystem;
  -//
  -//  FeatureSet get testFeatureSet {
  -//    return FeatureSet.forTesting();
  -//  }
  -//
  -//  void setUp() {
  -//    var analysisContext = TestAnalysisContext(
  -//      featureSet: testFeatureSet,
  -//    );
  -//    typeProvider = analysisContext.typeProvider;
  -//    typeSystem = analysisContext.typeSystem;
  -//  }
  -//}
  -
  -class SubtypingTestBase extends AbstractTypeSystemTest {
  -  void _checkEquivalent(DartType type1, DartType type2) {
  -    _checkIsSubtypeOf(type1, type2);
  -    _checkIsSubtypeOf(type2, type1);
  -  }
  -
  -  void _checkGroups(DartType t1,
  -      {List<DartType> equivalents,
  -      List<DartType> unrelated,
  -      List<DartType> subtypes,
  -      List<DartType> supertypes}) {
  -    if (equivalents != null) {
  -      for (DartType t2 in equivalents) {
  -        _checkEquivalent(t1, t2);
  -      }
  -    }
  -    if (unrelated != null) {
  -      for (DartType t2 in unrelated) {
  -        _checkUnrelated(t1, t2);
  -      }
  -    }
  -    if (subtypes != null) {
  -      for (DartType t2 in subtypes) {
  -        _checkIsStrictSubtypeOf(t2, t1);
  -      }
  -    }
  -    if (supertypes != null) {
  -      for (DartType t2 in supertypes) {
  -        _checkIsStrictSubtypeOf(t1, t2);
  -      }
  -    }
  -  }
  -
  -  void _checkIsNotSubtypeOf(DartType type1, DartType type2) {
  -    var strType1 = _toStringWithNullability(type1);
  -    var strType2 = _toStringWithNullability(type2);
  -    expect(typeSystem.isSubtypeOf(type1, type2), false,
  -        reason: '$strType1 was not supposed to be a subtype of $strType2');
  -  }
  -
  -  void _checkIsStrictSubtypeOf(DartType type1, DartType type2) {
  -    _checkIsSubtypeOf(type1, type2);
  -    _checkIsNotSubtypeOf(type2, type1);
  -  }
  -
  -  void _checkIsSubtypeOf(DartType type1, DartType type2) {
  -    expect(typeSystem.isSubtypeOf(type1, type2), true,
  -        reason: '$type1 is not a subtype of $type2');
  -  }
  -
  -  void _checkLattice(
  -      DartType top, DartType left, DartType right, DartType bottom) {
  -    _checkGroups(top,
  -        equivalents: <DartType>[top],
  -        subtypes: <DartType>[left, right, bottom]);
  -    _checkGroups(left,
  -        equivalents: <DartType>[left],
  -        subtypes: <DartType>[bottom],
  -        unrelated: <DartType>[right],
  -        supertypes: <DartType>[top]);
  -    _checkGroups(right,
  -        equivalents: <DartType>[right],
  -        subtypes: <DartType>[bottom],
  -        unrelated: <DartType>[left],
  -        supertypes: <DartType>[top]);
  -    _checkGroups(bottom,
  -        equivalents: <DartType>[bottom],
  -        supertypes: <DartType>[top, left, right]);
  -  }
  -
  -  void _checkUnrelated(DartType type1, DartType type2) {
  -    _checkIsNotSubtypeOf(type1, type2);
  -    _checkIsNotSubtypeOf(type2, type1);
  -  }
  -
  -  static String _toStringWithNullability(DartType type) {
  -    return (type as TypeImpl).toString(withNullability: true);
  -  }
  -}
  -
   @reflectiveTest
   class TypeSystemTest extends AbstractTypeSystemTest {
     InterfaceTypeImpl get functionClassTypeNone {
  
positive.code:         covariant: true);
    }
  
    void test_x_futureOr_fail_both_branches() {
      // List<T> <: FutureOr<String> can't be satisfied because neither
      // List<T> <: Future<String> nor List<T> <: int can be satisfied
  
negative.code:     // List<T> <: List<String> can be satisfied
      _checkIsSubtypeMatchOf(
          listType(T), futureOrType(listType(stringType)), [T], ['T <: String'],
          covariant: true);
    }
  
  