package ac.essex.ooechs.ecj.ecj2java.nodes;

/**
 * <p>
 * Basic Interface that allows the JavaWriter to turn GP nodes into
 * Java Code. It allows the JavaWriter to assign names to each function
 * (for variable declaration) and allows it to access the GP node's children.
 * </p>
 *
 * <p/>
 * This program is free software; you can redistribute it and/or
 * modify it under the terms of the GNU General Public License
 * as published by the Free Software Foundation; either version 2
 * of the License, or (at your option) any later version,
 * provided that any use properly credits the author.
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
 * GNU General Public License for more details at http://www.gnu.org
 * </p>
 *
 * @see ac.essex.ooechs.ecj.ecj2java.nodes.ParseableERC
 * @see ac.essex.ooechs.ecj.ecj2java.nodes.ParseableGPNode
 *
 * @author Olly Oechsle, University of Essex, Date: 05-Sep-2006
 * @version 1.0
 */
public interface ParseableNode {

    // There are two basic node types in ECJ, Functions and ERCs.
    // A terminal is a function without any children.
    public static final int FUNCTION = 1;
    public static final int ERC = 2;
    public static final int VOID = 3;
    public static final int RETURN = 4;

    public static final int BOOLEAN = 5;
    public static final int DOUBLE = 6;
    public static final int INT = 7;

    /**
     * When the java writer uses this node, it may use a variable name to refer to it.
     */
    public String getVariableName();

    /**
     * Attaches a variable name to this node, (performed automatically by JavaWriter).
     */
    public void setVariableName(String name);

    /**
     * Gets the child of this node at a given index.
     */
    public ParseableNode getChild(int index);

    /**
     * Returns how many children this node has
     */
    public int countChildren();

    /**
     * Returns what kind of node this is.
     */
    public int getType();

    /**
     * Set the node type
     */
    public void setType(int type);

    /**
     * The kind of object this is, eg int, double, etc.
     */
    public int getObjectType();

    /**
     * There may be a line comment associated with this piece of code.
     */
    public String getLineComment();

    /**
     * Writes out the java for this node
     */
    public abstract String getJavaCode();

}
