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