1 package org.simantics.scl.compiler.elaboration.chr;
\r
3 import org.simantics.scl.compiler.compilation.CompilationContext;
\r
4 import org.simantics.scl.compiler.elaboration.chr.plan.PlanOp;
\r
5 import org.simantics.scl.compiler.elaboration.chr.plan.PrioritizedPlan;
\r
6 import org.simantics.scl.compiler.elaboration.chr.planning.QueryPlanningContext;
\r
7 import org.simantics.scl.compiler.elaboration.chr.relations.CHRConstraint;
\r
8 import org.simantics.scl.compiler.elaboration.contexts.SimplificationContext;
\r
9 import org.simantics.scl.compiler.elaboration.contexts.TranslationContext;
\r
10 import org.simantics.scl.compiler.elaboration.contexts.TypingContext;
\r
11 import org.simantics.scl.compiler.elaboration.expressions.EVariable;
\r
12 import org.simantics.scl.compiler.elaboration.expressions.Variable;
\r
13 import org.simantics.scl.compiler.elaboration.expressions.VariableProcedure;
\r
14 import org.simantics.scl.compiler.elaboration.expressions.printing.ExpressionToStringVisitor;
\r
15 import org.simantics.scl.compiler.errors.Locations;
\r
16 import org.simantics.scl.compiler.internal.parsing.Symbol;
\r
17 import org.simantics.scl.compiler.types.Types;
\r
18 import org.simantics.scl.compiler.types.kinds.Kinds;
\r
20 import gnu.trove.map.hash.TObjectIntHashMap;
\r
21 import gnu.trove.set.hash.THashSet;
\r
22 import gnu.trove.set.hash.TIntHashSet;
\r
24 public class CHRRule extends Symbol {
\r
25 public int priority;
\r
26 public CHRQuery head;
\r
27 public CHRQuery body;
\r
28 public Variable[] existentialVariables;
\r
31 public int firstPriorityExecuted;
\r
32 public int lastPriorityExecuted;
\r
34 public CHRRule(long location, CHRQuery head, CHRQuery body, Variable[] existentialVariables) {
\r
35 this.location = location;
\r
38 this.existentialVariables = existentialVariables;
\r
41 public void resolve(TranslationContext context) {
\r
42 context.pushExistentialFrame();
\r
43 head.resolve(context);
\r
44 body.resolve(context);
\r
45 existentialVariables = context.popExistentialFrame();
\r
48 public void collectRefs(TObjectIntHashMap<Object> allRefs, TIntHashSet refs) {
\r
49 head.collectRefs(allRefs, refs);
\r
50 body.collectRefs(allRefs, refs);
\r
53 public void checkType(TypingContext context) {
\r
54 for(Variable variable : existentialVariables)
\r
55 variable.setType(Types.metaVar(Kinds.STAR));
\r
56 head.checkType(context);
\r
57 body.checkType(context);
\r
60 public void collectVars(TObjectIntHashMap<Variable> allVars, TIntHashSet vars) {
\r
61 head.collectVars(allVars, vars);
\r
62 body.collectVars(allVars, vars);
\r
65 public void forVariables(VariableProcedure procedure) {
\r
66 head.forVariables(procedure);
\r
67 body.forVariables(procedure);
\r
70 public void collectFreeVariables(THashSet<Variable> vars) {
\r
71 head.collectFreeVariables(vars);
\r
72 body.collectFreeVariables(vars);
\r
75 public void setLocationDeep(long loc) {
\r
76 if(location == Locations.NO_LOCATION) {
\r
77 this.location = loc;
\r
78 head.setLocationDeep(loc);
\r
79 body.setLocationDeep(loc);
\r
83 public void simplify(SimplificationContext context) {
\r
84 head.simplify(context);
\r
85 body.simplify(context);
\r
88 public void compile(CompilationContext compilationContext, CHRConstraint initConstraint) {
\r
89 boolean hasActiveLiteral = false;
\r
90 for(int i=0;i<head.literals.length;++i) {
\r
91 CHRLiteral literal = head.literals[i];
\r
94 CHRConstraint constraint = (CHRConstraint)literal.relation;
\r
96 Variable activeFact = new Variable("activeFact", constraint.factType);
\r
97 QueryPlanningContext context = new QueryPlanningContext(compilationContext, existentialVariables);
\r
98 head.createQueryPlan(context, new EVariable(activeFact), i);
\r
99 body.createEnforcePlan(context, priority);
\r
100 constraint.plans.add(new PrioritizedPlan(priority, activeFact, context.getPlanOps()));
\r
102 hasActiveLiteral = true;
\r
104 if(!hasActiveLiteral) {
\r
105 Variable activeFact = new Variable("activeFact", initConstraint.factType);
\r
106 QueryPlanningContext context = new QueryPlanningContext(compilationContext, existentialVariables);
\r
107 head.createQueryPlan(context, null, -1);
\r
108 body.createEnforcePlan(context, priority);
\r
109 /*System.out.println(this);
\r
110 for(PlanOp planOp : context.getPlanOps())
\r
111 System.out.println(" " + planOp);*/
\r
112 initConstraint.plans.add(new PrioritizedPlan(priority, activeFact, context.getPlanOps()));
\r
116 public String toString() {
\r
117 StringBuilder b = new StringBuilder();
\r
118 ExpressionToStringVisitor visitor = new ExpressionToStringVisitor(b);
\r
119 visitor.visit(this);
\r
120 return b.toString();
\r