/* ____ ____ ____ ____ ______ *\
** / __// __ \/ __// __ \/ ____/ SOcos COmpiles Scala **
** __\_ \/ /_/ / /__/ /_/ /\_ \ (c) 2002, LAMP/EPFL **
** /_____/\____/\___/\____/____/ **
\* */
// $Id$
package meta.scalac.ast;
import meta.java.Type;
import meta.java.JavaWriter;
import meta.scalac.Phase;
/** This class describes a tree node. */
public class TreeNode {
//########################################################################
// Public Fields
public final String name;
public final TreeKind kind;
public final TreeSymbol symbol;
public String description;
public Phase start;
public Phase stop;
public TreeField[] fields;
public int arrays;
//########################################################################
// Public Constructors
public TreeNode(String name, TreeKind kind, TreeSymbol symbol) {
this(name, kind, symbol, new TreeField[0]);
}
public TreeNode(String name, TreeKind kind, TreeSymbol symbol,
TreeField[] fields)
{
this.name = name;
this.kind = kind;
this.symbol = symbol;
this.fields = fields;
}
//########################################################################
// Public Methods
public boolean hasExtClass() {
return hasSymbol();
}
public boolean hasSymbol() {
return symbol == symbol.HasSym || symbol == symbol.DefSym;
}
public boolean definesSymbol() {
return symbol == symbol.DefSym;
}
public Type getType(int rank) {
arrays = Math.max(arrays , rank);
return rank == 0 ? TreeType.Node(this) : Type.Array(getType(rank - 1));
}
public TreeNode setDescription(String description) {
this.description = description;
return this;
}
public TreeNode setRange(Phase start, Phase stop) {
this.start = start;
this.stop = stop;
return this;
}
public TreeNode noFields() {
fields = null;
return this;
}
public TreeNode addField(Type type, String name) {
TreeField[] array = new TreeField[fields.length + 1];
for (int i = 0; i < fields.length; i++) array[i] = fields[i];
array[fields.length] = new TreeField(type, name);
fields = array;
return this;
}
public JavaWriter printCase(JavaWriter writer, boolean wildcards) {
writer.print("case ").print(name);
if (fields!=null) printParams(writer.print("("),wildcards).print(")");
return writer.print(":").space();
}
public JavaWriter printParams(JavaWriter writer) {
return printParams(writer, false);
}
public JavaWriter printParams(JavaWriter writer, String prefix) {
return printParams(printPrefix(writer, prefix));
}
public JavaWriter printParams(JavaWriter writer, boolean wildcards) {
if (fields != null) for (int i = 0; i < fields.length; i++) {
if (i > 0) writer.print(", ");
if (wildcards) writer.print("_");
else writer.print(fields[i].type).space().print(fields[i].name);
}
return writer;
}
public JavaWriter printArgs(JavaWriter writer) {
if (fields != null) for (int i = 0; i < fields.length; i++) {
if (i > 0) writer.print(", ");
writer.print(fields[i].name);
}
return writer;
}
public JavaWriter printArgs(JavaWriter writer, String prefix) {
return printArgs(printPrefix(writer, prefix));
}
public JavaWriter printPrefix(JavaWriter writer, String prefix) {
if (prefix != null) {
writer.print(prefix);
if (fields != null && fields.length > 0) writer.print(", ");
}
return writer;
}
public JavaWriter printNew(JavaWriter writer) {
String classname = (hasExtClass() ? "Ext" : "") + name;
return printArgs(writer.print("new " + classname + "(")).print(")");
}
public String toString() {
return name;
}
//########################################################################
}