]> gerrit.simantics Code Review - simantics/platform.git/blob - bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/elaboration/expressions/visitors/StandardExpressionVisitor.java
Merge "(refs #7375) Replaced collectEffects by CollectEffectsVisitor"
[simantics/platform.git] / bundles / org.simantics.scl.compiler / src / org / simantics / scl / compiler / elaboration / expressions / visitors / StandardExpressionVisitor.java
1 package org.simantics.scl.compiler.elaboration.expressions.visitors;
2
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;
98
99
100 public class StandardExpressionVisitor implements 
101 ExpressionVisitor, QueryVisitor, FieldAccessorVisitor, ListQualifierVisitor,
102 EquationVisitor, StatementVisitor, CHRAstQueryVisitor {
103
104     @Override
105     public void visit(EApply expression) {
106         expression.function.accept(this);
107         for(Expression parameter : expression.parameters)
108             parameter.accept(this);
109     }
110
111     @Override
112     public void visit(EApplyType expression) {
113         expression.expression.accept(this);
114     }
115
116     @Override
117     public void visit(EAsPattern expression) {
118         expression.pattern.accept(this);
119     }
120     
121     @Override
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);
128     }
129
130     @Override
131     public void visit(EConstant expression) {
132     }
133
134     @Override
135     public void visit(EEnforce expression) {
136         expression.query.accept(this);
137     }
138
139     @Override
140     public void visit(EError expression) {
141     }
142
143     @Override
144     public void visit(EExternalConstant expression) {
145     }
146
147     @Override
148     public void visit(EFieldAccess expression) {
149         expression.parent.accept(this);
150         expression.accessor.accept(this);
151     }
152
153     @Override
154     public void visit(EGetConstraint expression) {
155         if(expression.evidence != null)
156             expression.evidence.accept(this);
157     }
158
159     @Override
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);
165     }
166
167     @Override
168     public void visit(EIntegerLiteral expression) {
169         if(expression.constraint != null)
170             expression.constraint.accept(this);
171     }
172
173     @Override
174     public void visit(ELambda expression) {
175         for(Case case_ : expression.cases)
176             visit(case_);
177     }
178     
179     @Override
180     public void visit(EViewPattern expression) {
181         expression.expression.accept(this);
182         expression.pattern.accept(this);
183     }
184
185     public void visit(Case case_) {
186         for(Expression pattern : case_.patterns)
187             pattern.accept(this);
188         case_.value.accept(this);
189     }
190
191     @Override
192     public void visit(ELambdaType expression) {
193         expression.value.accept(this);
194     }
195
196     @Override
197     public void visit(ELet expression) {
198         for(Assignment assignment : expression.assignments)
199             visit(assignment);
200         expression.in.accept(this);
201     }
202
203     public void visit(Assignment assignment) {
204         assignment.pattern.accept(this);
205         assignment.value.accept(this);
206     }
207
208     @Override
209     public void visit(EListComprehension expression) {
210         expression.head.accept(this);
211         expression.qualifier.accept(this);
212     }
213
214     @Override
215     public void visit(EListLiteral expression) {
216         for(Expression component : expression.components)
217             component.accept(this);
218     }
219
220     @Override
221     public void visit(ELiteral expression) {
222     }
223
224     @Override
225     public void visit(EMatch expression) {
226         for(Expression s : expression.scrutinee)
227             s.accept(this);
228         for(Case case_ : expression.cases)
229             visit(case_);
230     }
231
232     @Override
233     public void visit(EPlaceholder expression) {
234         expression.expression.accept(this);
235     }
236
237     @Override
238     public void visit(ERealLiteral expression) {
239         if(expression.constraint != null)
240             expression.constraint.accept(this);
241     }
242
243     @Override
244     public void visit(ERuleset expression) {
245         for(DatalogRule rule : expression.rules)
246             visit(rule);
247         expression.in.accept(this);
248     }
249
250     public void visit(DatalogRule rule) {
251         for(Expression parameter : rule.headParameters)
252             parameter.accept(this);
253         rule.body.accept(this);
254     }
255
256     @Override
257     public void visit(ESelect expression) {
258         expression.query.accept(this);
259         expression.expression.accept(this);
260     }
261     
262     @Override
263     public void visit(ECHRSelect expression) {
264         visit(expression.query);
265         expression.expression.accept(this);
266     }
267
268     @Override
269     public void visit(ESimpleLambda expression) {
270         expression.value.accept(this);
271     }
272
273     @Override
274     public void visit(ESimpleLet expression) {
275         expression.value.accept(this);
276         expression.in.accept(this);
277     }
278
279     @Override
280     public void visit(ETransformation expression) {
281         expression.seed.accept(this);
282     }
283     
284     @Override
285     public void visit(ETypeAnnotation expression) {
286         expression.value.accept(this);
287     }
288
289     @Override
290     public void visit(EVar expression) {
291     }
292
293     @Override
294     public void visit(EVariable expression) {
295     }
296
297     @Override
298     public void visit(EWhen expression) {
299         expression.query.accept(this);
300         expression.action.accept(this);
301     }
302
303     @Override
304     public void visit(GuardedExpressionGroup expression) {
305         for(GuardedExpression gexp : expression.expressions) {
306             for(Expression guard : gexp.guards)
307                 guard.accept(this);
308             gexp.value.accept(this);
309         }
310     }
311
312     @Override
313     public void visit(QAlternative query) {
314         for(Query q : query.queries)
315             q.accept(this);
316     }
317
318     @Override
319     public void visit(QAtom query) {
320         for(Expression parameter : query.parameters)
321             parameter.accept(this);
322     }
323     
324     @Override
325     public void visit(QMapping query) {
326         for(Expression parameter : query.parameters)
327             parameter.accept(this);
328     }
329
330     @Override
331     public void visit(QConjunction query) {
332         for(Query q : query.queries)
333             q.accept(this);
334     }
335
336     @Override
337     public void visit(QDisjunction query) {
338         for(Query q : query.queries)
339             q.accept(this);
340     }
341
342     @Override
343     public void visit(QExists query) {
344         query.query.accept(this);
345     }
346
347     @Override
348     public void visit(QNegation query) {
349         query.query.accept(this);
350     }
351
352     @Override
353     public void visit(ExpressionAccessor accessor) {
354         accessor.fieldName.accept(this);
355     }
356
357     @Override
358     public void visit(IdAccessor accessor) {
359     }
360
361     @Override
362     public void visit(StringAccessor accessor) {
363     }
364
365     @Override
366     public void visit(ListAssignment qualifier) {
367         qualifier.pattern.accept(this);
368         qualifier.value.accept(this);
369     }
370
371     @Override
372     public void visit(ListGenerator qualifier) {
373         qualifier.pattern.accept(this);
374         qualifier.value.accept(this);
375     }
376
377     @Override
378     public void visit(ListGuard qualifier) {
379         qualifier.condition.accept(this);
380     }
381
382     @Override
383     public void visit(ListSeq qualifier) {
384         qualifier.a.accept(this);
385         qualifier.b.accept(this);
386     }
387
388     @Override
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);
394     }
395
396     @Override
397     public void visit(QIf query) {
398         query.condition.accept(this);
399         query.thenQuery.accept(this);
400         query.elseQuery.accept(this);
401     }
402
403     @Override
404     public void visit(ECoveringBranchPoint expression) {
405         expression.expression.accept(this);
406     }
407
408     @Override
409     public void visit(EqBasic equation) {
410         equation.left.accept(this);
411         equation.right.accept(this);
412     }
413
414     @Override
415     public void visit(EqGuard equation) {
416         equation.guard.accept(this);
417     }
418
419     @Override
420     public void visit(EEquations expression) {
421         for(Equation equation : expression.equations)
422             equation.accept(this);
423     }
424     
425     public void visit(CHRLiteral literal) {
426         for(Expression parameter : literal.parameters)
427             parameter.accept(this);
428     }
429     
430     public void visit(CHRQuery query) {
431         for(CHRLiteral literal : query.literals)
432             visit(literal);
433     }
434     
435     public void visit(CHRRule rule) {
436         visit(rule.head);
437         visit(rule.body);
438     }
439     
440     public void visit(CHRRuleset ruleset) {
441         for(CHRRule rule : ruleset.rules)
442             visit(rule);
443         for(IncludeStatement include : ruleset.includes)
444             include.value.accept(this);
445     }
446
447     @Override
448     public void visit(ECHRRuleset expression) {
449         visit(expression.ruleset);
450         expression.in.accept(this);
451     }
452     
453     @Override
454     public void visit(ECHRRulesetConstructor expression) {
455         visit(expression.ruleset);
456     }
457
458     @Override
459     public void visit(EBinary expression) {
460         expression.left.accept(this);
461         for(EBinaryRightSide right : expression.rights)
462             right.right.accept(this);
463     }
464
465     @Override
466     public void visit(EBlock expression) {
467         for(Statement stat : expression.statements)
468             stat.accept(this);
469     }
470
471     @Override
472     public void visit(EPreLet expression) {
473         for(LetStatement stat : expression.assignments) {
474             stat.pattern.accept(this);
475             stat.value.accept(this);
476         }
477         expression.in.accept(this);
478     }
479
480     @Override
481     public void visit(ERange expression) {
482         expression.from.accept(this);
483         expression.to.accept(this);
484     }
485
486     @Override
487     public void visit(ERecord expression) {
488         for(FieldAssignment assignment : expression.fields)
489             assignment.value.accept(this);
490         
491     }
492
493     @Override
494     public void visit(EStringLiteral expression) {
495         for(Expression exp : expression.expressions)
496             exp.accept(this);
497     }
498
499     @Override
500     public void visit(BindStatement statement) {
501         statement.pattern.accept(this);
502         statement.value.accept(this);
503     }
504
505     @Override
506     public void visit(GuardStatement statement) {
507         statement.value.accept(this);
508     }
509
510     @Override
511     public void visit(LetStatement statement) {
512         statement.value.accept(this);
513     }
514
515     @Override
516     public void visit(RuleStatement statement) {
517         statement.head.accept(this);
518         statement.body.accept(this);
519     }
520
521     @Override
522     public void visit(IncludeStatement statement) {
523         statement.value.accept(this);
524     }
525     
526     @Override
527     public void visit(CHRStatement statement) {
528         statement.body.accept(this);
529         statement.head.accept(this);
530     }
531
532     @Override
533     public void visit(CHRAstAtom query) {
534         query.expression.accept(this);
535     }
536
537     @Override
538     public void visit(CHRAstBinds query) {
539         query.left.accept(this);
540         query.right.accept(this);
541     }
542
543     @Override
544     public void visit(CHRAstConjunction query) {
545         for(CHRAstQuery conjunct : query.conjuncts)
546             conjunct.accept(this);
547     }
548
549     @Override
550     public void visit(CHRAstEquals query) {
551         query.left.accept(this);
552         query.right.accept(this);
553     }
554
555     @Override
556     public void visit(CHRAstNegation query) {
557         query.subquery.accept(this);
558     }
559
560     @Override
561     public void visit(EAmbiguous expression) {
562         if(expression.resolvedExpression != null)
563             expression.resolvedExpression.accept(this);
564     }
565 }