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