FunctionTypeNode.java

package edu.udel.cis.vsl.tass.ast.impl.type;

import java.io.PrintWriter;
import java.util.NoSuchElementException;

import edu.udel.cis.vsl.tass.ast.IF.ASTNodeIF;
import edu.udel.cis.vsl.tass.ast.IF.SequenceNodeIF;
import edu.udel.cis.vsl.tass.ast.IF.type.FunctionTypeNodeIF;
import edu.udel.cis.vsl.tass.ast.IF.type.TypeNodeIF;
import edu.udel.cis.vsl.tass.ast.impl.ASTNode;

public class FunctionTypeNode extends ASTNode implements FunctionTypeNodeIF {

	private SequenceNodeIF<TypeNodeIF> inputTypes;
	private TypeNodeIF outputType;

	public FunctionTypeNode(long id) {
		super(id);
	}
	
	public FunctionTypeNode(long id, SequenceNodeIF<TypeNodeIF> inputTypes,
			TypeNodeIF outputType) {
		super(id);
		this.inputTypes = inputTypes;
		this.outputType = outputType;
	}

	@Override
	public int numChildren() {
		return 2;
	}

	@Override
	public ASTNodeIF child(int index) throws NoSuchElementException {
		switch (index) {
		case 0:
			return inputTypes;
		case 1:
			return outputType;
		default:
			throw new NoSuchElementException("Node " + id()
					+ " does not have a child with index " + index + ".");
		}
	}

	@SuppressWarnings("unchecked")
	@Override
	public void setChild(int i, ASTNodeIF child) {
		switch (i) {
		case 0:
			// Java can't type check generics, so check that the child has the
			// correct type.
			for (int j = 0; j < child.numChildren(); j++) {
				assert child.child(0) instanceof TypeNodeIF;
			}
			this.inputTypes = (SequenceNodeIF<TypeNodeIF>) child;
		case 1:
			this.outputType = (TypeNodeIF) child;
		default:
			throw new NoSuchElementException("Node " + id()
					+ " does not have a child with index " + i + ".");
		}
	}

	@Override
	public String toString() {
		return "Function : (" + inputTypes.toString() + ") -> "
				+ outputType.toString();
	}

	@Override
	public void print(String prefix, PrintWriter out) {
		out.println(prefix + " AST Node " + id() + ", Function Type");
		inputTypes.print(prefix + "|", out);
		outputType.print(prefix + "|", out);
	}

	@Override
	public SequenceNodeIF<TypeNodeIF> inputTypes() {
		return inputTypes;
	}

	@Override
	public TypeNodeIF outputType() {
		return outputType;
	}

	@Override
	public void setInputTypes(SequenceNodeIF<TypeNodeIF> inputTypes) {
		this.inputTypes = inputTypes;
	}

	@Override
	public void setOutputType(TypeNodeIF outputType) {
		this.outputType = outputType;
	}

}