--- /dev/null
+package org.simantics.scl.compiler.internal.parsing.types;\r
+\r
+import org.simantics.scl.compiler.elaboration.contexts.TypeTranslationContext;\r
+import org.simantics.scl.compiler.internal.types.TypeElaborationContext;\r
+import org.simantics.scl.compiler.types.TVar;\r
+import org.simantics.scl.compiler.types.Type;\r
+import org.simantics.scl.compiler.types.Types;\r
+import org.simantics.scl.compiler.types.kinds.Kind;\r
+import org.simantics.scl.compiler.types.kinds.Kinds;\r
+\r
+import gnu.trove.map.hash.TObjectIntHashMap;\r
+import gnu.trove.set.hash.TIntHashSet;\r
+\r
+\r
+\r
+public class TForAllAst extends TypeAst {\r
+ public final String[] vars;\r
+ public final TypeAst type;\r
+ \r
+ public TForAllAst(String[] vars, TypeAst type) {\r
+ this.vars = vars;\r
+ this.type = type;\r
+ }\r
+ \r
+ @Override\r
+ public void toString(StringBuilder b) {\r
+ b.append("forall");\r
+ for(String var : vars) {\r
+ b.append(' ');\r
+ b.append(var);\r
+ }\r
+ b.append(". ");\r
+ type.toString(b);\r
+ }\r
+\r
+ @Override\r
+ public Type toType(TypeTranslationContext context, Kind expectedKind) {\r
+ context.unify(location, Kinds.STAR, expectedKind);\r
+ TVar[] oldVars = new TVar[vars.length];\r
+ for(int i=0;i<vars.length;++i)\r
+ oldVars[i] = context.pushTypeVar(vars[i]);\r
+ Type result = type.toType(context, Kinds.STAR);\r
+ for(int i=vars.length-1;i>=0;--i)\r
+ result = Types.forAll(context.popTypeVar(vars[i], oldVars[i]), result);\r
+ return result;\r
+ }\r
+ \r
+ @Override\r
+ public Type toType(TypeElaborationContext context) {\r
+ TVar[] oldVars = new TVar[vars.length];\r
+ for(int i=0;i<vars.length;++i)\r
+ oldVars[i] = context.push(vars[i]);\r
+ Type result = type.toType(context);\r
+ for(int i=vars.length-1;i>=0;--i)\r
+ result = Types.forAll(context.pop(vars[i], oldVars[i]), result);\r
+ return result;\r
+ }\r
+ \r
+ @Override\r
+ public int getPrecedence() {\r
+ return 2;\r
+ }\r
+\r
+ @Override\r
+ public void collectReferences(TObjectIntHashMap<String> typeNameMap,\r
+ TIntHashSet set) {\r
+ type.collectReferences(typeNameMap, set);\r
+ }\r
+}\r