X-Git-Url: https://gerrit.simantics.org/r/gitweb?a=blobdiff_plain;f=bundles%2Forg.simantics.scl.compiler%2Fsrc%2Forg%2Fsimantics%2Fscl%2Fcompiler%2Felaboration%2Fcontexts%2FTypeTranslationContext.java;h=d107cb621a2dc9ff5ccceb18b4909643832151cd;hb=refs%2Fchanges%2F71%2F1171%2F1;hp=29b9028e6d721e6a21d1f5e5d9d998c41762e35b;hpb=969bd23cab98a79ca9101af33334000879fb60c5;p=simantics%2Fplatform.git diff --git a/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/elaboration/contexts/TypeTranslationContext.java b/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/elaboration/contexts/TypeTranslationContext.java index 29b9028e6..d107cb621 100644 --- a/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/elaboration/contexts/TypeTranslationContext.java +++ b/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/elaboration/contexts/TypeTranslationContext.java @@ -1,12 +1,12 @@ package org.simantics.scl.compiler.elaboration.contexts; -import gnu.trove.map.hash.THashMap; - +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; @@ -15,17 +15,23 @@ import org.simantics.scl.compiler.types.exceptions.KindUnificationException; import org.simantics.scl.compiler.types.kinds.Kind; import org.simantics.scl.compiler.types.kinds.Kinds; +import gnu.trove.map.hash.THashMap; + public class TypeTranslationContext { + CompilationContext compilationContext; + Environment environment; ErrorLog errorLog; THashMap typeVariables = new THashMap(); + THashMap 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(); + 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; + } }