| Index: pkg/compiler/lib/src/js/js_debug.dart
 | 
| diff --git a/pkg/compiler/lib/src/js/js_debug.dart b/pkg/compiler/lib/src/js/js_debug.dart
 | 
| new file mode 100644
 | 
| index 0000000000000000000000000000000000000000..43ec1309d03b492d2feecec4ad84de60f69c2a74
 | 
| --- /dev/null
 | 
| +++ b/pkg/compiler/lib/src/js/js_debug.dart
 | 
| @@ -0,0 +1,65 @@
 | 
| +// Copyright (c) 2015, the Dart project authors.  Please see the AUTHORS file
 | 
| +// for details. All rights reserved. Use of this source code is governed by a
 | 
| +// BSD-style license that can be found in the LICENSE file.
 | 
| +
 | 
| +/// Helper for debug JS nodes.
 | 
| +
 | 
| +library js.debug;
 | 
| +
 | 
| +import 'package:js_ast/js_ast.dart';
 | 
| +import '../util/util.dart' show Indentation, Tagging;
 | 
| +
 | 
| +/// Unparse the JavaScript [node].
 | 
| +String nodeToString(Node node) {
 | 
| +  JavaScriptPrintingOptions options = new JavaScriptPrintingOptions(
 | 
| +      shouldCompressOutput: true,
 | 
| +      preferSemicolonToNewlineInMinifiedOutput: true);
 | 
| +  LenientPrintingContext printingContext =
 | 
| +      new LenientPrintingContext();
 | 
| +  new Printer(options, printingContext).visit(node);
 | 
| +  return printingContext.getText();
 | 
| +}
 | 
| +
 | 
| +/// Visitor that creates an XML-like representation of the structure of a
 | 
| +/// JavaScript [Node].
 | 
| +class DebugPrinter extends BaseVisitor with Indentation, Tagging<Node> {
 | 
| +  StringBuffer sb = new StringBuffer();
 | 
| +
 | 
| +  void visitNodeWithChildren(Node node, String type) {
 | 
| +    openNode(node, type);
 | 
| +    node.visitChildren(this);
 | 
| +    closeNode();
 | 
| +  }
 | 
| +
 | 
| +  @override
 | 
| +  void visitNode(Node node) {
 | 
| +    visitNodeWithChildren(node, '${node.runtimeType}');
 | 
| +  }
 | 
| +
 | 
| +  @override
 | 
| +  void visitName(Name node) {
 | 
| +    openAndCloseNode(node, '${node.runtimeType}', {'name': node.name});
 | 
| +  }
 | 
| +
 | 
| +  @override
 | 
| +  void visitLiteralString(LiteralString node) {
 | 
| +    openAndCloseNode(node, '${node.runtimeType}', {'value': node.value});
 | 
| +  }
 | 
| +
 | 
| +  /**
 | 
| +   * Pretty-prints given node tree into string.
 | 
| +   */
 | 
| +  static String prettyPrint(Node node) {
 | 
| +    var p = new DebugPrinter();
 | 
| +    node.accept(p);
 | 
| +    return p.sb.toString();
 | 
| +  }
 | 
| +}
 | 
| +
 | 
| +/// Simple printing context that doesn't throw on errors.
 | 
| +class LenientPrintingContext extends SimpleJavaScriptPrintingContext {
 | 
| +  @override
 | 
| +  void error(String message) {
 | 
| +    buffer.write('>>$message<<');
 | 
| +  }
 | 
| +}
 | 
| 
 |