]> gerrit.simantics Code Review - simantics/platform.git/blobdiff - bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/elaboration/expressions/visitors/StandardExpressionVisitor.java
(refs #7375) Replaced collectFreeVariables method by a visitor
[simantics/platform.git] / bundles / org.simantics.scl.compiler / src / org / simantics / scl / compiler / elaboration / expressions / visitors / StandardExpressionVisitor.java
diff --git a/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/elaboration/expressions/visitors/StandardExpressionVisitor.java b/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/elaboration/expressions/visitors/StandardExpressionVisitor.java
new file mode 100644 (file)
index 0000000..1d03d19
--- /dev/null
@@ -0,0 +1,565 @@
+package org.simantics.scl.compiler.elaboration.expressions.visitors;
+
+import org.simantics.scl.compiler.elaboration.chr.CHRLiteral;
+import org.simantics.scl.compiler.elaboration.chr.CHRQuery;
+import org.simantics.scl.compiler.elaboration.chr.CHRRule;
+import org.simantics.scl.compiler.elaboration.chr.CHRRuleset;
+import org.simantics.scl.compiler.elaboration.chr.ast.CHRAstAtom;
+import org.simantics.scl.compiler.elaboration.chr.ast.CHRAstBinds;
+import org.simantics.scl.compiler.elaboration.chr.ast.CHRAstConjunction;
+import org.simantics.scl.compiler.elaboration.chr.ast.CHRAstEquals;
+import org.simantics.scl.compiler.elaboration.chr.ast.CHRAstNegation;
+import org.simantics.scl.compiler.elaboration.chr.ast.CHRAstQuery;
+import org.simantics.scl.compiler.elaboration.chr.ast.CHRAstQueryVisitor;
+import org.simantics.scl.compiler.elaboration.equation.EqBasic;
+import org.simantics.scl.compiler.elaboration.equation.EqGuard;
+import org.simantics.scl.compiler.elaboration.equation.Equation;
+import org.simantics.scl.compiler.elaboration.equation.EquationVisitor;
+import org.simantics.scl.compiler.elaboration.expressions.Assignment;
+import org.simantics.scl.compiler.elaboration.expressions.Case;
+import org.simantics.scl.compiler.elaboration.expressions.EAmbiguous;
+import org.simantics.scl.compiler.elaboration.expressions.EApply;
+import org.simantics.scl.compiler.elaboration.expressions.EApplyType;
+import org.simantics.scl.compiler.elaboration.expressions.EAsPattern;
+import org.simantics.scl.compiler.elaboration.expressions.EBinary;
+import org.simantics.scl.compiler.elaboration.expressions.EBinaryRightSide;
+import org.simantics.scl.compiler.elaboration.expressions.EBind;
+import org.simantics.scl.compiler.elaboration.expressions.EBlock;
+import org.simantics.scl.compiler.elaboration.expressions.ECHRRuleset;
+import org.simantics.scl.compiler.elaboration.expressions.ECHRRulesetConstructor;
+import org.simantics.scl.compiler.elaboration.expressions.ECHRSelect;
+import org.simantics.scl.compiler.elaboration.expressions.EConstant;
+import org.simantics.scl.compiler.elaboration.expressions.ECoveringBranchPoint;
+import org.simantics.scl.compiler.elaboration.expressions.EEnforce;
+import org.simantics.scl.compiler.elaboration.expressions.EEquations;
+import org.simantics.scl.compiler.elaboration.expressions.EError;
+import org.simantics.scl.compiler.elaboration.expressions.EExternalConstant;
+import org.simantics.scl.compiler.elaboration.expressions.EFieldAccess;
+import org.simantics.scl.compiler.elaboration.expressions.EGetConstraint;
+import org.simantics.scl.compiler.elaboration.expressions.EIf;
+import org.simantics.scl.compiler.elaboration.expressions.EIntegerLiteral;
+import org.simantics.scl.compiler.elaboration.expressions.ELambda;
+import org.simantics.scl.compiler.elaboration.expressions.ELambdaType;
+import org.simantics.scl.compiler.elaboration.expressions.ELet;
+import org.simantics.scl.compiler.elaboration.expressions.EListComprehension;
+import org.simantics.scl.compiler.elaboration.expressions.EListLiteral;
+import org.simantics.scl.compiler.elaboration.expressions.ELiteral;
+import org.simantics.scl.compiler.elaboration.expressions.EMatch;
+import org.simantics.scl.compiler.elaboration.expressions.EPlaceholder;
+import org.simantics.scl.compiler.elaboration.expressions.EPreLet;
+import org.simantics.scl.compiler.elaboration.expressions.ERange;
+import org.simantics.scl.compiler.elaboration.expressions.ERealLiteral;
+import org.simantics.scl.compiler.elaboration.expressions.ERecord;
+import org.simantics.scl.compiler.elaboration.expressions.ERuleset;
+import org.simantics.scl.compiler.elaboration.expressions.ERuleset.DatalogRule;
+import org.simantics.scl.compiler.elaboration.expressions.ESelect;
+import org.simantics.scl.compiler.elaboration.expressions.ESimpleLambda;
+import org.simantics.scl.compiler.elaboration.expressions.ESimpleLet;
+import org.simantics.scl.compiler.elaboration.expressions.EStringLiteral;
+import org.simantics.scl.compiler.elaboration.expressions.ETransformation;
+import org.simantics.scl.compiler.elaboration.expressions.ETypeAnnotation;
+import org.simantics.scl.compiler.elaboration.expressions.EVar;
+import org.simantics.scl.compiler.elaboration.expressions.EVariable;
+import org.simantics.scl.compiler.elaboration.expressions.EViewPattern;
+import org.simantics.scl.compiler.elaboration.expressions.EWhen;
+import org.simantics.scl.compiler.elaboration.expressions.Expression;
+import org.simantics.scl.compiler.elaboration.expressions.ExpressionVisitor;
+import org.simantics.scl.compiler.elaboration.expressions.GuardedExpression;
+import org.simantics.scl.compiler.elaboration.expressions.GuardedExpressionGroup;
+import org.simantics.scl.compiler.elaboration.expressions.accessor.ExpressionAccessor;
+import org.simantics.scl.compiler.elaboration.expressions.accessor.FieldAccessorVisitor;
+import org.simantics.scl.compiler.elaboration.expressions.accessor.IdAccessor;
+import org.simantics.scl.compiler.elaboration.expressions.accessor.StringAccessor;
+import org.simantics.scl.compiler.elaboration.expressions.block.BindStatement;
+import org.simantics.scl.compiler.elaboration.expressions.block.CHRStatement;
+import org.simantics.scl.compiler.elaboration.expressions.block.GuardStatement;
+import org.simantics.scl.compiler.elaboration.expressions.block.IncludeStatement;
+import org.simantics.scl.compiler.elaboration.expressions.block.LetStatement;
+import org.simantics.scl.compiler.elaboration.expressions.block.RuleStatement;
+import org.simantics.scl.compiler.elaboration.expressions.block.Statement;
+import org.simantics.scl.compiler.elaboration.expressions.block.StatementVisitor;
+import org.simantics.scl.compiler.elaboration.expressions.list.ListAssignment;
+import org.simantics.scl.compiler.elaboration.expressions.list.ListGenerator;
+import org.simantics.scl.compiler.elaboration.expressions.list.ListGuard;
+import org.simantics.scl.compiler.elaboration.expressions.list.ListQualifierVisitor;
+import org.simantics.scl.compiler.elaboration.expressions.list.ListSeq;
+import org.simantics.scl.compiler.elaboration.expressions.list.ListThen;
+import org.simantics.scl.compiler.elaboration.expressions.records.FieldAssignment;
+import org.simantics.scl.compiler.elaboration.query.QAlternative;
+import org.simantics.scl.compiler.elaboration.query.QAtom;
+import org.simantics.scl.compiler.elaboration.query.QConjunction;
+import org.simantics.scl.compiler.elaboration.query.QDisjunction;
+import org.simantics.scl.compiler.elaboration.query.QExists;
+import org.simantics.scl.compiler.elaboration.query.QIf;
+import org.simantics.scl.compiler.elaboration.query.QMapping;
+import org.simantics.scl.compiler.elaboration.query.QNegation;
+import org.simantics.scl.compiler.elaboration.query.Query;
+import org.simantics.scl.compiler.elaboration.query.QueryVisitor;
+
+
+public class StandardExpressionVisitor implements 
+ExpressionVisitor, QueryVisitor, FieldAccessorVisitor, ListQualifierVisitor,
+EquationVisitor, StatementVisitor, CHRAstQueryVisitor {
+
+    @Override
+    public void visit(EApply expression) {
+        expression.function.accept(this);
+        for(Expression parameter : expression.parameters)
+            parameter.accept(this);
+    }
+
+    @Override
+    public void visit(EApplyType expression) {
+        expression.expression.accept(this);
+    }
+
+    @Override
+    public void visit(EAsPattern expression) {
+        expression.pattern.accept(this);
+    }
+    
+    @Override
+    public void visit(EBind expression) {
+        expression.pattern.accept(this);
+        expression.value.accept(this);
+        expression.in.accept(this);
+        if(expression.monadEvidence != null)
+            visit(expression.monadEvidence);
+    }
+
+    @Override
+    public void visit(EConstant expression) {
+    }
+
+    @Override
+    public void visit(EEnforce expression) {
+        expression.query.accept(this);
+    }
+
+    @Override
+    public void visit(EError expression) {
+    }
+
+    @Override
+    public void visit(EExternalConstant expression) {
+    }
+
+    @Override
+    public void visit(EFieldAccess expression) {
+        expression.parent.accept(this);
+        expression.accessor.accept(this);
+    }
+
+    @Override
+    public void visit(EGetConstraint expression) {
+        if(expression.evidence != null)
+            expression.evidence.accept(this);
+    }
+
+    @Override
+    public void visit(EIf expression) {
+        expression.condition.accept(this);
+        expression.then_.accept(this);
+        if(expression.else_ != null)
+            expression.else_.accept(this);
+    }
+
+    @Override
+    public void visit(EIntegerLiteral expression) {
+        if(expression.constraint != null)
+            expression.constraint.accept(this);
+    }
+
+    @Override
+    public void visit(ELambda expression) {
+        for(Case case_ : expression.cases)
+            visit(case_);
+    }
+    
+    @Override
+    public void visit(EViewPattern expression) {
+        expression.expression.accept(this);
+        expression.pattern.accept(this);
+    }
+
+    public void visit(Case case_) {
+        for(Expression pattern : case_.patterns)
+            pattern.accept(this);
+        case_.value.accept(this);
+    }
+
+    @Override
+    public void visit(ELambdaType expression) {
+        expression.value.accept(this);
+    }
+
+    @Override
+    public void visit(ELet expression) {
+        for(Assignment assignment : expression.assignments)
+            visit(assignment);
+        expression.in.accept(this);
+    }
+
+    public void visit(Assignment assignment) {
+        assignment.pattern.accept(this);
+        assignment.value.accept(this);
+    }
+
+    @Override
+    public void visit(EListComprehension expression) {
+        expression.head.accept(this);
+        expression.qualifier.accept(this);
+    }
+
+    @Override
+    public void visit(EListLiteral expression) {
+        for(Expression component : expression.components)
+            component.accept(this);
+    }
+
+    @Override
+    public void visit(ELiteral expression) {
+    }
+
+    @Override
+    public void visit(EMatch expression) {
+        for(Expression s : expression.scrutinee)
+            s.accept(this);
+        for(Case case_ : expression.cases)
+            visit(case_);
+    }
+
+    @Override
+    public void visit(EPlaceholder expression) {
+        expression.expression.accept(this);
+    }
+
+    @Override
+    public void visit(ERealLiteral expression) {
+        if(expression.constraint != null)
+            expression.constraint.accept(this);
+    }
+
+    @Override
+    public void visit(ERuleset expression) {
+        for(DatalogRule rule : expression.rules)
+            visit(rule);
+        expression.in.accept(this);
+    }
+
+    public void visit(DatalogRule rule) {
+        for(Expression parameter : rule.headParameters)
+            parameter.accept(this);
+        rule.body.accept(this);
+    }
+
+    @Override
+    public void visit(ESelect expression) {
+        expression.query.accept(this);
+        expression.expression.accept(this);
+    }
+    
+    @Override
+    public void visit(ECHRSelect expression) {
+        visit(expression.query);
+        expression.expression.accept(this);
+    }
+
+    @Override
+    public void visit(ESimpleLambda expression) {
+        expression.value.accept(this);
+    }
+
+    @Override
+    public void visit(ESimpleLet expression) {
+        expression.value.accept(this);
+        expression.in.accept(this);
+    }
+
+    @Override
+    public void visit(ETransformation expression) {
+        expression.seed.accept(this);
+    }
+    
+    @Override
+    public void visit(ETypeAnnotation expression) {
+        expression.value.accept(this);
+    }
+
+    @Override
+    public void visit(EVar expression) {
+    }
+
+    @Override
+    public void visit(EVariable expression) {
+    }
+
+    @Override
+    public void visit(EWhen expression) {
+        expression.query.accept(this);
+        expression.action.accept(this);
+    }
+
+    @Override
+    public void visit(GuardedExpressionGroup expression) {
+        for(GuardedExpression gexp : expression.expressions) {
+            for(Expression guard : gexp.guards)
+                guard.accept(this);
+            gexp.value.accept(this);
+        }
+    }
+
+    @Override
+    public void visit(QAlternative query) {
+        for(Query q : query.queries)
+            q.accept(this);
+    }
+
+    @Override
+    public void visit(QAtom query) {
+        for(Expression parameter : query.parameters)
+            parameter.accept(this);
+    }
+    
+    @Override
+    public void visit(QMapping query) {
+        for(Expression parameter : query.parameters)
+            parameter.accept(this);
+    }
+
+    @Override
+    public void visit(QConjunction query) {
+        for(Query q : query.queries)
+            q.accept(this);
+    }
+
+    @Override
+    public void visit(QDisjunction query) {
+        for(Query q : query.queries)
+            q.accept(this);
+    }
+
+    @Override
+    public void visit(QExists query) {
+        query.query.accept(this);
+    }
+
+    @Override
+    public void visit(QNegation query) {
+        query.query.accept(this);
+    }
+
+    @Override
+    public void visit(ExpressionAccessor accessor) {
+        accessor.fieldName.accept(this);
+    }
+
+    @Override
+    public void visit(IdAccessor accessor) {
+    }
+
+    @Override
+    public void visit(StringAccessor accessor) {
+    }
+
+    @Override
+    public void visit(ListAssignment qualifier) {
+        qualifier.pattern.accept(this);
+        qualifier.value.accept(this);
+    }
+
+    @Override
+    public void visit(ListGenerator qualifier) {
+        qualifier.pattern.accept(this);
+        qualifier.value.accept(this);
+    }
+
+    @Override
+    public void visit(ListGuard qualifier) {
+        qualifier.condition.accept(this);
+    }
+
+    @Override
+    public void visit(ListSeq qualifier) {
+        qualifier.a.accept(this);
+        qualifier.b.accept(this);
+    }
+
+    @Override
+    public void visit(ListThen qualifier) {
+        qualifier.left.accept(this);
+        qualifier.transformer.accept(this);
+        if(qualifier.by != null)
+            qualifier.by.accept(this);
+    }
+
+    @Override
+    public void visit(QIf query) {
+        query.condition.accept(this);
+        query.thenQuery.accept(this);
+        query.elseQuery.accept(this);
+    }
+
+    @Override
+    public void visit(ECoveringBranchPoint expression) {
+        expression.expression.accept(this);
+    }
+
+    @Override
+    public void visit(EqBasic equation) {
+        equation.left.accept(this);
+        equation.right.accept(this);
+    }
+
+    @Override
+    public void visit(EqGuard equation) {
+        equation.guard.accept(this);
+    }
+
+    @Override
+    public void visit(EEquations expression) {
+        for(Equation equation : expression.equations)
+            equation.accept(this);
+    }
+    
+    public void visit(CHRLiteral literal) {
+        for(Expression parameter : literal.parameters)
+            parameter.accept(this);
+    }
+    
+    public void visit(CHRQuery query) {
+        for(CHRLiteral literal : query.literals)
+            visit(literal);
+    }
+    
+    public void visit(CHRRule rule) {
+        visit(rule.head);
+        visit(rule.body);
+    }
+    
+    public void visit(CHRRuleset ruleset) {
+        for(CHRRule rule : ruleset.rules)
+            visit(rule);
+        for(IncludeStatement include : ruleset.includes)
+            include.value.accept(this);
+    }
+
+    @Override
+    public void visit(ECHRRuleset expression) {
+        visit(expression.ruleset);
+        expression.in.accept(this);
+    }
+    
+    @Override
+    public void visit(ECHRRulesetConstructor expression) {
+        visit(expression.ruleset);
+    }
+
+    @Override
+    public void visit(EBinary expression) {
+        expression.left.accept(this);
+        for(EBinaryRightSide right : expression.rights)
+            right.right.accept(this);
+    }
+
+    @Override
+    public void visit(EBlock expression) {
+        for(Statement stat : expression.statements)
+            stat.accept(this);
+    }
+
+    @Override
+    public void visit(EPreLet expression) {
+        for(LetStatement stat : expression.assignments) {
+            stat.pattern.accept(this);
+            stat.value.accept(this);
+        }
+        expression.in.accept(this);
+    }
+
+    @Override
+    public void visit(ERange expression) {
+        expression.from.accept(this);
+        expression.to.accept(this);
+    }
+
+    @Override
+    public void visit(ERecord expression) {
+        for(FieldAssignment assignment : expression.fields)
+            assignment.value.accept(this);
+        
+    }
+
+    @Override
+    public void visit(EStringLiteral expression) {
+        for(Expression exp : expression.expressions)
+            exp.accept(this);
+    }
+
+    @Override
+    public void visit(BindStatement statement) {
+        statement.pattern.accept(this);
+        statement.value.accept(this);
+    }
+
+    @Override
+    public void visit(GuardStatement statement) {
+        statement.value.accept(this);
+    }
+
+    @Override
+    public void visit(LetStatement statement) {
+        statement.value.accept(this);
+    }
+
+    @Override
+    public void visit(RuleStatement statement) {
+        statement.head.accept(this);
+        statement.body.accept(this);
+    }
+
+    @Override
+    public void visit(IncludeStatement statement) {
+        statement.value.accept(this);
+    }
+    
+    @Override
+    public void visit(CHRStatement statement) {
+        statement.body.accept(this);
+        statement.head.accept(this);
+    }
+
+    @Override
+    public void visit(CHRAstAtom query) {
+        query.expression.accept(this);
+    }
+
+    @Override
+    public void visit(CHRAstBinds query) {
+        query.left.accept(this);
+        query.right.accept(this);
+    }
+
+    @Override
+    public void visit(CHRAstConjunction query) {
+        for(CHRAstQuery conjunct : query.conjuncts)
+            conjunct.accept(this);
+    }
+
+    @Override
+    public void visit(CHRAstEquals query) {
+        query.left.accept(this);
+        query.right.accept(this);
+    }
+
+    @Override
+    public void visit(CHRAstNegation query) {
+        query.subquery.accept(this);
+    }
+
+    @Override
+    public void visit(EAmbiguous expression) {
+        if(expression.resolvedExpression != null)
+            expression.resolvedExpression.accept(this);
+    }
+}