91dd628bd8
Need unique name for library collision with template parser. Few more changes to work under VM. More changes for lang.dart seperation. Seperation from lang.dart (tokenizer can't access private fields of base class in another library). This was allowed in frog but not in the VM. VM is right so need to sever dependency. BUG= TEST= Review URL: https://chromiumcodereview.appspot.com//9695048 git-svn-id: https://dart.googlecode.com/svn/branches/bleeding_edge/dart@5544 260f80e4-7a28-3924-810f-c04153c831b5
125 lines
2.9 KiB
Dart
125 lines
2.9 KiB
Dart
// 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.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(']');
|
|
}
|
|
}
|
|
}
|