1 package org.simantics.scl.compiler.elaboration.chr;
3 import org.simantics.scl.compiler.common.exceptions.InternalCompilerError;
4 import org.simantics.scl.compiler.elaboration.chr.plan.PostCommitOp;
5 import org.simantics.scl.compiler.elaboration.chr.plan.PreCommitOp;
6 import org.simantics.scl.compiler.elaboration.chr.planning.QueryPlanningContext;
7 import org.simantics.scl.compiler.elaboration.chr.relations.CHRConstraint;
8 import org.simantics.scl.compiler.elaboration.contexts.ReplaceContext;
9 import org.simantics.scl.compiler.elaboration.contexts.SimplificationContext;
10 import org.simantics.scl.compiler.elaboration.contexts.TranslationContext;
11 import org.simantics.scl.compiler.elaboration.contexts.TypingContext;
12 import org.simantics.scl.compiler.elaboration.expressions.Expression;
13 import org.simantics.scl.compiler.elaboration.expressions.ExpressionVisitor;
14 import org.simantics.scl.compiler.elaboration.expressions.Variable;
15 import org.simantics.scl.compiler.elaboration.expressions.printing.ExpressionToStringVisitor;
16 import org.simantics.scl.compiler.elaboration.expressions.visitors.ForVariablesUsesVisitor;
17 import org.simantics.scl.compiler.elaboration.expressions.visitors.StandardExpressionVisitor;
18 import org.simantics.scl.compiler.errors.Locations;
19 import org.simantics.scl.compiler.internal.parsing.Symbol;
21 import gnu.trove.map.hash.TObjectIntHashMap;
22 import gnu.trove.set.hash.TIntHashSet;
24 public class CHRQuery extends Symbol {
25 public CHRLiteral[] literals;
27 public CHRQuery(long location, CHRLiteral[] literals) {
28 this.literals = literals;
29 this.location = location;
32 public void resolve(TranslationContext context) {
33 for(CHRLiteral literal : literals)
34 literal.resolve(context);
37 public void checkType(TypingContext context) {
38 for(CHRLiteral literal : literals)
39 literal.checkType(context);
42 public void collectVars(TObjectIntHashMap<Variable> allVars, TIntHashSet vars) {
43 for(CHRLiteral literal : literals)
44 literal.collectVars(allVars, vars);
47 public void setLocationDeep(long loc) {
48 if(location == Locations.NO_LOCATION) {
50 for(CHRLiteral literal : literals)
51 literal.setLocationDeep(loc);
55 public boolean createQueryPlan(QueryPlanningContext context, Expression inputFact, int activeLiteralId, CHRConstraint initConstraint) {
57 for(int i=0;i<literals.length;++i) {
58 CHRLiteral literal = literals[i];
59 if(i == activeLiteralId)
60 context.activate(literal, inputFact, i);
62 context.add(literal, i);
64 if(activeLiteralId == -1 && inputFact != null) {
65 context.addInitFact(initConstraint, inputFact);
67 return context.createQueryPlan();
68 } catch(Exception e) {
69 throw InternalCompilerError.injectLocation(location, e);
73 public void simplify(SimplificationContext context) {
74 for(CHRLiteral literal : literals)
75 literal.simplify(context);
78 public void createEnforcePlan(QueryPlanningContext context, int priority) {
79 context.addPlanOp(new PreCommitOp(location));
80 for(CHRLiteral literal : literals)
81 context.claim(context, literal);
82 context.addPlanOp(new PostCommitOp(location, priority));
85 public String toString() {
86 StringBuilder b = new StringBuilder();
87 ExpressionToStringVisitor visitor = new ExpressionToStringVisitor(b);
92 public CHRQuery replace(ReplaceContext context) {
93 CHRLiteral[] newLiterals = new CHRLiteral[literals.length];
94 for(int i=0;i<literals.length;++i)
95 newLiterals[i] = literals[i].replace(context);
96 return new CHRQuery(location, newLiterals);
99 public void accept(ExpressionVisitor visitor) {
100 for(CHRLiteral literal : literals) {
101 if(literal == null || literal.parameters == null)
102 continue; // FIXME why this happens?
103 for(Expression parameter : literal.parameters) {
104 if(parameter == null)
105 continue; // FIXME why this happens?
106 parameter.accept(visitor);