blob: 6fd1cf0972cd4f971c217c01040a8dbb81f02349 [file] [log] [blame]
// 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.write(' ');
}
buf.write(s);
}
void writeln(String s) {
buf.writeln(s);
}
void heading(String name, span) {
write(name);
buf.writeln(' (${span.locationText})');
}
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.writeln('null');
} else {
for (var item in list) {
buf.write(item.toString());
buf.write(', ');
}
buf.write('\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(']');
}
}
}