blob: 7bdc3e6b3866a49ca4c146b3342bf16c83b4cef8 [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();
}
}
/** The base type for expressions. */
// TODO(terry): Should be abstract class; but frog doesn't support abstract.
class Expression extends ASTNode {
Expression(SourceSpan span): super(span);
visit(TreeVisitor visitor) {} // TODO(terry): remove when abstract.
}
/** The base type for a reference to a [Type]. */
// TODO(terry): Should be abstract class; but frog doesn't support abstract.
class TypeReference extends ASTNode {
TypeReference(SourceSpan span): super(span);
visit(TreeVisitor visitor) {} // TODO(terry): remove when abstract.
}
// 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) {
write(s);
buf.write('\n');
}
void heading(String name, span) {
write(name);
buf.write(' (${span.locationText})');
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, 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.write('null');
buf.write('\n');
} 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(']');
}
}
}