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