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;
}
}