import org.simantics.scl.compiler.common.exceptions.InternalCompilerError;
import org.simantics.scl.compiler.common.precedence.Precedence;
+import org.simantics.scl.compiler.compilation.CompilationContext;
import org.simantics.scl.compiler.constants.NoRepConstant;
-import org.simantics.scl.compiler.elaboration.contexts.EnvironmentalContext;
import org.simantics.scl.compiler.elaboration.contexts.ReplaceContext;
import org.simantics.scl.compiler.elaboration.contexts.SimplificationContext;
import org.simantics.scl.compiler.elaboration.contexts.TranslationContext;
import org.simantics.scl.compiler.elaboration.expressions.printing.ExpressionToStringVisitor;
import org.simantics.scl.compiler.elaboration.query.QAtom;
import org.simantics.scl.compiler.elaboration.relations.SCLRelation;
-import org.simantics.scl.compiler.environment.Environment;
import org.simantics.scl.compiler.internal.codegen.references.IVal;
import org.simantics.scl.compiler.internal.codegen.writer.CodeWriter;
import org.simantics.scl.compiler.internal.elaboration.decomposed.DecomposedExpression;
return context.subsume(inferType(context), requiredType);
}
- protected Expression applyPUnit(EnvironmentalContext context) {
+ protected Expression applyPUnit(TypingContext context) {
Type type = Types.canonical(getType());
if(type instanceof TFun) {
TFun fun = (TFun)type;
if(fun.getCanonicalDomain() == Types.PUNIT) {
EApply result = new EApply(location, this, new ELiteral(NoRepConstant.PUNIT));
result.effect = fun.getCanonicalEffect();
+ context.declareEffect(this.location, result.effect);
return result;
}
}
throw new TypeValidationException(loc);
}
- public abstract IVal toVal(Environment env, CodeWriter w);
+ public abstract IVal toVal(CompilationContext context, CodeWriter w);
public Expression closure(TVar ... vars) {
if(vars.length == 0)
throw new NotPatternException(this);
}
- public IVal lambdaToVal(Environment env, CodeWriter w) {
- DecomposedExpression decomposed = DecomposedExpression.decompose(this);
+ public IVal lambdaToVal(CompilationContext context, CodeWriter w) {
+ DecomposedExpression decomposed = DecomposedExpression.decompose(context.errorLog, this);
CodeWriter newW = w.createFunction(decomposed.typeParameters, decomposed.effect, decomposed.returnType, decomposed.parameterTypes);
IVal[] parameters = newW.getParameters();
IVal functionVal = newW.getFunction().getTarget();
for(int i=0;i<parameters.length;++i)
decomposed.parameters[i].setVal(parameters[i]);
- newW.return_(decomposed.body.toVal(env, newW));
+ newW.return_(decomposed.body.toVal(context, newW));
return functionVal;
}