--- /dev/null
+package org.simantics.scl.compiler.elaboration.expressions;\r
+\r
+import org.simantics.scl.compiler.elaboration.equation.EqBasic;\r
+import org.simantics.scl.compiler.elaboration.equation.EqGuard;\r
+import org.simantics.scl.compiler.elaboration.equation.Equation;\r
+import org.simantics.scl.compiler.elaboration.equation.EquationVisitor;\r
+import org.simantics.scl.compiler.elaboration.expressions.ERuleset.DatalogRule;\r
+import org.simantics.scl.compiler.elaboration.expressions.accessor.ExpressionAccessor;\r
+import org.simantics.scl.compiler.elaboration.expressions.accessor.FieldAccessor;\r
+import org.simantics.scl.compiler.elaboration.expressions.accessor.FieldAccessorVisitor;\r
+import org.simantics.scl.compiler.elaboration.expressions.accessor.IdAccessor;\r
+import org.simantics.scl.compiler.elaboration.expressions.accessor.StringAccessor;\r
+import org.simantics.scl.compiler.elaboration.expressions.list.ListAssignment;\r
+import org.simantics.scl.compiler.elaboration.expressions.list.ListGenerator;\r
+import org.simantics.scl.compiler.elaboration.expressions.list.ListGuard;\r
+import org.simantics.scl.compiler.elaboration.expressions.list.ListQualifierVisitor;\r
+import org.simantics.scl.compiler.elaboration.expressions.list.ListSeq;\r
+import org.simantics.scl.compiler.elaboration.expressions.list.ListThen;\r
+import org.simantics.scl.compiler.elaboration.query.QAlternative;\r
+import org.simantics.scl.compiler.elaboration.query.QAtom;\r
+import org.simantics.scl.compiler.elaboration.query.QConjunction;\r
+import org.simantics.scl.compiler.elaboration.query.QDisjunction;\r
+import org.simantics.scl.compiler.elaboration.query.QExists;\r
+import org.simantics.scl.compiler.elaboration.query.QIf;\r
+import org.simantics.scl.compiler.elaboration.query.QMapping;\r
+import org.simantics.scl.compiler.elaboration.query.QNegation;\r
+import org.simantics.scl.compiler.elaboration.query.Query;\r
+import org.simantics.scl.compiler.elaboration.query.QueryVisitor;\r
+\r
+\r
+public class StandardExpressionVisitor implements \r
+ExpressionVisitor, QueryVisitor, FieldAccessorVisitor, ListQualifierVisitor,\r
+EquationVisitor {\r
+\r
+ @Override\r
+ public void visit(EApply expression) {\r
+ expression.function.accept(this);\r
+ for(Expression parameter : expression.parameters)\r
+ parameter.accept(this);\r
+ }\r
+\r
+ @Override\r
+ public void visit(EApplyType expression) {\r
+ expression.expression.accept(this);\r
+ }\r
+\r
+ @Override\r
+ public void visit(EAsPattern expression) {\r
+ expression.pattern.accept(this);\r
+ }\r
+ \r
+ @Override\r
+ public void visit(EBind expression) {\r
+ expression.pattern.accept(this);\r
+ expression.value.accept(this);\r
+ expression.in.accept(this);\r
+ }\r
+\r
+ @Override\r
+ public void visit(EConstant expression) {\r
+ }\r
+\r
+ @Override\r
+ public void visit(EEnforce expression) {\r
+ expression.query.accept(this);\r
+ }\r
+\r
+ @Override\r
+ public void visit(EError expression) {\r
+ }\r
+\r
+ @Override\r
+ public void visit(EExternalConstant expression) {\r
+ }\r
+\r
+ @Override\r
+ public void visit(EFieldAccess expression) {\r
+ expression.parent.accept(this);\r
+ for(FieldAccessor accessor : expression.accessors)\r
+ accessor.accept(this);\r
+ }\r
+\r
+ @Override\r
+ public void visit(EGetConstraint expression) {\r
+ if(expression.evidence != null)\r
+ expression.evidence.accept(this);\r
+ }\r
+\r
+ @Override\r
+ public void visit(EIf expression) {\r
+ expression.condition.accept(this);\r
+ expression.then_.accept(this);\r
+ expression.else_.accept(this);\r
+ }\r
+\r
+ @Override\r
+ public void visit(EIntegerLiteral expression) {\r
+ if(expression.constraint != null)\r
+ expression.constraint.accept(this);\r
+ }\r
+\r
+ @Override\r
+ public void visit(ELambda expression) {\r
+ for(Case case_ : expression.cases)\r
+ visit(case_);\r
+ }\r
+\r
+ public void visit(Case case_) {\r
+ for(Expression pattern : case_.patterns)\r
+ pattern.accept(this);\r
+ case_.value.accept(this);\r
+ }\r
+\r
+ @Override\r
+ public void visit(ELambdaType expression) {\r
+ expression.value.accept(this);\r
+ }\r
+\r
+ @Override\r
+ public void visit(ELet expression) {\r
+ for(Assignment assignment : expression.assignments)\r
+ visit(assignment);\r
+ }\r
+\r
+ public void visit(Assignment assignment) {\r
+ assignment.pattern.accept(this);\r
+ assignment.value.accept(this);\r
+ }\r
+\r
+ @Override\r
+ public void visit(EListComprehension expression) {\r
+ expression.head.accept(this);\r
+ expression.qualifier.accept(this);\r
+ }\r
+\r
+ @Override\r
+ public void visit(EListLiteral expression) {\r
+ for(Expression component : expression.components)\r
+ component.accept(this);\r
+ }\r
+\r
+ @Override\r
+ public void visit(ELiteral expression) {\r
+ }\r
+\r
+ @Override\r
+ public void visit(EMatch expression) {\r
+ for(Expression s : expression.scrutinee)\r
+ s.accept(this);\r
+ for(Case case_ : expression.cases)\r
+ visit(case_);\r
+ }\r
+\r
+ @Override\r
+ public void visit(EPlaceholder expression) {\r
+ expression.expression.accept(this);\r
+ }\r
+\r
+ @Override\r
+ public void visit(ERealLiteral expression) {\r
+ if(expression.constraint != null)\r
+ expression.constraint.accept(this);\r
+ }\r
+\r
+ @Override\r
+ public void visit(ERuleset expression) {\r
+ for(DatalogRule rule : expression.rules)\r
+ visit(rule);\r
+ expression.in.accept(this);\r
+ }\r
+\r
+ public void visit(DatalogRule rule) {\r
+ for(Expression parameter : rule.headParameters)\r
+ parameter.accept(this);\r
+ rule.body.accept(this);\r
+ }\r
+\r
+ @Override\r
+ public void visit(ESelect expression) {\r
+ expression.query.accept(this);\r
+ expression.expression.accept(this);\r
+ }\r
+\r
+ @Override\r
+ public void visit(ESimpleLambda expression) {\r
+ expression.value.accept(this);\r
+ }\r
+\r
+ @Override\r
+ public void visit(ESimpleLet expression) {\r
+ expression.value.accept(this);\r
+ expression.in.accept(this);\r
+ }\r
+\r
+ @Override\r
+ public void visit(ETransformation expression) {\r
+ expression.seed.accept(this);\r
+ }\r
+ \r
+ @Override\r
+ public void visit(ETypeAnnotation expression) {\r
+ expression.value.accept(this);\r
+ }\r
+\r
+ @Override\r
+ public void visit(EVariable expression) {\r
+ }\r
+\r
+ @Override\r
+ public void visit(EWhen expression) {\r
+ expression.query.accept(this);\r
+ expression.action.accept(this);\r
+ }\r
+\r
+ @Override\r
+ public void visit(GuardedExpressionGroup expression) {\r
+ for(GuardedExpression gexp : expression.expressions) {\r
+ for(Expression guard : gexp.guards)\r
+ guard.accept(this);\r
+ gexp.value.accept(this);\r
+ }\r
+ }\r
+\r
+ @Override\r
+ public void visit(QAlternative query) {\r
+ for(Query q : query.queries)\r
+ q.accept(this);\r
+ }\r
+\r
+ @Override\r
+ public void visit(QAtom query) {\r
+ for(Expression parameter : query.parameters)\r
+ parameter.accept(this);\r
+ }\r
+ \r
+ @Override\r
+ public void visit(QMapping query) {\r
+ for(Expression parameter : query.parameters)\r
+ parameter.accept(this);\r
+ }\r
+\r
+ @Override\r
+ public void visit(QConjunction query) {\r
+ for(Query q : query.queries)\r
+ q.accept(this);\r
+ }\r
+\r
+ @Override\r
+ public void visit(QDisjunction query) {\r
+ for(Query q : query.queries)\r
+ q.accept(this);\r
+ }\r
+\r
+ @Override\r
+ public void visit(QExists query) {\r
+ query.query.accept(this);\r
+ }\r
+\r
+ @Override\r
+ public void visit(QNegation query) {\r
+ query.query.accept(this);\r
+ }\r
+\r
+ @Override\r
+ public void visit(ExpressionAccessor accessor) {\r
+ accessor.fieldName.accept(this);\r
+ }\r
+\r
+ @Override\r
+ public void visit(IdAccessor accessor) {\r
+ }\r
+\r
+ @Override\r
+ public void visit(StringAccessor accessor) {\r
+ }\r
+\r
+ @Override\r
+ public void visit(ListAssignment qualifier) {\r
+ qualifier.pattern.accept(this);\r
+ qualifier.value.accept(this);\r
+ }\r
+\r
+ @Override\r
+ public void visit(ListGenerator qualifier) {\r
+ qualifier.pattern.accept(this);\r
+ qualifier.value.accept(this);\r
+ }\r
+\r
+ @Override\r
+ public void visit(ListGuard qualifier) {\r
+ qualifier.condition.accept(this);\r
+ }\r
+\r
+ @Override\r
+ public void visit(ListSeq qualifier) {\r
+ qualifier.a.accept(this);\r
+ qualifier.b.accept(this);\r
+ }\r
+\r
+ @Override\r
+ public void visit(ListThen qualifier) {\r
+ qualifier.left.accept(this);\r
+ qualifier.transformer.accept(this);\r
+ if(qualifier.by != null)\r
+ qualifier.by.accept(this);\r
+ }\r
+\r
+ @Override\r
+ public void visit(QIf query) {\r
+ query.condition.accept(this);\r
+ query.thenQuery.accept(this);\r
+ query.elseQuery.accept(this);\r
+ }\r
+\r
+ @Override\r
+ public void visit(ECoveringBranchPoint expression) {\r
+ expression.expression.accept(this);\r
+ }\r
+\r
+ @Override\r
+ public void visit(EqBasic equation) {\r
+ equation.left.accept(this);\r
+ equation.right.accept(this);\r
+ }\r
+\r
+ @Override\r
+ public void visit(EqGuard equation) {\r
+ equation.guard.accept(this);\r
+ }\r
+\r
+ @Override\r
+ public void visit(EEquations expression) {\r
+ for(Equation equation : expression.equations)\r
+ equation.accept(this);\r
+ }\r
+\r
+}\r