FunctionType.java
package edu.udel.cis.vsl.tass.model.impl.type;
import java.util.Arrays;
import java.util.Set;
import edu.udel.cis.vsl.tass.model.IF.type.FunctionTypeIF;
import edu.udel.cis.vsl.tass.model.IF.type.TypeIF;
public class FunctionType extends Type implements FunctionTypeIF {
private TypeIF[] inputTypes;
private TypeIF outputType;
public FunctionType(TypeIF[] inputTypes, TypeIF outputType) {
super(TypeKind.FUNCTION);
this.inputTypes = inputTypes;
this.outputType = outputType;
}
@Override
public String longName(Set<Type> stack) {
return shortName();
}
public TypeIF[] inputTypes() {
return inputTypes;
}
public TypeIF outputType() {
return outputType;
}
public boolean isNumeric() {
/* Does it seem reasonable to return true if the return type is numeric? */
return outputType.isNumeric();
}
public boolean isSubtypeOf(TypeIF type) {
return false;
}
public String shortName() {
String result = "Fun[";
int numArgs = inputTypes.length;
for (int i = 0; i < numArgs; i++) {
result += inputTypes[i].shortName();
if (i < numArgs - 1)
result += ",";
}
result += "->" + outputType.shortName() + "]";
return result;
}
public boolean equals(Object object) {
if (object == this)
return true;
if (object instanceof FunctionType) {
FunctionType that = (FunctionType) object;
return outputType.equals(that.outputType)
&& Arrays.equals(inputTypes, that.inputTypes);
}
return false;
}
public int hashCode() {
int result = 32768 * outputType.hashCode();
for (TypeIF type : inputTypes)
result += type.hashCode();
return result;
}
}