anchor.diff:    static const String INDENT = "  ";
   
     StringBuffer sb;
  -  int depth;
  -  /** Prefix for the type passed to the next [openNode()] call. */
  -  String nextTypePrefix;
  -  /** Nodes that were opened with [openNode()] calls. */
  -  Link<String> currentNodeTypes;
  +  Link<String> tagStack;
   
     PrettyPrinter() :
         sb = new StringBuffer(),
  -      depth = 0,
  -      currentNodeTypes = new EmptyLink<String>();
  -
  -  void pushCurrentNodeType(String nodeType) {
  -    currentNodeTypes = currentNodeTypes.prepend(nodeType);
  -  }
  -
  -  String popCurrentNodeType() {
  -    assert(!currentNodeTypes.isEmpty());
  -    String currentNodeType = currentNodeTypes.head;
  -    currentNodeTypes = currentNodeTypes.tail;
  -    return currentNodeType;
  +      tagStack = new EmptyLink<String>();
  +
  +  void pushTag(String tag) {
  +    tagStack = tagStack.prepend(tag);
  +  }
  +
  +  String popTag() {
  +    assert(!tagStack.isEmpty());
  +    String tag = tagStack.head;
  +    tagStack = tagStack.tail;
  +    return tag;
     }
   
     /**
  
positive.code: 
    visitTypeAnnotation(TypeAnnotation node) {
      openNode(node, "TypeAnnotation");
      visitWithPrefix(node.typeName, "typeName:");
      visitWithPrefix(node.typeArguments, "typeArguments:");
      closeNode();
    }
  
  
negative.code:   }
  
    /**
     * Adds given node type to result string.
     * The method "opens" the node, meaning that all output after calling
     * this method and before calling closeNode() will represent contents
     * of given node.
  