]> gerrit.simantics Code Review - simantics/platform.git/blob - bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/elaboration/chr/planning/items/EqualsPrePlanItem.java
Merge "List the unsatisfied dependencies in CanvasContext"
[simantics/platform.git] / bundles / org.simantics.scl.compiler / src / org / simantics / scl / compiler / elaboration / chr / planning / items / EqualsPrePlanItem.java
1 package org.simantics.scl.compiler.elaboration.chr.planning.items;\r
2 \r
3 import org.simantics.scl.compiler.common.exceptions.InternalCompilerError;\r
4 import org.simantics.scl.compiler.elaboration.chr.plan.AssignOp;\r
5 import org.simantics.scl.compiler.elaboration.chr.plan.CheckOp;\r
6 import org.simantics.scl.compiler.elaboration.chr.plan.MatchOp;\r
7 import org.simantics.scl.compiler.elaboration.chr.planning.PrePlanItem;\r
8 import org.simantics.scl.compiler.elaboration.chr.planning.QueryPlanningContext;\r
9 import org.simantics.scl.compiler.elaboration.expressions.EApply;\r
10 import org.simantics.scl.compiler.elaboration.expressions.EConstant;\r
11 import org.simantics.scl.compiler.elaboration.expressions.EVariable;\r
12 import org.simantics.scl.compiler.elaboration.expressions.Expression;\r
13 import org.simantics.scl.compiler.elaboration.expressions.Variable;\r
14 import org.simantics.scl.compiler.elaboration.java.Builtins;\r
15 \r
16 import gnu.trove.set.hash.TIntHashSet;\r
17 \r
18 public class EqualsPrePlanItem extends PrePlanItem {\r
19     public Expression expression1, expression2;\r
20     public TIntHashSet variableSet1, variableSet2;\r
21 \r
22     public EqualsPrePlanItem(Expression expression1, Expression expression2, TIntHashSet variableSet1, TIntHashSet variableSet2, int secondaryPriority) {\r
23         super(secondaryPriority);\r
24         this.expression1 = expression1;\r
25         this.expression2 = expression2;\r
26         this.variableSet1 = variableSet1;\r
27         this.variableSet2 = variableSet2;\r
28         updatePrimaryPriority();\r
29     }\r
30 \r
31     private void updatePrimaryPriority() {\r
32         if(variableSet2.isEmpty()) {\r
33             if(variableSet1.isEmpty())\r
34                 primaryPriority = 0;\r
35             else \r
36                 primaryPriority = 1;\r
37         }\r
38         else {\r
39             if(variableSet1.isEmpty() && expression2.isPattern(0))\r
40                 primaryPriority = 0.0;\r
41         }\r
42     }\r
43 \r
44     @Override\r
45     public void initializeListeners(QueryPlanningContext context) {\r
46         context.listen(variableSet1, this);\r
47         context.listen(variableSet2, this);\r
48     }\r
49 \r
50     @Override\r
51     public void variableSolved(QueryPlanningContext context, int variableId) {\r
52         variableSet1.remove(variableId);\r
53         variableSet2.remove(variableId);\r
54         updatePrimaryPriority();\r
55         context.priorityQueue.adjust(this);\r
56     }\r
57     \r
58     @Override\r
59     public void generate(QueryPlanningContext context) {\r
60         if(variableSet1.isEmpty() && variableSet2.isEmpty()) {\r
61             context.addPlanOp(new CheckOp(location, new EApply(location, new EConstant(Builtins.EQUALS, expression1.getType()), expression1, expression2)));\r
62         }\r
63         else if(variableSet2.isEmpty()) {\r
64             Variable variable = ((EVariable)expression1).getVariable();\r
65             context.addPlanOp(new AssignOp(location, variable, expression2));\r
66             context.bind(variableSet1);\r
67         }\r
68         else if(variableSet1.isEmpty()) {\r
69             if(expression2 instanceof EVariable) {\r
70                 Variable variable = ((EVariable)expression2).getVariable();\r
71                 context.addPlanOp(new AssignOp(location, variable, expression1));\r
72             }\r
73             else {\r
74                 context.addPlanOp(new MatchOp(location, expression1, expression2));\r
75             }\r
76             context.bind(variableSet2);\r
77         }\r
78         else\r
79             throw new InternalCompilerError("Unsolvable query.");\r
80     }\r
81 }\r