]> gerrit.simantics Code Review - simantics/platform.git/blob - bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/elaboration/chr/CHRRule.java
(refs #7375) Replaced forVariables by a visitor
[simantics/platform.git] / bundles / org.simantics.scl.compiler / src / org / simantics / scl / compiler / elaboration / chr / CHRRule.java
1 package org.simantics.scl.compiler.elaboration.chr;
2
3 import java.util.ArrayList;
4
5 import org.simantics.scl.compiler.compilation.CompilationContext;
6 import org.simantics.scl.compiler.elaboration.chr.plan.CHRSearchPlan;
7 import org.simantics.scl.compiler.elaboration.chr.planning.QueryPlanningContext;
8 import org.simantics.scl.compiler.elaboration.chr.relations.CHRConstraint;
9 import org.simantics.scl.compiler.elaboration.contexts.SimplificationContext;
10 import org.simantics.scl.compiler.elaboration.contexts.TranslationContext;
11 import org.simantics.scl.compiler.elaboration.contexts.TypingContext;
12 import org.simantics.scl.compiler.elaboration.expressions.EVariable;
13 import org.simantics.scl.compiler.elaboration.expressions.Variable;
14 import org.simantics.scl.compiler.elaboration.expressions.printing.ExpressionToStringVisitor;
15 import org.simantics.scl.compiler.errors.Locations;
16 import org.simantics.scl.compiler.internal.parsing.Symbol;
17 import org.simantics.scl.compiler.types.Types;
18 import org.simantics.scl.compiler.types.kinds.Kinds;
19
20 import gnu.trove.map.hash.TObjectIntHashMap;
21 import gnu.trove.set.hash.THashSet;
22 import gnu.trove.set.hash.TIntHashSet;
23
24 public class CHRRule extends Symbol {
25     public CHRRuleset parentRuleset;
26     public int priority;
27     public CHRQuery head;
28     public CHRQuery body;
29     public Variable[] existentialVariables;
30     
31     // Analysis
32     //public int firstPriorityExecuted;
33     public int lastPriorityExecuted;
34     
35     // Plans
36     public ArrayList<CHRSearchPlan> plans = new ArrayList<CHRSearchPlan>();
37     
38     // Code generation, move to CHRPriority
39     public String containerClassName;
40     
41     public CHRRule(long location, CHRQuery head, CHRQuery body, Variable[] existentialVariables) {
42         this.location = location;
43         this.head = head;
44         this.body = body;
45         this.existentialVariables = existentialVariables;
46     }
47     
48     public CHRRule(long location, CHRQuery head, CHRQuery body) {
49         this(location, head, body, null);
50     }
51
52     public void resolve(TranslationContext context) {
53         context.pushExistentialFrame();
54         head.resolve(context);
55         context.disallowNewExistentials();
56         body.resolve(context);
57         existentialVariables = context.popExistentialFrame();
58     }
59
60     public void collectRefs(TObjectIntHashMap<Object> allRefs, TIntHashSet refs) {
61         head.collectRefs(allRefs, refs);
62         body.collectRefs(allRefs, refs);
63     }
64
65     public void checkType(TypingContext context) {
66         for(Variable variable : existentialVariables)
67             variable.setType(Types.metaVar(Kinds.STAR));
68         head.checkType(context);
69         body.checkType(context);
70     }
71     
72     public void collectVars(TObjectIntHashMap<Variable> allVars, TIntHashSet vars) {
73         head.collectVars(allVars, vars);
74         body.collectVars(allVars, vars);
75     }
76
77     public void collectFreeVariables(THashSet<Variable> vars) {
78         head.collectFreeVariables(vars);
79         body.collectFreeVariables(vars);
80     }
81
82     public void setLocationDeep(long loc) {
83         if(location == Locations.NO_LOCATION) {
84             this.location = loc;
85             head.setLocationDeep(loc);
86             body.setLocationDeep(loc);
87         }
88     }
89     
90     public void simplify(SimplificationContext context) {
91         head.simplify(context);
92         body.simplify(context);
93     }
94
95     public void compile(CompilationContext compilationContext, CHRConstraint initConstraint) {
96         boolean hasLocalActiveLiteral = false;
97         for(int i=0;i<head.literals.length;++i) {
98             CHRLiteral literal = head.literals[i];
99             if(literal.passive)
100                 continue;
101             CHRConstraint constraint = (CHRConstraint)literal.relation;
102             
103             Variable activeFact = new Variable("activeFact", constraint.factType);
104             QueryPlanningContext context = new QueryPlanningContext(compilationContext, existentialVariables);
105             if(!head.createQueryPlan(context, new EVariable(activeFact), i, initConstraint))
106                 return;
107             body.createEnforcePlan(context, priority);
108             addPlan(new CHRSearchPlan(constraint, activeFact, context.getPlanOps()));
109             
110             if(constraint.parentRuleset == parentRuleset)
111                 hasLocalActiveLiteral = true;
112         }
113         if(!hasLocalActiveLiteral) {
114             Variable activeFact = new Variable("activeFact", initConstraint.factType);
115             QueryPlanningContext context = new QueryPlanningContext(compilationContext, existentialVariables);
116             if(!head.createQueryPlan(context, new EVariable(activeFact), -1, initConstraint))
117                 return;
118             body.createEnforcePlan(context, priority);
119             /*System.out.println(this);
120             for(PlanOp planOp : context.getPlanOps())
121                 System.out.println("    " + planOp);*/
122             addPlan(new CHRSearchPlan(initConstraint, activeFact, context.getPlanOps()));
123         }
124     }
125     
126     private void addPlan(CHRSearchPlan plan) {
127         plans.add(plan);
128     }
129
130     public String toString() {
131         StringBuilder b = new StringBuilder();
132         ExpressionToStringVisitor visitor = new ExpressionToStringVisitor(b);
133         visitor.visit(this);
134         return b.toString();
135     }
136     
137 }