| 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();
|
| +}
|
|
|