1 package org.simantics.scl.compiler.elaboration.expressions.visitors;
3 import org.simantics.scl.compiler.elaboration.chr.CHRLiteral;
4 import org.simantics.scl.compiler.elaboration.chr.CHRQuery;
5 import org.simantics.scl.compiler.elaboration.chr.CHRRule;
6 import org.simantics.scl.compiler.elaboration.chr.CHRRuleset;
7 import org.simantics.scl.compiler.elaboration.chr.ast.CHRAstAtom;
8 import org.simantics.scl.compiler.elaboration.chr.ast.CHRAstBinds;
9 import org.simantics.scl.compiler.elaboration.chr.ast.CHRAstConjunction;
10 import org.simantics.scl.compiler.elaboration.chr.ast.CHRAstEquals;
11 import org.simantics.scl.compiler.elaboration.chr.ast.CHRAstNegation;
12 import org.simantics.scl.compiler.elaboration.chr.ast.CHRAstQuery;
13 import org.simantics.scl.compiler.elaboration.chr.ast.CHRAstQueryVisitor;
14 import org.simantics.scl.compiler.elaboration.equation.EqBasic;
15 import org.simantics.scl.compiler.elaboration.equation.EqGuard;
16 import org.simantics.scl.compiler.elaboration.equation.Equation;
17 import org.simantics.scl.compiler.elaboration.equation.EquationVisitor;
18 import org.simantics.scl.compiler.elaboration.expressions.Assignment;
19 import org.simantics.scl.compiler.elaboration.expressions.Case;
20 import org.simantics.scl.compiler.elaboration.expressions.EAmbiguous;
21 import org.simantics.scl.compiler.elaboration.expressions.EApply;
22 import org.simantics.scl.compiler.elaboration.expressions.EApplyType;
23 import org.simantics.scl.compiler.elaboration.expressions.EAsPattern;
24 import org.simantics.scl.compiler.elaboration.expressions.EBinary;
25 import org.simantics.scl.compiler.elaboration.expressions.EBinaryRightSide;
26 import org.simantics.scl.compiler.elaboration.expressions.EBind;
27 import org.simantics.scl.compiler.elaboration.expressions.EBlock;
28 import org.simantics.scl.compiler.elaboration.expressions.ECHRRuleset;
29 import org.simantics.scl.compiler.elaboration.expressions.ECHRRulesetConstructor;
30 import org.simantics.scl.compiler.elaboration.expressions.ECHRSelect;
31 import org.simantics.scl.compiler.elaboration.expressions.EConstant;
32 import org.simantics.scl.compiler.elaboration.expressions.ECoveringBranchPoint;
33 import org.simantics.scl.compiler.elaboration.expressions.EEnforce;
34 import org.simantics.scl.compiler.elaboration.expressions.EEquations;
35 import org.simantics.scl.compiler.elaboration.expressions.EError;
36 import org.simantics.scl.compiler.elaboration.expressions.EExternalConstant;
37 import org.simantics.scl.compiler.elaboration.expressions.EFieldAccess;
38 import org.simantics.scl.compiler.elaboration.expressions.EGetConstraint;
39 import org.simantics.scl.compiler.elaboration.expressions.EIf;
40 import org.simantics.scl.compiler.elaboration.expressions.EIntegerLiteral;
41 import org.simantics.scl.compiler.elaboration.expressions.ELambda;
42 import org.simantics.scl.compiler.elaboration.expressions.ELambdaType;
43 import org.simantics.scl.compiler.elaboration.expressions.ELet;
44 import org.simantics.scl.compiler.elaboration.expressions.EListComprehension;
45 import org.simantics.scl.compiler.elaboration.expressions.EListLiteral;
46 import org.simantics.scl.compiler.elaboration.expressions.ELiteral;
47 import org.simantics.scl.compiler.elaboration.expressions.EMatch;
48 import org.simantics.scl.compiler.elaboration.expressions.EPlaceholder;
49 import org.simantics.scl.compiler.elaboration.expressions.EPreLet;
50 import org.simantics.scl.compiler.elaboration.expressions.ERange;
51 import org.simantics.scl.compiler.elaboration.expressions.ERealLiteral;
52 import org.simantics.scl.compiler.elaboration.expressions.ERecord;
53 import org.simantics.scl.compiler.elaboration.expressions.ERuleset;
54 import org.simantics.scl.compiler.elaboration.expressions.ERuleset.DatalogRule;
55 import org.simantics.scl.compiler.elaboration.expressions.ESelect;
56 import org.simantics.scl.compiler.elaboration.expressions.ESimpleLambda;
57 import org.simantics.scl.compiler.elaboration.expressions.ESimpleLet;
58 import org.simantics.scl.compiler.elaboration.expressions.EStringLiteral;
59 import org.simantics.scl.compiler.elaboration.expressions.ETransformation;
60 import org.simantics.scl.compiler.elaboration.expressions.ETypeAnnotation;
61 import org.simantics.scl.compiler.elaboration.expressions.EVar;
62 import org.simantics.scl.compiler.elaboration.expressions.EVariable;
63 import org.simantics.scl.compiler.elaboration.expressions.EViewPattern;
64 import org.simantics.scl.compiler.elaboration.expressions.EWhen;
65 import org.simantics.scl.compiler.elaboration.expressions.Expression;
66 import org.simantics.scl.compiler.elaboration.expressions.ExpressionVisitor;
67 import org.simantics.scl.compiler.elaboration.expressions.GuardedExpression;
68 import org.simantics.scl.compiler.elaboration.expressions.GuardedExpressionGroup;
69 import org.simantics.scl.compiler.elaboration.expressions.accessor.ExpressionAccessor;
70 import org.simantics.scl.compiler.elaboration.expressions.accessor.FieldAccessorVisitor;
71 import org.simantics.scl.compiler.elaboration.expressions.accessor.IdAccessor;
72 import org.simantics.scl.compiler.elaboration.expressions.accessor.StringAccessor;
73 import org.simantics.scl.compiler.elaboration.expressions.block.BindStatement;
74 import org.simantics.scl.compiler.elaboration.expressions.block.CHRStatement;
75 import org.simantics.scl.compiler.elaboration.expressions.block.GuardStatement;
76 import org.simantics.scl.compiler.elaboration.expressions.block.IncludeStatement;
77 import org.simantics.scl.compiler.elaboration.expressions.block.LetStatement;
78 import org.simantics.scl.compiler.elaboration.expressions.block.RuleStatement;
79 import org.simantics.scl.compiler.elaboration.expressions.block.Statement;
80 import org.simantics.scl.compiler.elaboration.expressions.block.StatementVisitor;
81 import org.simantics.scl.compiler.elaboration.expressions.list.ListAssignment;
82 import org.simantics.scl.compiler.elaboration.expressions.list.ListGenerator;
83 import org.simantics.scl.compiler.elaboration.expressions.list.ListGuard;
84 import org.simantics.scl.compiler.elaboration.expressions.list.ListQualifierVisitor;
85 import org.simantics.scl.compiler.elaboration.expressions.list.ListSeq;
86 import org.simantics.scl.compiler.elaboration.expressions.list.ListThen;
87 import org.simantics.scl.compiler.elaboration.expressions.records.FieldAssignment;
88 import org.simantics.scl.compiler.elaboration.query.QAlternative;
89 import org.simantics.scl.compiler.elaboration.query.QAtom;
90 import org.simantics.scl.compiler.elaboration.query.QConjunction;
91 import org.simantics.scl.compiler.elaboration.query.QDisjunction;
92 import org.simantics.scl.compiler.elaboration.query.QExists;
93 import org.simantics.scl.compiler.elaboration.query.QIf;
94 import org.simantics.scl.compiler.elaboration.query.QMapping;
95 import org.simantics.scl.compiler.elaboration.query.QNegation;
96 import org.simantics.scl.compiler.elaboration.query.Query;
97 import org.simantics.scl.compiler.elaboration.query.QueryVisitor;
100 public class StandardExpressionVisitor implements
101 ExpressionVisitor, QueryVisitor, FieldAccessorVisitor, ListQualifierVisitor,
102 EquationVisitor, StatementVisitor, CHRAstQueryVisitor {
105 public void visit(EApply expression) {
106 expression.function.accept(this);
107 for(Expression parameter : expression.parameters)
108 parameter.accept(this);
112 public void visit(EApplyType expression) {
113 expression.expression.accept(this);
117 public void visit(EAsPattern expression) {
118 expression.pattern.accept(this);
122 public void visit(EBind expression) {
123 expression.pattern.accept(this);
124 expression.value.accept(this);
125 expression.in.accept(this);
126 if(expression.monadEvidence != null)
127 visit(expression.monadEvidence);
131 public void visit(EConstant expression) {
135 public void visit(EEnforce expression) {
136 expression.query.accept(this);
140 public void visit(EError expression) {
144 public void visit(EExternalConstant expression) {
148 public void visit(EFieldAccess expression) {
149 expression.parent.accept(this);
150 expression.accessor.accept(this);
154 public void visit(EGetConstraint expression) {
155 if(expression.evidence != null)
156 expression.evidence.accept(this);
160 public void visit(EIf expression) {
161 expression.condition.accept(this);
162 expression.then_.accept(this);
163 if(expression.else_ != null)
164 expression.else_.accept(this);
168 public void visit(EIntegerLiteral expression) {
169 if(expression.constraint != null)
170 expression.constraint.accept(this);
174 public void visit(ELambda expression) {
175 for(Case case_ : expression.cases)
180 public void visit(EViewPattern expression) {
181 expression.expression.accept(this);
182 expression.pattern.accept(this);
185 public void visit(Case case_) {
186 for(Expression pattern : case_.patterns)
187 pattern.accept(this);
188 case_.value.accept(this);
192 public void visit(ELambdaType expression) {
193 expression.value.accept(this);
197 public void visit(ELet expression) {
198 for(Assignment assignment : expression.assignments)
200 expression.in.accept(this);
203 public void visit(Assignment assignment) {
204 assignment.pattern.accept(this);
205 assignment.value.accept(this);
209 public void visit(EListComprehension expression) {
210 expression.head.accept(this);
211 expression.qualifier.accept(this);
215 public void visit(EListLiteral expression) {
216 for(Expression component : expression.components)
217 component.accept(this);
221 public void visit(ELiteral expression) {
225 public void visit(EMatch expression) {
226 for(Expression s : expression.scrutinee)
228 for(Case case_ : expression.cases)
233 public void visit(EPlaceholder expression) {
234 expression.expression.accept(this);
238 public void visit(ERealLiteral expression) {
239 if(expression.constraint != null)
240 expression.constraint.accept(this);
244 public void visit(ERuleset expression) {
245 for(DatalogRule rule : expression.rules)
247 expression.in.accept(this);
250 public void visit(DatalogRule rule) {
251 for(Expression parameter : rule.headParameters)
252 parameter.accept(this);
253 rule.body.accept(this);
257 public void visit(ESelect expression) {
258 expression.query.accept(this);
259 expression.expression.accept(this);
263 public void visit(ECHRSelect expression) {
264 visit(expression.query);
265 expression.expression.accept(this);
269 public void visit(ESimpleLambda expression) {
270 expression.value.accept(this);
274 public void visit(ESimpleLet expression) {
275 expression.value.accept(this);
276 expression.in.accept(this);
280 public void visit(ETransformation expression) {
281 expression.seed.accept(this);
285 public void visit(ETypeAnnotation expression) {
286 expression.value.accept(this);
290 public void visit(EVar expression) {
294 public void visit(EVariable expression) {
298 public void visit(EWhen expression) {
299 expression.query.accept(this);
300 expression.action.accept(this);
304 public void visit(GuardedExpressionGroup expression) {
305 for(GuardedExpression gexp : expression.expressions) {
306 for(Expression guard : gexp.guards)
308 gexp.value.accept(this);
313 public void visit(QAlternative query) {
314 for(Query q : query.queries)
319 public void visit(QAtom query) {
320 for(Expression parameter : query.parameters)
321 parameter.accept(this);
325 public void visit(QMapping query) {
326 for(Expression parameter : query.parameters)
327 parameter.accept(this);
331 public void visit(QConjunction query) {
332 for(Query q : query.queries)
337 public void visit(QDisjunction query) {
338 for(Query q : query.queries)
343 public void visit(QExists query) {
344 query.query.accept(this);
348 public void visit(QNegation query) {
349 query.query.accept(this);
353 public void visit(ExpressionAccessor accessor) {
354 accessor.fieldName.accept(this);
358 public void visit(IdAccessor accessor) {
362 public void visit(StringAccessor accessor) {
366 public void visit(ListAssignment qualifier) {
367 qualifier.pattern.accept(this);
368 qualifier.value.accept(this);
372 public void visit(ListGenerator qualifier) {
373 qualifier.pattern.accept(this);
374 qualifier.value.accept(this);
378 public void visit(ListGuard qualifier) {
379 qualifier.condition.accept(this);
383 public void visit(ListSeq qualifier) {
384 qualifier.a.accept(this);
385 qualifier.b.accept(this);
389 public void visit(ListThen qualifier) {
390 qualifier.left.accept(this);
391 qualifier.transformer.accept(this);
392 if(qualifier.by != null)
393 qualifier.by.accept(this);
397 public void visit(QIf query) {
398 query.condition.accept(this);
399 query.thenQuery.accept(this);
400 query.elseQuery.accept(this);
404 public void visit(ECoveringBranchPoint expression) {
405 expression.expression.accept(this);
409 public void visit(EqBasic equation) {
410 equation.left.accept(this);
411 equation.right.accept(this);
415 public void visit(EqGuard equation) {
416 equation.guard.accept(this);
420 public void visit(EEquations expression) {
421 for(Equation equation : expression.equations)
422 equation.accept(this);
425 public void visit(CHRLiteral literal) {
426 for(Expression parameter : literal.parameters)
427 parameter.accept(this);
430 public void visit(CHRQuery query) {
431 for(CHRLiteral literal : query.literals)
435 public void visit(CHRRule rule) {
440 public void visit(CHRRuleset ruleset) {
441 for(CHRRule rule : ruleset.rules)
443 for(IncludeStatement include : ruleset.includes)
444 include.value.accept(this);
448 public void visit(ECHRRuleset expression) {
449 visit(expression.ruleset);
450 expression.in.accept(this);
454 public void visit(ECHRRulesetConstructor expression) {
455 visit(expression.ruleset);
459 public void visit(EBinary expression) {
460 expression.left.accept(this);
461 for(EBinaryRightSide right : expression.rights)
462 right.right.accept(this);
466 public void visit(EBlock expression) {
467 for(Statement stat : expression.statements)
472 public void visit(EPreLet expression) {
473 for(LetStatement stat : expression.assignments) {
474 stat.pattern.accept(this);
475 stat.value.accept(this);
477 expression.in.accept(this);
481 public void visit(ERange expression) {
482 expression.from.accept(this);
483 expression.to.accept(this);
487 public void visit(ERecord expression) {
488 for(FieldAssignment assignment : expression.fields)
489 assignment.value.accept(this);
494 public void visit(EStringLiteral expression) {
495 for(Expression exp : expression.expressions)
500 public void visit(BindStatement statement) {
501 statement.pattern.accept(this);
502 statement.value.accept(this);
506 public void visit(GuardStatement statement) {
507 statement.value.accept(this);
511 public void visit(LetStatement statement) {
512 statement.value.accept(this);
516 public void visit(RuleStatement statement) {
517 statement.head.accept(this);
518 statement.body.accept(this);
522 public void visit(IncludeStatement statement) {
523 statement.value.accept(this);
527 public void visit(CHRStatement statement) {
528 statement.body.accept(this);
529 statement.head.accept(this);
533 public void visit(CHRAstAtom query) {
534 query.expression.accept(this);
538 public void visit(CHRAstBinds query) {
539 query.left.accept(this);
540 query.right.accept(this);
544 public void visit(CHRAstConjunction query) {
545 for(CHRAstQuery conjunct : query.conjuncts)
546 conjunct.accept(this);
550 public void visit(CHRAstEquals query) {
551 query.left.accept(this);
552 query.right.accept(this);
556 public void visit(CHRAstNegation query) {
557 query.subquery.accept(this);
561 public void visit(EAmbiguous expression) {
562 if(expression.resolvedExpression != null)
563 expression.resolvedExpression.accept(this);