anchor.diff:      // Note: this essentially applies erasure on generics
       // instead of Dart's covariance.
   
  -    if (i1 == i2)
  -      return true;
  -
  -    if (i1.element == i2.element)
  -      // Erasure!
  -      return true;
  -
  -    if (i1 == provider.objectType)
  -      return false;
  -
  -    if (isInterfaceSubTypeOf(i1.superclass, i2))
  -      return true;
  +    if (i1 == i2) return true;
  +
  +    // Erasure!
  +    if (i1.element == i2.element) return true;
  +
  +    if (i1 == provider.objectType) return false;
  +
  +    if (isInterfaceSubTypeOf(i1.superclass, i2)) return true;
   
       for (final parent in i1.interfaces) {
  -      if (isInterfaceSubTypeOf(parent, i2))
  -        return true;
  +      if (isInterfaceSubTypeOf(parent, i2)) return true;
       }
   
       for (final parent in i1.mixins) {
  -      if (isInterfaceSubTypeOf(parent, i2))
  -        return true;
  +      if (isInterfaceSubTypeOf(parent, i2)) return true;
       }
   
       return false;
  
positive.code: abstract class Conversion extends TypeMismatch {
    DartType _convertedType;
  
    Conversion(TypeRules rules, Expression expression) : super(rules, expression) {
      this._convertedType = _getConvertedType();
    }
  
  
negative.code: class StaticTypeError extends TypeMismatch {
    DartType expectedType;
  
    StaticTypeError(TypeRules rules, Expression expression, this.expectedType)
        : super(rules, expression);
  
    String get message =>
        'Type check failed: $expression ($baseType) is not of type $expectedType';
  
    logger.Level get level => logger.Level.SEVERE;
  }
  