]> gerrit.simantics Code Review - simantics/platform.git/blob - bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/elaboration/chr/CHRQuery.java
(refs #7375) Replaced forVariables by a visitor
[simantics/platform.git] / bundles / org.simantics.scl.compiler / src / org / simantics / scl / compiler / elaboration / chr / CHRQuery.java
1 package org.simantics.scl.compiler.elaboration.chr;
2
3 import org.simantics.scl.compiler.elaboration.chr.plan.PostCommitOp;
4 import org.simantics.scl.compiler.elaboration.chr.plan.PreCommitOp;
5 import org.simantics.scl.compiler.elaboration.chr.planning.QueryPlanningContext;
6 import org.simantics.scl.compiler.elaboration.chr.relations.CHRConstraint;
7 import org.simantics.scl.compiler.elaboration.chr.relations.SpecialCHRRelation;
8 import org.simantics.scl.compiler.elaboration.contexts.SimplificationContext;
9 import org.simantics.scl.compiler.elaboration.contexts.TranslationContext;
10 import org.simantics.scl.compiler.elaboration.contexts.TypingContext;
11 import org.simantics.scl.compiler.elaboration.expressions.Expression;
12 import org.simantics.scl.compiler.elaboration.expressions.Variable;
13 import org.simantics.scl.compiler.elaboration.expressions.printing.ExpressionToStringVisitor;
14 import org.simantics.scl.compiler.errors.Locations;
15 import org.simantics.scl.compiler.internal.parsing.Symbol;
16 import org.simantics.scl.compiler.types.Type;
17
18 import gnu.trove.map.hash.TObjectIntHashMap;
19 import gnu.trove.set.hash.THashSet;
20 import gnu.trove.set.hash.TIntHashSet;
21
22 public class CHRQuery extends Symbol {
23     public CHRLiteral[] literals;
24
25     public CHRQuery(CHRLiteral[] literals) {
26         this.literals = literals;
27     }
28
29     public void resolve(TranslationContext context) {
30         for(CHRLiteral literal : literals)
31             literal.resolve(context);
32     }
33
34     public void collectRefs(TObjectIntHashMap<Object> allRefs, TIntHashSet refs) {
35         for(CHRLiteral literal : literals)
36             literal.collectRefs(allRefs, refs);
37     }
38
39     public void checkType(TypingContext context) {
40         for(CHRLiteral literal : literals)
41             literal.checkType(context);
42     }
43     
44     public void collectVars(TObjectIntHashMap<Variable> allVars, TIntHashSet vars) {
45         for(CHRLiteral literal : literals)
46             literal.collectVars(allVars, vars);
47     }
48
49     public void collectFreeVariables(THashSet<Variable> vars) {
50         for(CHRLiteral literal : literals)
51             literal.collectFreeVariables(vars);
52         for(CHRLiteral literal : literals)
53             if(literal.relation == SpecialCHRRelation.ASSIGN)
54                 literal.parameters[0].removeFreeVariables(vars);
55     }
56
57     public void setLocationDeep(long loc) {
58         if(location == Locations.NO_LOCATION) {
59             this.location = loc;
60             for(CHRLiteral literal : literals)
61                 literal.setLocationDeep(loc);
62         }
63     }
64     
65     public boolean createQueryPlan(QueryPlanningContext context, Expression inputFact, int activeLiteralId, CHRConstraint initConstraint) {
66         for(int i=0;i<literals.length;++i) {
67             CHRLiteral literal = literals[i];
68             if(i == activeLiteralId)
69                 context.activate(literal, inputFact, i);
70             else
71                 context.add(literal, i);
72         }
73         if(activeLiteralId == -1 && inputFact != null) {
74             context.addInitFact(initConstraint, inputFact);
75         }       
76         return context.createQueryPlan();
77     }
78     
79     public void simplify(SimplificationContext context) {
80         for(CHRLiteral literal : literals)
81             literal.simplify(context);
82     }
83
84     public void createEnforcePlan(QueryPlanningContext context, int priority) {
85         context.addPlanOp(new PreCommitOp(location));
86         for(CHRLiteral literal : literals)
87             context.claim(context, literal);
88         context.addPlanOp(new PostCommitOp(location, priority));
89     }
90     
91     public String toString() {
92         StringBuilder b = new StringBuilder();
93         ExpressionToStringVisitor visitor = new ExpressionToStringVisitor(b);
94         visitor.visit(this);
95         return b.toString();
96     }
97
98     public void collectQueryEffects(THashSet<Type> effects) {
99         for(CHRLiteral literal : literals)
100             literal.collectQueryEffects(effects);
101     }
102     
103     public void collectEnforceEffects(THashSet<Type> effects) {
104         for(CHRLiteral literal : literals)
105             literal.collectEnforceEffects(effects);
106     }
107 }