]> gerrit.simantics Code Review - simantics/platform.git/blob - bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/elaboration/chr/CHRQuery.java
(refs #7375) Fixed implementation of collectEffects
[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.contexts.SimplificationContext;
8 import org.simantics.scl.compiler.elaboration.contexts.TranslationContext;
9 import org.simantics.scl.compiler.elaboration.contexts.TypingContext;
10 import org.simantics.scl.compiler.elaboration.expressions.Expression;
11 import org.simantics.scl.compiler.elaboration.expressions.Variable;
12 import org.simantics.scl.compiler.elaboration.expressions.printing.ExpressionToStringVisitor;
13 import org.simantics.scl.compiler.errors.Locations;
14 import org.simantics.scl.compiler.internal.parsing.Symbol;
15
16 import gnu.trove.map.hash.TObjectIntHashMap;
17 import gnu.trove.set.hash.TIntHashSet;
18
19 public class CHRQuery extends Symbol {
20     public CHRLiteral[] literals;
21
22     public CHRQuery(CHRLiteral[] literals) {
23         this.literals = literals;
24     }
25
26     public void resolve(TranslationContext context) {
27         for(CHRLiteral literal : literals)
28             literal.resolve(context);
29     }
30
31     public void checkType(TypingContext context) {
32         for(CHRLiteral literal : literals)
33             literal.checkType(context);
34     }
35     
36     public void collectVars(TObjectIntHashMap<Variable> allVars, TIntHashSet vars) {
37         for(CHRLiteral literal : literals)
38             literal.collectVars(allVars, vars);
39     }
40     
41     public void setLocationDeep(long loc) {
42         if(location == Locations.NO_LOCATION) {
43             this.location = loc;
44             for(CHRLiteral literal : literals)
45                 literal.setLocationDeep(loc);
46         }
47     }
48     
49     public boolean createQueryPlan(QueryPlanningContext context, Expression inputFact, int activeLiteralId, CHRConstraint initConstraint) {
50         for(int i=0;i<literals.length;++i) {
51             CHRLiteral literal = literals[i];
52             if(i == activeLiteralId)
53                 context.activate(literal, inputFact, i);
54             else
55                 context.add(literal, i);
56         }
57         if(activeLiteralId == -1 && inputFact != null) {
58             context.addInitFact(initConstraint, inputFact);
59         }       
60         return context.createQueryPlan();
61     }
62     
63     public void simplify(SimplificationContext context) {
64         for(CHRLiteral literal : literals)
65             literal.simplify(context);
66     }
67
68     public void createEnforcePlan(QueryPlanningContext context, int priority) {
69         context.addPlanOp(new PreCommitOp(location));
70         for(CHRLiteral literal : literals)
71             context.claim(context, literal);
72         context.addPlanOp(new PostCommitOp(location, priority));
73     }
74     
75     public String toString() {
76         StringBuilder b = new StringBuilder();
77         ExpressionToStringVisitor visitor = new ExpressionToStringVisitor(b);
78         visitor.visit(this);
79         return b.toString();
80     }
81 }