]> gerrit.simantics Code Review - simantics/platform.git/blob - bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/internal/parsing/types/TForAllAst.java
Migrated source code from Simantics SVN
[simantics/platform.git] / bundles / org.simantics.scl.compiler / src / org / simantics / scl / compiler / internal / parsing / types / TForAllAst.java
1 package org.simantics.scl.compiler.internal.parsing.types;\r
2 \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
10 \r
11 import gnu.trove.map.hash.TObjectIntHashMap;\r
12 import gnu.trove.set.hash.TIntHashSet;\r
13 \r
14 \r
15 \r
16 public class TForAllAst extends TypeAst {\r
17     public final String[] vars;\r
18     public final TypeAst type;\r
19     \r
20     public TForAllAst(String[] vars, TypeAst type) {\r
21         this.vars = vars;\r
22         this.type = type;\r
23     }\r
24     \r
25     @Override\r
26     public void toString(StringBuilder b) {\r
27         b.append("forall");\r
28         for(String var : vars) {\r
29             b.append(' ');\r
30             b.append(var);\r
31         }\r
32         b.append(". ");\r
33         type.toString(b);\r
34     }\r
35 \r
36     @Override\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
45         return result;\r
46     }\r
47     \r
48     @Override\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
56         return result;\r
57     }\r
58     \r
59     @Override\r
60     public int getPrecedence() {\r
61         return 2;\r
62     }\r
63 \r
64     @Override\r
65     public void collectReferences(TObjectIntHashMap<String> typeNameMap,\r
66             TIntHashSet set) {\r
67         type.collectReferences(typeNameMap, set);\r
68     }\r
69 }\r