]> gerrit.simantics Code Review - simantics/platform.git/blobdiff - bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/elaboration/contexts/TypeTranslationContext.java
(refs #7588) Support for existential type variables with syntax ?v
[simantics/platform.git] / bundles / org.simantics.scl.compiler / src / org / simantics / scl / compiler / elaboration / contexts / TypeTranslationContext.java
index 1eea959fd249459273a9139008b86d29ac9a2d0c..d107cb621a2dc9ff5ccceb18b4909643832151cd 100644 (file)
@@ -6,6 +6,7 @@ import org.simantics.scl.compiler.errors.ErrorLog;
 import org.simantics.scl.compiler.internal.parsing.exceptions.SCLSyntaxErrorException;
 import org.simantics.scl.compiler.internal.parsing.types.TypeAst;
 import org.simantics.scl.compiler.types.TCon;
+import org.simantics.scl.compiler.types.TMetaVar;
 import org.simantics.scl.compiler.types.TPred;
 import org.simantics.scl.compiler.types.TVar;
 import org.simantics.scl.compiler.types.Type;
@@ -25,6 +26,7 @@ public class TypeTranslationContext {
     ErrorLog errorLog;    
     
     THashMap<String, TVar> typeVariables = new THashMap<String, TVar>();
+    THashMap<String, TMetaVar> existentials;
     
     public TypeTranslationContext(CompilationContext compilationContext) {
         this.compilationContext = compilationContext;
@@ -80,6 +82,19 @@ public class TypeTranslationContext {
         return var;
     }
 
+    public TMetaVar resolveExistential(long loc, String name, Kind expectedKind) {
+        if(existentials == null)
+            existentials = new THashMap<String, TMetaVar>();
+        TMetaVar var = existentials.get(name);
+        if(var == null) {
+            var = Types.metaVar(expectedKind);
+            existentials.put(name, var);
+        }        
+        else
+            unify(loc, var.getKind(), expectedKind);
+        return var;
+    }
+    
     public TVar pushTypeVar(String name) {
         return typeVariables.put(name, Types.var(Kinds.metaVar()));
     }