anchor.diff:      }
   
       if (diff[key].hasRemoved) {
  -      io.writeln('$owner no longer has these ${pluralize(key)}:\n');
  +      io.writeln('$name no longer has these ${pluralize(key)}:\n');
         diff[key].forEachRemoved((String idx, Object el) {
           el = formatter(el, link: false);
           io.writeln('* $el');
  
positive.code:     }
  
      if (diff[key].hasChanged) {
        io.writeln('$owner has changed ${pluralize(key)}:\n');
        diff[key].forEachChanged((String idx, List oldNew) {
          var theOld = oldNew[0];
          var theNew = oldNew[1];
  
negative.code: 
      // TODO: also Errors and Typedefs?
      io.bufferH2(
          'class ${mdLinkToDartlang(qualifiedName, name)}');
      reportClass();
  
      // After reporting, prune and print anything remaining.
      diff.prune();
      diff.metadata.clear();
      String ds = diff.toString();
      if (ds.isNotEmpty) {
        print('$qualifiedName HAS UNRESOLVED NODES:');
        print(ds);
      }
    }
  
    void reportClass() {
      if (diff.containsKey('annotations'))
        _reportList('annotations', formatter: annotationFormatter);
  
      _reportImmediateChanges();
  
      if (diff.containsKey('subclass'))
        _reportList('subclass', formatter: classFormatter);
  
      _reportImplements();
  
      // Iterate over the method categories.
      diff.forEachOf('methods', _reportEachMethodCategory);
      if (hideInherited)
        erase(diff.node, 'inheritedMethods');
      else
  