EnumerationTypeNode.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.IdentifierNodeIF;
import edu.udel.cis.vsl.tass.ast.IF.PairNodeIF;
import edu.udel.cis.vsl.tass.ast.IF.SequenceNodeIF;
import edu.udel.cis.vsl.tass.ast.IF.expression.LiteralNodeIF;
import edu.udel.cis.vsl.tass.ast.IF.type.EnumerationTypeNodeIF;
import edu.udel.cis.vsl.tass.ast.impl.ASTNode;

public class EnumerationTypeNode extends ASTNode implements
		EnumerationTypeNodeIF {

	private SequenceNodeIF<PairNodeIF<IdentifierNodeIF, LiteralNodeIF>> types;

	public EnumerationTypeNode(long id) {
		super(id);
	}
	
	public EnumerationTypeNode(long id,
			SequenceNodeIF<PairNodeIF<IdentifierNodeIF, LiteralNodeIF>> types) {
		super(id);
		this.types = types;
	}

	@Override
	public SequenceNodeIF<PairNodeIF<IdentifierNodeIF, LiteralNodeIF>> types() {
		return types;
	}

	@Override
	public void setTypes(
			SequenceNodeIF<PairNodeIF<IdentifierNodeIF, LiteralNodeIF>> types) {
		this.types = types;
	}

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

	@SuppressWarnings("unchecked")
	@Override
	public void setChild(int i, ASTNodeIF child) throws NoSuchElementException {
		switch (i) {
		case 0:
			// Java can't type check generics, so make sure the child has the
			// right type.
			for (int j = 0; j < child.numChildren(); j++) {
				PairNodeIF<IdentifierNodeIF, LiteralNodeIF> pair = 
					(PairNodeIF<IdentifierNodeIF,LiteralNodeIF>)
					((SequenceNodeIF<PairNodeIF<IdentifierNodeIF,LiteralNodeIF>>)
					 child).child(j);
				assert pair.left() instanceof IdentifierNodeIF;
				assert pair.right() instanceof LiteralNodeIF;
			}
			types = (SequenceNodeIF<PairNodeIF<IdentifierNodeIF, LiteralNodeIF>>) child;
			break;
		default:
			throw new NoSuchElementException("Node " + id()
					+ " does not have a child with index " + i + ".");
		}
	}

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

	@Override
	public String toString() {
		return "enum {" + types.toString() + "}";
	}

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