| Index: pkg/compiler/lib/src/tree/prettyprint.dart | 
| diff --git a/pkg/compiler/lib/src/tree/prettyprint.dart b/pkg/compiler/lib/src/tree/prettyprint.dart | 
| index f01963b663a7c29a8b6e4828136aa5ce47dfff2a..ab4c87c8883f6aa05b0e255fd2b3c96e1f1fff35 100644 | 
| --- a/pkg/compiler/lib/src/tree/prettyprint.dart | 
| +++ b/pkg/compiler/lib/src/tree/prettyprint.dart | 
| @@ -10,100 +10,18 @@ part of tree; | 
| * TODO(smok): Add main() to run from command-line to print out tree for given | 
| * .dart file. | 
| */ | 
| -class PrettyPrinter extends Indentation implements Visitor { | 
| - | 
| -  StringBuffer sb; | 
| -  Link<String> tagStack; | 
| - | 
| -  PrettyPrinter() : | 
| -      sb = new StringBuffer(), | 
| -      tagStack = const Link<String>(); | 
| - | 
| -  void pushTag(String tag) { | 
| -    tagStack = tagStack.prepend(tag); | 
| -    indentMore(); | 
| -  } | 
| - | 
| -  String popTag() { | 
| -    assert(!tagStack.isEmpty); | 
| -    String tag = tagStack.head; | 
| -    tagStack = tagStack.tail; | 
| -    indentLess(); | 
| -    return tag; | 
| -  } | 
| - | 
| -  /** | 
| -   * Adds given string to result string. | 
| -   */ | 
| -  void add(String string) { | 
| -    sb.write(string); | 
| -  } | 
| - | 
| -  void addBeginAndEndTokensToParams(Node node, Map params) { | 
| +class PrettyPrinter extends Indentation with Tagging<Node> implements Visitor { | 
| +  @override | 
| +  void addDefaultParameters(Node node, Map params) { | 
| params['getBeginToken'] = tokenToStringOrNull(node.getBeginToken()); | 
| params['getEndToken'] = tokenToStringOrNull(node.getEndToken()); | 
| } | 
|  | 
| -  /** | 
| -   * 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. | 
| -   */ | 
| -  void openNode(Node node, String type, [Map params]) { | 
| -    if (params == null) params = new Map(); | 
| -    addCurrentIndent(); | 
| -    sb.write("<"); | 
| -    addBeginAndEndTokensToParams(node, params); | 
| -    addTypeWithParams(type, params); | 
| -    sb.write(">\n"); | 
| -    pushTag(type); | 
| -  } | 
| - | 
| -  /** | 
| -   * Adds given node to result string. | 
| -   */ | 
| -  void openAndCloseNode(Node node, String type, [Map params]) { | 
| -    if (params == null) params = new Map(); | 
| -    addCurrentIndent(); | 
| -    sb.write("<"); | 
| -    addBeginAndEndTokensToParams(node, params); | 
| -    addTypeWithParams(type, params); | 
| -    sb.write("/>\n"); | 
| -  } | 
| - | 
| -  /** | 
| -   * Closes current node type. | 
| -   */ | 
| -  void closeNode() { | 
| -    String tag = popTag(); | 
| -    addCurrentIndent(); | 
| -    sb.write("</"); | 
| -    addTypeWithParams(tag); | 
| -    sb.write(">\n"); | 
| -  } | 
| - | 
| -  void addTypeWithParams(String type, [Map params]) { | 
| -    if (params == null) params = new Map(); | 
| -    sb.write("${type}"); | 
| -    params.forEach((k, v) { | 
| -      String value; | 
| -      if (v != null) { | 
| -        var str = v; | 
| -        if (v is Token) str = v.value; | 
| -        value = str | 
| -            .replaceAll("<", "<") | 
| -            .replaceAll(">", ">") | 
| -            .replaceAll('"', "'"); | 
| -      } else { | 
| -        value = "[null]"; | 
| -      } | 
| -      sb.write(' $k="$value"'); | 
| -    }); | 
| -  } | 
| - | 
| -  void addCurrentIndent() { | 
| -    sb.write(indentation); | 
| +  String valueToString(var value) { | 
| +    if (value is Token) { | 
| +      return value.value; | 
| +    } | 
| +    return value; | 
| } | 
|  | 
| /** | 
|  |