]> gerrit.simantics Code Review - simantics/platform.git/blob - bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/elaboration/chr/planning/items/CheckPrePlanItem.java
Fixed multiple issues causing dangling references to discarded queries
[simantics/platform.git] / bundles / org.simantics.scl.compiler / src / org / simantics / scl / compiler / elaboration / chr / planning / items / CheckPrePlanItem.java
1 package org.simantics.scl.compiler.elaboration.chr.planning.items;
2
3 import org.simantics.scl.compiler.elaboration.chr.plan.CheckOp;
4 import org.simantics.scl.compiler.elaboration.chr.planning.PrePlanItem;
5 import org.simantics.scl.compiler.elaboration.chr.planning.QueryPlanningContext;
6 import org.simantics.scl.compiler.elaboration.expressions.Expression;
7
8 import gnu.trove.set.hash.TIntHashSet;
9
10 public class CheckPrePlanItem extends PrePlanItem {
11     public Expression condition;
12     public TIntHashSet variableSet;
13
14     public CheckPrePlanItem(Expression condition, TIntHashSet variableSet, int secondaryPriority) {
15         super(secondaryPriority);
16         this.variableSet = variableSet;
17         this.condition = condition;
18         if(variableSet.isEmpty())
19             primaryPriority = 0.0;
20     }
21
22     @Override
23     public void initializeListeners(QueryPlanningContext context) {
24         context.listen(variableSet, this);
25     }
26
27     @Override
28     public void variableSolved(QueryPlanningContext context, int variableId) {
29         variableSet.remove(variableId);
30         if(variableSet.isEmpty()) {
31             primaryPriority = 0.0;
32             context.priorityQueue.adjust(this);
33         }
34     }
35     
36     @Override
37     public void generate(QueryPlanningContext context) {
38         context.addPlanOp(new CheckOp(location, condition));
39         context.bind(variableSet);
40     }
41 }