1 package org.simantics.scl.compiler.elaboration.chr;
\r
3 import org.simantics.scl.compiler.elaboration.chr.plan.PostCommitOp;
\r
4 import org.simantics.scl.compiler.elaboration.chr.plan.PreCommitOp;
\r
5 import org.simantics.scl.compiler.elaboration.chr.planning.QueryPlanningContext;
\r
6 import org.simantics.scl.compiler.elaboration.contexts.SimplificationContext;
\r
7 import org.simantics.scl.compiler.elaboration.contexts.TranslationContext;
\r
8 import org.simantics.scl.compiler.elaboration.contexts.TypingContext;
\r
9 import org.simantics.scl.compiler.elaboration.expressions.Expression;
\r
10 import org.simantics.scl.compiler.elaboration.expressions.Variable;
\r
11 import org.simantics.scl.compiler.elaboration.expressions.VariableProcedure;
\r
12 import org.simantics.scl.compiler.elaboration.expressions.printing.ExpressionToStringVisitor;
\r
13 import org.simantics.scl.compiler.errors.Locations;
\r
14 import org.simantics.scl.compiler.internal.parsing.Symbol;
\r
16 import gnu.trove.map.hash.TObjectIntHashMap;
\r
17 import gnu.trove.set.hash.THashSet;
\r
18 import gnu.trove.set.hash.TIntHashSet;
\r
20 public class CHRQuery extends Symbol {
\r
21 public CHRLiteral[] literals;
\r
23 public CHRQuery(CHRLiteral[] literals) {
\r
24 this.literals = literals;
\r
27 public void resolve(TranslationContext context) {
\r
28 for(CHRLiteral literal : literals)
\r
29 literal.resolve(context);
\r
32 public void collectRefs(TObjectIntHashMap<Object> allRefs, TIntHashSet refs) {
\r
33 for(CHRLiteral literal : literals)
\r
34 literal.collectRefs(allRefs, refs);
\r
37 public void checkType(TypingContext context) {
\r
38 for(CHRLiteral literal : literals)
\r
39 literal.checkType(context);
\r
42 public void collectVars(TObjectIntHashMap<Variable> allVars, TIntHashSet vars) {
\r
43 for(CHRLiteral literal : literals)
\r
44 literal.collectVars(allVars, vars);
\r
47 public void forVariables(VariableProcedure procedure) {
\r
48 for(CHRLiteral literal : literals)
\r
49 literal.forVariables(procedure);
\r
52 public void collectFreeVariables(THashSet<Variable> vars) {
\r
53 for(CHRLiteral literal : literals)
\r
54 literal.collectFreeVariables(vars);
\r
57 public void setLocationDeep(long loc) {
\r
58 if(location == Locations.NO_LOCATION) {
\r
59 this.location = loc;
\r
60 for(CHRLiteral literal : literals)
\r
61 literal.setLocationDeep(loc);
\r
65 public void createQueryPlan(QueryPlanningContext context, Expression inputFact, int activeLiteralId) {
\r
66 for(int i=0;i<literals.length;++i) {
\r
67 CHRLiteral literal = literals[i];
\r
68 if(i == activeLiteralId)
\r
69 context.activate(literal, inputFact, i);
\r
71 context.add(literal, i);
\r
73 context.createQueryPlan();
\r
76 public void simplify(SimplificationContext context) {
\r
77 for(CHRLiteral literal : literals)
\r
78 literal.simplify(context);
\r
81 public void createEnforcePlan(QueryPlanningContext context, int priority) {
\r
82 context.addPlanOp(new PreCommitOp(location));
\r
83 for(CHRLiteral literal : literals)
\r
84 context.claim(context, literal);
\r
85 context.addPlanOp(new PostCommitOp(location, priority));
\r
88 public String toString() {
\r
89 StringBuilder b = new StringBuilder();
\r
90 ExpressionToStringVisitor visitor = new ExpressionToStringVisitor(b);
\r
91 visitor.visit(this);
\r
92 return b.toString();
\r