--- /dev/null
+package org.simantics.scl.compiler.internal.types;
+
+import gnu.trove.map.hash.THashMap;
+
+import org.simantics.scl.compiler.types.TVar;
+import org.simantics.scl.compiler.types.Type;
+import org.simantics.scl.compiler.types.Types;
+import org.simantics.scl.compiler.types.kinds.Kinds;
+import org.simantics.scl.compiler.types.util.ITypeEnvironment;
+
+public class TypeElaborationContext {
+
+ THashMap<String, TVar> vars;
+ ITypeEnvironment environment;
+
+ public TypeElaborationContext(
+ THashMap<String, TVar> vars,
+ ITypeEnvironment environment) {
+ this.vars = vars;
+ this.environment = environment;
+ }
+
+ public TypeElaborationContext(ITypeEnvironment environment) {
+ this(new THashMap<String, TVar>(), environment);
+ }
+
+ public TVar resolveTypeVariable(String varName) {
+ TVar var = vars.get(varName);
+ if(var == null) {
+ var = Types.var(Kinds.STAR /* FIXME */);
+ vars.put(varName, var);
+ }
+ return var;
+ }
+
+ public TVar push(String varName) {
+ return vars.put(varName, Types.var(Kinds.STAR /* FIXME */));
+ }
+
+ public TVar pop(String varName, TVar oldVar) {
+ if(oldVar == null)
+ return vars.remove(varName);
+ else
+ return vars.put(varName, oldVar);
+ }
+
+ public Type resolveTypeConstructor(String name) {
+ return environment.resolve(null, name);
+ }
+
+ public Type resolveTypeConstructor(String namespace, String name) {
+ return environment.resolve(namespace, name);
+ }
+
+}