]> gerrit.simantics Code Review - simantics/platform.git/blob - bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/internal/types/TypeElaborationContext.java
(refs #7588) Support for existential type variables with syntax ?v
[simantics/platform.git] / bundles / org.simantics.scl.compiler / src / org / simantics / scl / compiler / internal / types / TypeElaborationContext.java
1 package org.simantics.scl.compiler.internal.types;
2
3 import org.simantics.scl.compiler.types.TMetaVar;
4 import org.simantics.scl.compiler.types.TVar;
5 import org.simantics.scl.compiler.types.Type;
6 import org.simantics.scl.compiler.types.Types;
7 import org.simantics.scl.compiler.types.kinds.Kinds;
8 import org.simantics.scl.compiler.types.util.ITypeEnvironment;
9
10 import gnu.trove.map.hash.THashMap;
11
12 public class TypeElaborationContext {
13
14     THashMap<String, TVar> vars;
15     THashMap<String, TMetaVar> existentials;
16     ITypeEnvironment environment;
17         
18     public TypeElaborationContext(
19             THashMap<String, TVar> vars,
20             ITypeEnvironment environment) {
21         this.vars = vars;
22         this.environment = environment;
23     }
24     
25     public TypeElaborationContext(ITypeEnvironment environment) {
26         this(new THashMap<String, TVar>(), environment);
27     }
28
29     public TMetaVar resolveExistential(String varName) {
30         if(existentials == null)
31             existentials = new THashMap<String, TMetaVar>();
32         TMetaVar var = existentials.get(varName);
33         if(var == null) {
34             var = Types.metaVar(Kinds.metaVar());
35             existentials.put(varName, var);
36         }
37         return var;
38     }
39
40     public TVar resolveTypeVariable(String varName) {
41         TVar var = vars.get(varName);
42         if(var == null) {
43             var = Types.var(Kinds.metaVar());
44             vars.put(varName, var);
45         }
46         return var;
47     }
48     
49     public TVar push(String varName) {
50         return vars.put(varName, Types.var(Kinds.metaVar())); 
51     }
52
53     public TVar pop(String varName, TVar oldVar) {
54         if(oldVar == null)
55             return vars.remove(varName);
56         else
57             return vars.put(varName, oldVar);
58     }
59     
60     public Type resolveTypeConstructor(String name) {
61         return environment.resolve(null, name);
62     }
63
64     public Type resolveTypeConstructor(String namespace, String name) {
65         return environment.resolve(namespace, name);
66     }
67
68 }