X-Git-Url: https://gerrit.simantics.org/r/gitweb?a=blobdiff_plain;f=bundles%2Forg.simantics.scl.compiler%2Fsrc%2Forg%2Fsimantics%2Fscl%2Fcompiler%2Felaboration%2Fchr%2Fplanning%2Fitems%2FMemberPrePlanItem.java;h=aa4a339983ebc60864781f9930d603959701f046;hb=refs%2Fchanges%2F38%2F238%2F2;hp=d2b88dcb895f30198e2892cdd3db9d6a759221a4;hpb=cb5fc8d606d8b322563e9345c441eecfa7f01753;p=simantics%2Fplatform.git diff --git a/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/elaboration/chr/planning/items/MemberPrePlanItem.java b/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/elaboration/chr/planning/items/MemberPrePlanItem.java index d2b88dcb8..aa4a33998 100644 --- a/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/elaboration/chr/planning/items/MemberPrePlanItem.java +++ b/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/elaboration/chr/planning/items/MemberPrePlanItem.java @@ -1,66 +1,66 @@ -package org.simantics.scl.compiler.elaboration.chr.planning.items; - -import org.simantics.scl.compiler.common.exceptions.InternalCompilerError; -import org.simantics.scl.compiler.common.names.Names; -import org.simantics.scl.compiler.elaboration.chr.plan.CheckOp; -import org.simantics.scl.compiler.elaboration.chr.plan.IterateListOp; -import org.simantics.scl.compiler.elaboration.chr.planning.PrePlanItem; -import org.simantics.scl.compiler.elaboration.chr.planning.QueryPlanningContext; -import org.simantics.scl.compiler.elaboration.expressions.EApply; -import org.simantics.scl.compiler.elaboration.expressions.EConstant; -import org.simantics.scl.compiler.elaboration.expressions.EVariable; -import org.simantics.scl.compiler.elaboration.expressions.Expression; - -import gnu.trove.set.hash.TIntHashSet; - -public class MemberPrePlanItem extends PrePlanItem { - public Expression expression1, expression2; - public TIntHashSet variableSet1, variableSet2; - - public MemberPrePlanItem(Expression expression1, Expression expression2, TIntHashSet variableSet1, TIntHashSet variableSet2, int secondaryPriority) { - super(secondaryPriority); - this.expression1 = expression1; - this.expression2 = expression2; - this.variableSet1 = variableSet1; - this.variableSet2 = variableSet2; - updatePrimaryPriority(); - } - - private void updatePrimaryPriority() { - if(variableSet2.isEmpty()) { - if(variableSet1.isEmpty()) - primaryPriority = 0; - else - primaryPriority = 2.0; - } - } - - @Override - public void initializeListeners(QueryPlanningContext context) { - context.listen(variableSet1, this); - context.listen(variableSet2, this); - } - - @Override - public void variableSolved(QueryPlanningContext context, int variableId) { - variableSet1.remove(variableId); - variableSet2.remove(variableId); - updatePrimaryPriority(); - context.priorityQueue.adjust(this); - } - - @Override - public void generate(QueryPlanningContext context) { - if(!variableSet2.isEmpty()) - throw new InternalCompilerError("Unsolvable query."); - if(variableSet1.isEmpty()) - context.addPlanOp(new CheckOp(location, - new EApply(location, - new EConstant(context.getCompilationContext().getValue(Names.Prelude_elem)), - expression1, - expression2))); - else - context.addPlanOp(new IterateListOp(location, ((EVariable)expression1).getVariable(), expression2)); - context.bind(variableSet1); - } -} +package org.simantics.scl.compiler.elaboration.chr.planning.items; + +import org.simantics.scl.compiler.common.exceptions.InternalCompilerError; +import org.simantics.scl.compiler.common.names.Names; +import org.simantics.scl.compiler.elaboration.chr.plan.CheckOp; +import org.simantics.scl.compiler.elaboration.chr.plan.IterateListOp; +import org.simantics.scl.compiler.elaboration.chr.planning.PrePlanItem; +import org.simantics.scl.compiler.elaboration.chr.planning.QueryPlanningContext; +import org.simantics.scl.compiler.elaboration.expressions.EApply; +import org.simantics.scl.compiler.elaboration.expressions.EConstant; +import org.simantics.scl.compiler.elaboration.expressions.EVariable; +import org.simantics.scl.compiler.elaboration.expressions.Expression; + +import gnu.trove.set.hash.TIntHashSet; + +public class MemberPrePlanItem extends PrePlanItem { + public Expression expression1, expression2; + public TIntHashSet variableSet1, variableSet2; + + public MemberPrePlanItem(Expression expression1, Expression expression2, TIntHashSet variableSet1, TIntHashSet variableSet2, int secondaryPriority) { + super(secondaryPriority); + this.expression1 = expression1; + this.expression2 = expression2; + this.variableSet1 = variableSet1; + this.variableSet2 = variableSet2; + updatePrimaryPriority(); + } + + private void updatePrimaryPriority() { + if(variableSet2.isEmpty()) { + if(variableSet1.isEmpty()) + primaryPriority = 0; + else + primaryPriority = 2.0; + } + } + + @Override + public void initializeListeners(QueryPlanningContext context) { + context.listen(variableSet1, this); + context.listen(variableSet2, this); + } + + @Override + public void variableSolved(QueryPlanningContext context, int variableId) { + variableSet1.remove(variableId); + variableSet2.remove(variableId); + updatePrimaryPriority(); + context.priorityQueue.adjust(this); + } + + @Override + public void generate(QueryPlanningContext context) { + if(!variableSet2.isEmpty()) + throw new InternalCompilerError("Unsolvable query."); + if(variableSet1.isEmpty()) + context.addPlanOp(new CheckOp(location, + new EApply(location, + new EConstant(context.getCompilationContext().getValue(Names.Prelude_elem)), + expression1, + expression2))); + else + context.addPlanOp(new IterateListOp(location, ((EVariable)expression1).getVariable(), expression2)); + context.bind(variableSet1); + } +}