Index: mojo/public/dart/third_party/csslib/lib/src/tree_base.dart |
diff --git a/mojo/public/dart/third_party/csslib/lib/src/tree_base.dart b/mojo/public/dart/third_party/csslib/lib/src/tree_base.dart |
new file mode 100644 |
index 0000000000000000000000000000000000000000..095b4932f081cb162b8acc547f08cbe102920b3c |
--- /dev/null |
+++ b/mojo/public/dart/third_party/csslib/lib/src/tree_base.dart |
@@ -0,0 +1,97 @@ |
+// Copyright (c) 2012, 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. |
+ |
+part of csslib.visitor; |
+ |
+/** |
+ * The base type for all nodes in a CSS abstract syntax tree. |
+ */ |
+abstract class TreeNode { |
+ /** The source code this [TreeNode] represents. */ |
+ final SourceSpan span; |
+ |
+ TreeNode(this.span); |
+ |
+ TreeNode clone(); |
+ |
+ /** Classic double-dispatch visitor for implementing passes. */ |
+ void visit(VisitorBase visitor); |
+ |
+ /** A multiline string showing the node and its children. */ |
+ String toDebugString() { |
+ var to = new TreeOutput(); |
+ var tp = new _TreePrinter(to, true); |
+ this.visit(tp); |
+ return to.buf.toString(); |
+ } |
+} |
+ |
+/** The base type for expressions. */ |
+abstract class Expression extends TreeNode { |
+ Expression(SourceSpan span) : super(span); |
+} |
+ |
+/** Simple class to provide a textual dump of trees for debugging. */ |
+class TreeOutput { |
+ int depth = 0; |
+ final StringBuffer buf = new StringBuffer(); |
+ VisitorBase printer; |
+ |
+ void write(String s) { |
+ for (int i = 0; i < depth; i++) { |
+ buf.write(' '); |
+ } |
+ buf.write(s); |
+ } |
+ |
+ void writeln(String s) { |
+ write(s); |
+ buf.write('\n'); |
+ } |
+ |
+ void heading(String name, [span]) { |
+ write(name); |
+ if (span != null) { |
+ buf.write(' (${span.message('')})'); |
+ } |
+ buf.write('\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, TreeNode 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 writeNodeList(String label, List<TreeNode> 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(']'); |
+ } |
+ } |
+ |
+ String toString() => buf.toString(); |
+} |