Index: utils/template/tree.dart |
diff --git a/utils/template/tree.dart b/utils/template/tree.dart |
new file mode 100644 |
index 0000000000000000000000000000000000000000..8e4964593e8b074bb23edc0d862dccce1fc05d99 |
--- /dev/null |
+++ b/utils/template/tree.dart |
@@ -0,0 +1,108 @@ |
+// Copyright (c) 2011, 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. |
+/** |
+ * The base type for all nodes in a dart abstract syntax tree. |
+ */ |
+class ASTNode { |
+ /** The source code this [ASTNode] represents. */ |
+ SourceSpan span; |
+ |
+ ASTNode(this.span) {} |
+ |
+ /** Classic double-dispatch visitor for implementing passes. */ |
+ abstract visit(TreeVisitor visitor); |
+ |
+ /** A multiline string showing the node and its children. */ |
+ String toDebugString() { |
+ var to = new TreeOutput(); |
+ var tp = new TreePrinter(to); |
+ this.visit(tp); |
+ return to.buf.toString(); |
+ } |
+} |
+ |
+// TODO(jimhug): Clean-up and factor out of core. |
+/** Simple class to provide a textual dump of trees for debugging. */ |
+class TreeOutput { |
+ int depth; |
+ StringBuffer buf; |
+ |
+ var printer; |
+ |
+ static void dump(ASTNode node) { |
+ var o = new TreeOutput(); |
+ node.visit(new TreePrinter(o)); |
+ print(o.buf); |
+ } |
+ |
+ TreeOutput(): this.depth = 0, this.buf = new StringBuffer() { |
+ } |
+ |
+ void write(String s) { |
+ for (int i=0; i < depth; i++) { |
+ buf.add(' '); |
+ } |
+ buf.add(s); |
+ } |
+ |
+ void writeln(String s) { |
+ write(s); |
+ buf.add('\n'); |
+ } |
+ |
+ void heading(String name, span) { |
+ write(name); |
+ buf.add(' (${span.locationText})'); |
+ buf.add('\n'); |
+ } |
+ |
+ String toValue(value) { |
+ if (value == null) return 'null'; |
+ else if (value is Identifier) return value.name; |
+ else return value.toString(); |
+ } |
+ |
+ void writeNode(String label, ASTNode node) { |
+ write(label + ': '); |
+ depth += 1; |
+ if (node != null) node.visit(printer); |
+ else writeln('null'); |
+ depth -= 1; |
+ } |
+ |
+ void writeValue(String label, value) { |
+ var v = toValue(value); |
+ writeln('${label}: ${v}'); |
+ } |
+ |
+ void writeList(String label, List list) { |
+ write(label + ': '); |
+ if (list == null) { |
+ buf.add('null'); |
+ buf.add('\n'); |
+ } else { |
+ for (var item in list) { |
+ buf.add(item.toString()); |
+ buf.add(', '); |
+ } |
+ buf.add('\n'); |
+ } |
+ } |
+ |
+ void writeNodeList(String label, List list) { |
+ writeln('${label} ['); |
+ if (list != null) { |
+ depth += 1; |
+ for (var node in list) { |
+ if (node != null) { |
+ node.visit(printer); |
+ } else { |
+ writeln('null'); |
+ } |
+ } |
+ depth -= 1; |
+ writeln(']'); |
+ } |
+ } |
+} |