1 package org.simantics.scl.compiler.internal.parsing.types;
\r
3 import org.simantics.scl.compiler.elaboration.contexts.TypeTranslationContext;
\r
4 import org.simantics.scl.compiler.internal.types.TypeElaborationContext;
\r
5 import org.simantics.scl.compiler.types.TVar;
\r
6 import org.simantics.scl.compiler.types.Type;
\r
7 import org.simantics.scl.compiler.types.Types;
\r
8 import org.simantics.scl.compiler.types.kinds.Kind;
\r
9 import org.simantics.scl.compiler.types.kinds.Kinds;
\r
11 import gnu.trove.map.hash.TObjectIntHashMap;
\r
12 import gnu.trove.set.hash.TIntHashSet;
\r
16 public class TForAllAst extends TypeAst {
\r
17 public final String[] vars;
\r
18 public final TypeAst type;
\r
20 public TForAllAst(String[] vars, TypeAst type) {
\r
26 public void toString(StringBuilder b) {
\r
28 for(String var : vars) {
\r
37 public Type toType(TypeTranslationContext context, Kind expectedKind) {
\r
38 context.unify(location, Kinds.STAR, expectedKind);
\r
39 TVar[] oldVars = new TVar[vars.length];
\r
40 for(int i=0;i<vars.length;++i)
\r
41 oldVars[i] = context.pushTypeVar(vars[i]);
\r
42 Type result = type.toType(context, Kinds.STAR);
\r
43 for(int i=vars.length-1;i>=0;--i)
\r
44 result = Types.forAll(context.popTypeVar(vars[i], oldVars[i]), result);
\r
49 public Type toType(TypeElaborationContext context) {
\r
50 TVar[] oldVars = new TVar[vars.length];
\r
51 for(int i=0;i<vars.length;++i)
\r
52 oldVars[i] = context.push(vars[i]);
\r
53 Type result = type.toType(context);
\r
54 for(int i=vars.length-1;i>=0;--i)
\r
55 result = Types.forAll(context.pop(vars[i], oldVars[i]), result);
\r
60 public int getPrecedence() {
\r
65 public void collectReferences(TObjectIntHashMap<String> typeNameMap,
\r
67 type.collectReferences(typeNameMap, set);
\r