-package org.simantics.scl.compiler.elaboration.chr.planning.items;\r
-\r
-import org.simantics.scl.compiler.common.exceptions.InternalCompilerError;\r
-import org.simantics.scl.compiler.elaboration.chr.plan.AssignOp;\r
-import org.simantics.scl.compiler.elaboration.chr.plan.CheckOp;\r
-import org.simantics.scl.compiler.elaboration.chr.plan.MatchOp;\r
-import org.simantics.scl.compiler.elaboration.chr.planning.PrePlanItem;\r
-import org.simantics.scl.compiler.elaboration.chr.planning.QueryPlanningContext;\r
-import org.simantics.scl.compiler.elaboration.expressions.EApply;\r
-import org.simantics.scl.compiler.elaboration.expressions.EConstant;\r
-import org.simantics.scl.compiler.elaboration.expressions.EVariable;\r
-import org.simantics.scl.compiler.elaboration.expressions.Expression;\r
-import org.simantics.scl.compiler.elaboration.expressions.Variable;\r
-import org.simantics.scl.compiler.elaboration.java.Builtins;\r
-\r
-import gnu.trove.set.hash.TIntHashSet;\r
-\r
-public class EqualsPrePlanItem extends PrePlanItem {\r
- public Expression expression1, expression2;\r
- public TIntHashSet variableSet1, variableSet2;\r
-\r
- public EqualsPrePlanItem(Expression expression1, Expression expression2, TIntHashSet variableSet1, TIntHashSet variableSet2, int secondaryPriority) {\r
- super(secondaryPriority);\r
- this.expression1 = expression1;\r
- this.expression2 = expression2;\r
- this.variableSet1 = variableSet1;\r
- this.variableSet2 = variableSet2;\r
- updatePrimaryPriority();\r
- }\r
-\r
- private void updatePrimaryPriority() {\r
- if(variableSet2.isEmpty()) {\r
- if(variableSet1.isEmpty())\r
- primaryPriority = 0;\r
- else \r
- primaryPriority = 1;\r
- }\r
- else {\r
- if(variableSet1.isEmpty() && expression2.isPattern(0))\r
- primaryPriority = 0.0;\r
- }\r
- }\r
-\r
- @Override\r
- public void initializeListeners(QueryPlanningContext context) {\r
- context.listen(variableSet1, this);\r
- context.listen(variableSet2, this);\r
- }\r
-\r
- @Override\r
- public void variableSolved(QueryPlanningContext context, int variableId) {\r
- variableSet1.remove(variableId);\r
- variableSet2.remove(variableId);\r
- updatePrimaryPriority();\r
- context.priorityQueue.adjust(this);\r
- }\r
- \r
- @Override\r
- public void generate(QueryPlanningContext context) {\r
- if(variableSet1.isEmpty() && variableSet2.isEmpty()) {\r
- context.addPlanOp(new CheckOp(location, new EApply(location, new EConstant(Builtins.EQUALS, expression1.getType()), expression1, expression2)));\r
- }\r
- else if(variableSet2.isEmpty()) {\r
- Variable variable = ((EVariable)expression1).getVariable();\r
- context.addPlanOp(new AssignOp(location, variable, expression2));\r
- context.bind(variableSet1);\r
- }\r
- else if(variableSet1.isEmpty()) {\r
- if(expression2 instanceof EVariable) {\r
- Variable variable = ((EVariable)expression2).getVariable();\r
- context.addPlanOp(new AssignOp(location, variable, expression1));\r
- }\r
- else {\r
- context.addPlanOp(new MatchOp(location, expression1, expression2));\r
- }\r
- context.bind(variableSet2);\r
- }\r
- else\r
- throw new InternalCompilerError("Unsolvable query.");\r
- }\r
-}\r
+package org.simantics.scl.compiler.elaboration.chr.planning.items;
+
+import org.simantics.scl.compiler.common.exceptions.InternalCompilerError;
+import org.simantics.scl.compiler.elaboration.chr.plan.AssignOp;
+import org.simantics.scl.compiler.elaboration.chr.plan.CheckOp;
+import org.simantics.scl.compiler.elaboration.chr.plan.MatchOp;
+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 org.simantics.scl.compiler.elaboration.expressions.Variable;
+import org.simantics.scl.compiler.elaboration.java.Builtins;
+
+import gnu.trove.set.hash.TIntHashSet;
+
+public class EqualsPrePlanItem extends PrePlanItem {
+ public Expression expression1, expression2;
+ public TIntHashSet variableSet1, variableSet2;
+
+ public EqualsPrePlanItem(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 = 1;
+ }
+ else {
+ if(variableSet1.isEmpty() && expression2.isPattern(0))
+ primaryPriority = 0.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(variableSet1.isEmpty() && variableSet2.isEmpty()) {
+ context.addPlanOp(new CheckOp(location, new EApply(location, new EConstant(Builtins.EQUALS, expression1.getType()), expression1, expression2)));
+ }
+ else if(variableSet2.isEmpty()) {
+ Variable variable = ((EVariable)expression1).getVariable();
+ context.addPlanOp(new AssignOp(location, variable, expression2));
+ context.bind(variableSet1);
+ }
+ else if(variableSet1.isEmpty()) {
+ if(expression2 instanceof EVariable) {
+ Variable variable = ((EVariable)expression2).getVariable();
+ context.addPlanOp(new AssignOp(location, variable, expression1));
+ }
+ else {
+ context.addPlanOp(new MatchOp(location, expression1, expression2));
+ }
+ context.bind(variableSet2);
+ }
+ else
+ throw new InternalCompilerError("Unsolvable query.");
+ }
+}