anchor.diff:          buffer.write(typeArg.displayName);
         }
         buffer.write(">");
  -      name = buffer.toString();
  -    }
  -
  -    return name;
  +    }
  +    if (nullabilitySuffix == NullabilitySuffix.question) {
  +      buffer.write('?');
  +    }
  +    return buffer.toString();
     }
   
     @override
  
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;
  