anchor.diff:        return true;
       }
   
  +    StringBuffer buffer = new StringBuffer();
  +    buffer.write(name);
       // If there is at least one non-dynamic type, then list them out.
  -    if (!areAllTypeArgumentsDynamic()) {
  -      StringBuffer buffer = new StringBuffer();
  -      buffer.write(name);
  +    if (!allTypeArgumentsAreDynamic()) {
         buffer.write("<");
         for (int i = 0; i < typeArguments.length; i++) {
           if (i != 0) {
  
positive.code: 
    @override
    String get displayName {
      String name = this.name;
  
      List<DartType> typeArguments = this.typeArguments;
  
      bool areAllTypeArgumentsDynamic() {
        for (DartType type in typeArguments) {
          if (type != null && !type.isDynamic) {
            return false;
  
negative.code: 
    @override
    String get displayName {
      if (name == null || name.isEmpty) {
        // Function types have an empty name when they are defined implicitly by
        // either a closure or as part of a parameter declaration.
        StringBuffer buffer = new StringBuffer();
        appendTo(buffer, new Set.identity());
        if (nullabilitySuffix == NullabilitySuffix.question) {
          buffer.write('?');
        }
        return buffer.toString();
      }
  
      List<DartType> typeArguments = this.typeArguments;
  
      bool allTypeArgumentsAreDynamic() {
        for (DartType type in typeArguments) {
          if (type != null && !type.isDynamic) {
            return false;
  