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;
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;
}
/**
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()));
}
}
public Kind getKind(TCon con) {
- return environment.getTypeConstructor(con).kind;
+ return environment.getTypeDescriptor(con).getKind();
}
/**
errorLog.log(loc, "Expected a type with kind " + expectedKind + " but got " + provided + ".");
}
}
+
+ public CompilationContext getCompilationContext() {
+ return compilationContext;
+ }
}