import java.util.Collections;
import java.util.List;
+import org.simantics.scl.compiler.common.exceptions.InternalCompilerError;
import org.simantics.scl.compiler.errors.Locations;
import org.simantics.scl.compiler.internal.parsing.exceptions.SCLSyntaxErrorException;
import org.simantics.scl.compiler.internal.parsing.parser.SCLParserImpl;
effect,
type);
}
+
+ /**
+ * This function always success, but may return a multi function
+ * with arity smaller than given parameter
+ */
+ public static MultiFunction unifyFunction2(Type type, int arity) {
+ type = canonical(type);
+ Type[] parameterTypes = new Type[arity];
+ Type effect = Types.NO_EFFECTS;
+ int i;
+ for(i=0;i<arity;++i) {
+ if(type instanceof TFun) {
+ TFun fun = (TFun)type;
+ parameterTypes[i] = fun.getCanonicalDomain();
+ type = fun.getCanonicalRange();
+ effect = fun.getCanonicalEffect();
+ if(effect != Types.NO_EFFECTS) {
+ ++i;
+ break;
+ }
+ }
+ else if(type instanceof TMetaVar) {
+ Type domain = metaVar(Kinds.STAR);
+ parameterTypes[i] = domain;
+ Type range = metaVar(Kinds.STAR);
+ effect = metaVar(Kinds.EFFECT);
+ try {
+ ((TMetaVar) type).setRef(functionE(domain, effect, range));
+ } catch (UnificationException e) {
+ // Should never happen, if we have checked maximum arity before calling this function
+ throw new InternalCompilerError(e);
+ }
+ type = range;
+ ++i;
+ break;
+ }
+ else
+ break;
+ }
+
+ if(i < arity)
+ parameterTypes = Arrays.copyOf(parameterTypes, i);
+ return new MultiFunction(parameterTypes, effect, type);
+ }
+
public static MultiFunction unifyFunction(Type type, int arity) throws UnificationException {
Type[] parameterTypes = new Type[arity];
for(int i=0;i<arity;++i)
}
return arity;
}
+
+ public static int getMaxArity(Type type) {
+ type = Skeletons.canonicalSkeleton(type);
+ int arity = 0;
+ while(true) {
+ if(type instanceof TFun) {
+ ++arity;
+ type = Skeletons.canonicalSkeleton(((TFun) type).getCanonicalRange());
+ }
+ else if(type instanceof TMetaVar) {
+ return Integer.MAX_VALUE;
+ }
+ else
+ break;
+ }
+ return arity;
+ }
public static TMetaVar metaVar(Kind kind) {
return new TMetaVar(kind);