summaryrefslogblamecommitdiff
path: root/sources/meta/scalac/ast/TreeNode.java
blob: e4e16d6ffe78936d78ee15f7e8e83b57f86a63d2 (plain) (tree)






























































































































                                                                               
                                                                        














                                                                              
/*     ____ ____  ____ ____  ______                                     *\
**    / __// __ \/ __// __ \/ ____/    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;
    }

    //########################################################################
}