package org.simantics.scl.compiler.elaboration.expressions;
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.ERuleset.DatalogRule;
import org.simantics.scl.compiler.elaboration.expressions.accessor.ExpressionAccessor;
-import org.simantics.scl.compiler.elaboration.expressions.accessor.FieldAccessor;
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;
public class StandardExpressionVisitor implements
ExpressionVisitor, QueryVisitor, FieldAccessorVisitor, ListQualifierVisitor,
-EquationVisitor {
+EquationVisitor, StatementVisitor, CHRAstQueryVisitor {
@Override
public void visit(EApply expression) {
@Override
public void visit(EFieldAccess expression) {
expression.parent.accept(this);
- for(FieldAccessor accessor : expression.accessors)
- accessor.accept(this);
+ expression.accessor.accept(this);
}
@Override
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(EVar expression) {
+ }
+
@Override
public void visit(EVariable expression) {
}
for(Equation equation : expression.equations)
equation.accept(this);
}
+
+ public void visit(CHRQuery query) {
+ for(CHRLiteral literal : query.literals)
+ for(Expression parameter : literal.parameters)
+ parameter.accept(this);
+ }
+
+ public void visit(CHRRuleset ruleset) {
+ for(CHRRule rule : ruleset.rules) {
+ visit(rule.head);
+ visit(rule.body);
+ }
+ }
+
+ @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(ECHRRuleset ruleset) {
- for(CHRRule rule : ruleset.ruleset.rules) {
- for(CHRLiteral literal : rule.head.literals)
- for(Expression parameter : literal.parameters)
- parameter.accept(this);
- for(CHRLiteral literal : rule.body.literals)
- for(Expression parameter : literal.parameters)
- parameter.accept(this);
+ 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);
}
- ruleset.in.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);
+ }
}