]> 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 b9dbb4be823b1e3d7c1bb769073c91f7bbe654c3..d107cb621a2dc9ff5ccceb18b4909643832151cd 100644 (file)
@@ -1,10 +1,12 @@
 package org.simantics.scl.compiler.elaboration.contexts;
 
+import org.simantics.scl.compiler.compilation.CompilationContext;
 import org.simantics.scl.compiler.environment.Environment;
 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;
@@ -17,15 +19,19 @@ import gnu.trove.map.hash.THashMap;
 
 public class TypeTranslationContext {
     
+    CompilationContext compilationContext;
+    
     Environment environment;
    
     ErrorLog errorLog;    
     
     THashMap<String, TVar> typeVariables = new THashMap<String, TVar>();
+    THashMap<String, TMetaVar> existentials;
     
-    public TypeTranslationContext(ErrorLog errorLog, Environment environment) {
-        this.errorLog = errorLog;
-        this.environment = environment;
+    public TypeTranslationContext(CompilationContext compilationContext) {
+        this.compilationContext = compilationContext;
+        this.errorLog = compilationContext.errorLog;
+        this.environment = compilationContext.environment;
     }
     
     /**
@@ -76,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()));
     }
@@ -106,7 +125,7 @@ public class TypeTranslationContext {
     }
 
     public Kind getKind(TCon con) {
-        return environment.getTypeConstructor(con).kind;
+        return environment.getTypeDescriptor(con).getKind();
     }
 
     /**
@@ -122,4 +141,8 @@ public class TypeTranslationContext {
             errorLog.log(loc, "Expected a type with kind " + expectedKind + " but got " + provided + ".");
         }
     }
+    
+    public CompilationContext getCompilationContext() {
+        return compilationContext;
+    }
 }