import org.simantics.scl.compiler.elaboration.contexts.TypeTranslationContext;
import org.simantics.scl.compiler.elaboration.modules.TypeAlias;
+import org.simantics.scl.compiler.elaboration.modules.TypeDescriptor;
import org.simantics.scl.compiler.environment.AmbiguousNameException;
import org.simantics.scl.compiler.environment.Environments;
import org.simantics.scl.compiler.internal.types.TypeElaborationContext;
public Type toType(TypeTranslationContext context, Kind expectedKind) {
if(function instanceof TVarAst) {
String name = ((TVarAst)function).name;
- TypeAlias alias;
+ TypeAlias alias = null;
try {
- alias = Environments.getTypeAlias(context.getEnvironment(), name);
+ TypeDescriptor tdesc = Environments.getTypeDescriptor(context.getEnvironment(), name);
+ if(tdesc instanceof TypeAlias)
+ alias = (TypeAlias)tdesc;
} catch (AmbiguousNameException e) {
context.getErrorLog().log(location, e.getMessage());
return Types.metaVar(Kinds.STAR);
}
if(alias != null) {
- if(parameters.length != alias.getArity()) {
+ int arity = alias.getArity();
+ if(parameters.length < arity) {
context.getErrorLog().log(location, "Wrong number of parameters are given to the type alias. Expected " +
- alias.getArity() + " parameters, got " + parameters.length + " parameters.");
+ arity + " parameters, got " + parameters.length + " parameters.");
return Types.metaVar(Kinds.metaVar());
}
- Type[] parameterTypes = new Type[parameters.length];
- for(int i=0;i<parameters.length;++i)
+ Type[] parameterTypes = new Type[arity];
+ for(int i=0;i<arity;++i)
parameterTypes[i] = parameters[i].toType(context, Kinds.metaVar());
- return alias.body.replace(alias.parameters, parameterTypes);
+ Type result = alias.body.replace(alias.parameters, parameterTypes);
+ for(int i=arity;i<parameters.length;++i)
+ result = Types.apply(result, parameters[i].toType(context, Kinds.metaVar()));
+ return result;
}
}