X-Git-Url: https://gerrit.simantics.org/r/gitweb?p=simantics%2Fplatform.git;a=blobdiff_plain;f=bundles%2Forg.simantics.scl.compiler%2Fsrc%2Forg%2Fsimantics%2Fscl%2Fcompiler%2Felaboration%2Fexpressions%2FECHRSelect.java;h=db651684f0ee124252abc9adb73721ce05d094be;hp=47c007d7f7446fc45a04467feb67c56beec3fa5d;hb=4ebc60b24db646dc2c64dd54190b029b8e28d030;hpb=292e64ba21f8044df19884dc3e61fe5e292a82df diff --git a/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/elaboration/expressions/ECHRSelect.java b/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/elaboration/expressions/ECHRSelect.java index 47c007d7f..db651684f 100644 --- a/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/elaboration/expressions/ECHRSelect.java +++ b/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/elaboration/expressions/ECHRSelect.java @@ -2,6 +2,7 @@ package org.simantics.scl.compiler.elaboration.expressions; import java.util.ArrayList; +import org.simantics.scl.compiler.common.exceptions.InternalCompilerError; import org.simantics.scl.compiler.common.names.Names; import org.simantics.scl.compiler.compilation.CompilationContext; import org.simantics.scl.compiler.constants.NoRepConstant; @@ -11,26 +12,21 @@ import org.simantics.scl.compiler.elaboration.chr.plan.PlanContext; import org.simantics.scl.compiler.elaboration.chr.plan.PlanOp; import org.simantics.scl.compiler.elaboration.chr.plan.PlanRealizer; import org.simantics.scl.compiler.elaboration.chr.planning.QueryPlanningContext; +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.contexts.TypingContext; import org.simantics.scl.compiler.errors.Locations; 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.utils.ExpressionDecorator; -import org.simantics.scl.compiler.types.Type; import org.simantics.scl.compiler.types.Types; import org.simantics.scl.compiler.types.exceptions.MatchException; import org.simantics.scl.compiler.types.kinds.Kinds; -import gnu.trove.map.hash.TObjectIntHashMap; -import gnu.trove.set.hash.THashSet; -import gnu.trove.set.hash.TIntHashSet; - public class ECHRSelect extends Expression { - CHRQuery query; - Variable[] existentialVariables; - Expression expression; + public CHRQuery query; + public Variable[] existentialVariables; + public Expression expression; private ArrayList planOps; private CHRRuleset currentRuleset; @@ -39,24 +35,6 @@ public class ECHRSelect extends Expression { this.query = query; } - @Override - public void collectRefs(TObjectIntHashMap allRefs, TIntHashSet refs) { - query.collectRefs(allRefs, refs); - expression.collectRefs(allRefs, refs); - } - - @Override - public void collectVars(TObjectIntHashMap allVars, TIntHashSet vars) { - query.collectVars(allVars, vars); - expression.collectVars(allVars, vars); - } - - @Override - public void forVariables(VariableProcedure procedure) { - query.forVariables(procedure); - expression.forVariables(procedure); - } - @Override protected void updateType() throws MatchException { setType(Types.list(expression.getType())); @@ -75,17 +53,16 @@ public class ECHRSelect extends Expression { public Expression simplify(SimplificationContext simplificationContext) { this.expression = expression.simplify(simplificationContext); query.simplify(simplificationContext); - - CompilationContext compilationContext = simplificationContext.getCompilationContext(); - QueryPlanningContext context = new QueryPlanningContext(compilationContext, existentialVariables); - if(query.createQueryPlan(context, null, -1, null)) - planOps = context.getPlanOps(); return this; } @Override public IVal toVal(CompilationContext context, CodeWriter w) { + QueryPlanningContext queryContext = new QueryPlanningContext(context, existentialVariables); + if(query.createQueryPlan(queryContext, null, -1, null)) + planOps = queryContext.getPlanOps(); + IVal list = w.apply(location, context.getValue(Names.MList_create).getValue(), NoRepConstant.UNIT); planOps.add(new PlanOp(location) { @Override @@ -98,15 +75,6 @@ public class ECHRSelect extends Expression { return w.apply(location, context.getValue(Names.MList_freeze).getValue(), list); } - @Override - public void collectFreeVariables(THashSet vars) { - query.collectFreeVariables(vars); - expression.collectFreeVariables(vars); - if(existentialVariables != null) - for(Variable variable : existentialVariables) - vars.remove(variable); - } - @Override public Expression resolve(TranslationContext context) { currentRuleset = context.currentRuleset; @@ -127,19 +95,6 @@ public class ECHRSelect extends Expression { } } - @Override - public Expression decorate(ExpressionDecorator decorator) { - this.expression = decorator.decorate(expression); - return this; - } - - @Override - public void collectEffects(THashSet effects) { - expression.collectEffects(effects); - query.collectQueryEffects(effects); - effects.add(Types.PROC); - } - @Override public void accept(ExpressionVisitor visitor) { visitor.visit(this); @@ -149,4 +104,25 @@ public class ECHRSelect extends Expression { public Expression accept(ExpressionTransformer transformer) { return transformer.transform(this); } + + @Override + public Expression replace(ReplaceContext context) { + Variable[] newExistentialVariables = new Variable[existentialVariables.length]; + for(int i=0;i(planOps.size()); + throw new InternalCompilerError(location, "Copying of ECHRSelect is not supported."); + //for(PlanOp op : planOps) + // copy.planOps.add(op.replace(context)); + } + return copy; + } }