1 package org.simantics.scl.compiler.elaboration.expressions;
\r
3 import org.simantics.scl.compiler.elaboration.chr.CHRLiteral;
\r
4 import org.simantics.scl.compiler.elaboration.chr.CHRRule;
\r
5 import org.simantics.scl.compiler.elaboration.equation.EqBasic;
\r
6 import org.simantics.scl.compiler.elaboration.equation.EqGuard;
\r
7 import org.simantics.scl.compiler.elaboration.equation.Equation;
\r
8 import org.simantics.scl.compiler.elaboration.equation.EquationVisitor;
\r
9 import org.simantics.scl.compiler.elaboration.expressions.ERuleset.DatalogRule;
\r
10 import org.simantics.scl.compiler.elaboration.expressions.accessor.ExpressionAccessor;
\r
11 import org.simantics.scl.compiler.elaboration.expressions.accessor.FieldAccessor;
\r
12 import org.simantics.scl.compiler.elaboration.expressions.accessor.FieldAccessorVisitor;
\r
13 import org.simantics.scl.compiler.elaboration.expressions.accessor.IdAccessor;
\r
14 import org.simantics.scl.compiler.elaboration.expressions.accessor.StringAccessor;
\r
15 import org.simantics.scl.compiler.elaboration.expressions.list.ListAssignment;
\r
16 import org.simantics.scl.compiler.elaboration.expressions.list.ListGenerator;
\r
17 import org.simantics.scl.compiler.elaboration.expressions.list.ListGuard;
\r
18 import org.simantics.scl.compiler.elaboration.expressions.list.ListQualifierVisitor;
\r
19 import org.simantics.scl.compiler.elaboration.expressions.list.ListSeq;
\r
20 import org.simantics.scl.compiler.elaboration.expressions.list.ListThen;
\r
21 import org.simantics.scl.compiler.elaboration.query.QAlternative;
\r
22 import org.simantics.scl.compiler.elaboration.query.QAtom;
\r
23 import org.simantics.scl.compiler.elaboration.query.QConjunction;
\r
24 import org.simantics.scl.compiler.elaboration.query.QDisjunction;
\r
25 import org.simantics.scl.compiler.elaboration.query.QExists;
\r
26 import org.simantics.scl.compiler.elaboration.query.QIf;
\r
27 import org.simantics.scl.compiler.elaboration.query.QMapping;
\r
28 import org.simantics.scl.compiler.elaboration.query.QNegation;
\r
29 import org.simantics.scl.compiler.elaboration.query.Query;
\r
30 import org.simantics.scl.compiler.elaboration.query.QueryVisitor;
\r
33 public class StandardExpressionVisitor implements
\r
34 ExpressionVisitor, QueryVisitor, FieldAccessorVisitor, ListQualifierVisitor,
\r
38 public void visit(EApply expression) {
\r
39 expression.function.accept(this);
\r
40 for(Expression parameter : expression.parameters)
\r
41 parameter.accept(this);
\r
45 public void visit(EApplyType expression) {
\r
46 expression.expression.accept(this);
\r
50 public void visit(EAsPattern expression) {
\r
51 expression.pattern.accept(this);
\r
55 public void visit(EBind expression) {
\r
56 expression.pattern.accept(this);
\r
57 expression.value.accept(this);
\r
58 expression.in.accept(this);
\r
62 public void visit(EConstant expression) {
\r
66 public void visit(EEnforce expression) {
\r
67 expression.query.accept(this);
\r
71 public void visit(EError expression) {
\r
75 public void visit(EExternalConstant expression) {
\r
79 public void visit(EFieldAccess expression) {
\r
80 expression.parent.accept(this);
\r
81 for(FieldAccessor accessor : expression.accessors)
\r
82 accessor.accept(this);
\r
86 public void visit(EGetConstraint expression) {
\r
87 if(expression.evidence != null)
\r
88 expression.evidence.accept(this);
\r
92 public void visit(EIf expression) {
\r
93 expression.condition.accept(this);
\r
94 expression.then_.accept(this);
\r
95 if(expression.else_ != null)
\r
96 expression.else_.accept(this);
\r
100 public void visit(EIntegerLiteral expression) {
\r
101 if(expression.constraint != null)
\r
102 expression.constraint.accept(this);
\r
106 public void visit(ELambda expression) {
\r
107 for(Case case_ : expression.cases)
\r
112 public void visit(EViewPattern expression) {
\r
113 expression.expression.accept(this);
\r
114 expression.pattern.accept(this);
\r
117 public void visit(Case case_) {
\r
118 for(Expression pattern : case_.patterns)
\r
119 pattern.accept(this);
\r
120 case_.value.accept(this);
\r
124 public void visit(ELambdaType expression) {
\r
125 expression.value.accept(this);
\r
129 public void visit(ELet expression) {
\r
130 for(Assignment assignment : expression.assignments)
\r
134 public void visit(Assignment assignment) {
\r
135 assignment.pattern.accept(this);
\r
136 assignment.value.accept(this);
\r
140 public void visit(EListComprehension expression) {
\r
141 expression.head.accept(this);
\r
142 expression.qualifier.accept(this);
\r
146 public void visit(EListLiteral expression) {
\r
147 for(Expression component : expression.components)
\r
148 component.accept(this);
\r
152 public void visit(ELiteral expression) {
\r
156 public void visit(EMatch expression) {
\r
157 for(Expression s : expression.scrutinee)
\r
159 for(Case case_ : expression.cases)
\r
164 public void visit(EPlaceholder expression) {
\r
165 expression.expression.accept(this);
\r
169 public void visit(ERealLiteral expression) {
\r
170 if(expression.constraint != null)
\r
171 expression.constraint.accept(this);
\r
175 public void visit(ERuleset expression) {
\r
176 for(DatalogRule rule : expression.rules)
\r
178 expression.in.accept(this);
\r
181 public void visit(DatalogRule rule) {
\r
182 for(Expression parameter : rule.headParameters)
\r
183 parameter.accept(this);
\r
184 rule.body.accept(this);
\r
188 public void visit(ESelect expression) {
\r
189 expression.query.accept(this);
\r
190 expression.expression.accept(this);
\r
194 public void visit(ESimpleLambda expression) {
\r
195 expression.value.accept(this);
\r
199 public void visit(ESimpleLet expression) {
\r
200 expression.value.accept(this);
\r
201 expression.in.accept(this);
\r
205 public void visit(ETransformation expression) {
\r
206 expression.seed.accept(this);
\r
210 public void visit(ETypeAnnotation expression) {
\r
211 expression.value.accept(this);
\r
215 public void visit(EVariable expression) {
\r
219 public void visit(EWhen expression) {
\r
220 expression.query.accept(this);
\r
221 expression.action.accept(this);
\r
225 public void visit(GuardedExpressionGroup expression) {
\r
226 for(GuardedExpression gexp : expression.expressions) {
\r
227 for(Expression guard : gexp.guards)
\r
228 guard.accept(this);
\r
229 gexp.value.accept(this);
\r
234 public void visit(QAlternative query) {
\r
235 for(Query q : query.queries)
\r
240 public void visit(QAtom query) {
\r
241 for(Expression parameter : query.parameters)
\r
242 parameter.accept(this);
\r
246 public void visit(QMapping query) {
\r
247 for(Expression parameter : query.parameters)
\r
248 parameter.accept(this);
\r
252 public void visit(QConjunction query) {
\r
253 for(Query q : query.queries)
\r
258 public void visit(QDisjunction query) {
\r
259 for(Query q : query.queries)
\r
264 public void visit(QExists query) {
\r
265 query.query.accept(this);
\r
269 public void visit(QNegation query) {
\r
270 query.query.accept(this);
\r
274 public void visit(ExpressionAccessor accessor) {
\r
275 accessor.fieldName.accept(this);
\r
279 public void visit(IdAccessor accessor) {
\r
283 public void visit(StringAccessor accessor) {
\r
287 public void visit(ListAssignment qualifier) {
\r
288 qualifier.pattern.accept(this);
\r
289 qualifier.value.accept(this);
\r
293 public void visit(ListGenerator qualifier) {
\r
294 qualifier.pattern.accept(this);
\r
295 qualifier.value.accept(this);
\r
299 public void visit(ListGuard qualifier) {
\r
300 qualifier.condition.accept(this);
\r
304 public void visit(ListSeq qualifier) {
\r
305 qualifier.a.accept(this);
\r
306 qualifier.b.accept(this);
\r
310 public void visit(ListThen qualifier) {
\r
311 qualifier.left.accept(this);
\r
312 qualifier.transformer.accept(this);
\r
313 if(qualifier.by != null)
\r
314 qualifier.by.accept(this);
\r
318 public void visit(QIf query) {
\r
319 query.condition.accept(this);
\r
320 query.thenQuery.accept(this);
\r
321 query.elseQuery.accept(this);
\r
325 public void visit(ECoveringBranchPoint expression) {
\r
326 expression.expression.accept(this);
\r
330 public void visit(EqBasic equation) {
\r
331 equation.left.accept(this);
\r
332 equation.right.accept(this);
\r
336 public void visit(EqGuard equation) {
\r
337 equation.guard.accept(this);
\r
341 public void visit(EEquations expression) {
\r
342 for(Equation equation : expression.equations)
\r
343 equation.accept(this);
\r
347 public void visit(ECHRRuleset ruleset) {
\r
348 for(CHRRule rule : ruleset.ruleset.rules) {
\r
349 for(CHRLiteral literal : rule.head.literals)
\r
350 for(Expression parameter : literal.parameters)
\r
351 parameter.accept(this);
\r
352 for(CHRLiteral literal : rule.body.literals)
\r
353 for(Expression parameter : literal.parameters)
\r
354 parameter.accept(this);
\r
356 ruleset.in.accept(this);
\r