}
return env.abstractDataType(Names.typeName(name), computeTypeParameters(decl, env));
}
private Type[] computeTypeParameters(UserType decl, Environment env) {
TypeFactory tf = TypeFactory.getInstance();
Type[] params;
if (decl.isParametric()) {
java.util.List<org.rascalmpl.ast.Type> formals = decl
.getParameters();
params = new Type[formals.size()];
int i = 0;
for (org.rascalmpl.ast.Type formal : formals) {
if (!formal.isVariable()) {
throw new SyntaxError(
"Declaration of parameterized type with type instance "
+ formal + " is not allowed", formal.getLocation());
}
TypeVar var = formal.getTypeVar();
Type bound = var.hasBound() ? var.getBound().typeOf(env, true, eval) : tf
.valueType();
params[i++] = tf
.parameterType(Names.name(var.getName()), bound);
}
} else {
params = new Type[0];
}