]> gerrit.simantics Code Review - simantics/platform.git/blob - bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/elaboration/chr/CHRQuery.java
Warn for existential variables in head pattern referred only once
[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.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;
20
21 import gnu.trove.map.hash.TObjectIntHashMap;
22 import gnu.trove.set.hash.TIntHashSet;
23
24 public class CHRQuery extends Symbol {
25     public CHRLiteral[] literals;
26
27     public CHRQuery(long location, CHRLiteral[] literals) {
28         this.literals = literals;
29         this.location = location;
30     }
31
32     public void resolve(TranslationContext context) {
33         for(CHRLiteral literal : literals)
34             literal.resolve(context);
35     }
36
37     public void checkType(TypingContext context) {
38         for(CHRLiteral literal : literals)
39             literal.checkType(context);
40     }
41     
42     public void collectVars(TObjectIntHashMap<Variable> allVars, TIntHashSet vars) {
43         for(CHRLiteral literal : literals)
44             literal.collectVars(allVars, vars);
45     }
46     
47     public void setLocationDeep(long loc) {
48         if(location == Locations.NO_LOCATION) {
49             this.location = loc;
50             for(CHRLiteral literal : literals)
51                 literal.setLocationDeep(loc);
52         }
53     }
54     
55     public boolean createQueryPlan(QueryPlanningContext context, Expression inputFact, int activeLiteralId, CHRConstraint initConstraint) {
56         try {
57             for(int i=0;i<literals.length;++i) {
58                 CHRLiteral literal = literals[i];
59                 if(i == activeLiteralId)
60                     context.activate(literal, inputFact, i);
61                 else
62                     context.add(literal, i);
63             }
64             if(activeLiteralId == -1 && inputFact != null) {
65                 context.addInitFact(initConstraint, inputFact);
66             }   
67             return context.createQueryPlan();
68         } catch(Exception e) {
69             throw InternalCompilerError.injectLocation(location, e);
70         }
71     }
72     
73     public void simplify(SimplificationContext context) {
74         for(CHRLiteral literal : literals)
75             literal.simplify(context);
76     }
77
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));
83     }
84     
85     public String toString() {
86         StringBuilder b = new StringBuilder();
87         ExpressionToStringVisitor visitor = new ExpressionToStringVisitor(b);
88         visitor.visit(this);
89         return b.toString();
90     }
91
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);
97     }
98     
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);
107             }
108         }
109     }
110 }