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.accessor.ExpressionAccessor;
-import org.simantics.scl.compiler.elaboration.expressions.accessor.FieldAccessor;
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;
public class StandardExpressionTransformer implements
ExpressionTransformer, QueryTransformer, ListQualifierTransformer, StatementVisitor,
-EquationVisitor {
+EquationVisitor, CHRAstQueryVisitor {
@Override
public Expression transform(EAmbiguous expression) {
+ if(expression.resolvedExpression != null)
+ expression.resolvedExpression = expression.resolvedExpression.accept(this);
return expression;
}
return expression;
}
+ @Override
+ public Expression transform(EViewPattern expression) {
+ expression.expression = expression.expression.accept(this);
+ expression.pattern = expression.pattern.accept(this);
+ return expression;
+ }
+
@Override
public Expression transform(EBlock expression) {
for(Statement statement : expression.statements)
}
@Override
- public Expression transform(EConstant expression) {
+ public void visit(IncludeStatement statement) {
+ statement.value = statement.value.accept(this);
+ }
+
+ public void transform(CHRQuery query) {
+ for(CHRLiteral lit : query.literals)
+ for(int i=0;i<lit.parameters.length;++i)
+ lit.parameters[i] = lit.parameters[i].accept(this);
+ }
+
+ public void transform(CHRRuleset ruleset) {
+ for(CHRRule rule : ruleset.rules) {
+ transform(rule.head);
+ transform(rule.body);
+ }
+ }
+
+ @Override
+ public Expression transform(ECHRRuleset expression) {
+ expression.in = expression.in.accept(this);
+ transform(expression.ruleset);
+ return expression;
+ }
+
+ @Override
+ public Expression transform(ECHRSelect expression) {
+ expression.expression = expression.expression.accept(this);
+ transform(expression.query);
+ return expression;
+ }
+
+ @Override
+ public Expression transform(ECHRRulesetConstructor expression) {
+ transform(expression.ruleset);
return expression;
}
@Override
- public Expression transform(EEnforce expression) {
- expression.query = expression.query.accept(this);
+ public Expression transform(EConstant expression) {
return expression;
}
@Override
- public Expression transform(EEntityTypeAnnotation expression) {
- expression.expression = expression.expression.accept(this);
- if(expression.query != null)
- expression.query = expression.query.accept(this);
+ public Expression transform(EEnforce expression) {
+ expression.query = expression.query.accept(this);
return expression;
}
@Override
public Expression transform(EFieldAccess expression) {
expression.parent = expression.parent.accept(this);
- for(FieldAccessor accessor : expression.accessors)
- if(accessor instanceof ExpressionAccessor) {
- ExpressionAccessor expAcc = (ExpressionAccessor)accessor;
- expAcc.fieldName = expAcc.fieldName.accept(this);
- }
+ if(expression.accessor instanceof ExpressionAccessor) {
+ ExpressionAccessor expAcc = (ExpressionAccessor)expression.accessor;
+ expAcc.fieldName = expAcc.fieldName.accept(this);
+ }
return expression;
}
public Expression transform(EIf expression) {
expression.condition = expression.condition.accept(this);
expression.then_ = expression.then_.accept(this);
- expression.else_ = expression.else_.accept(this);
+ if(expression.else_ != null)
+ expression.else_ = expression.else_.accept(this);
return expression;
}
equation.guard = equation.guard.accept(this);
}
+ @Override
+ public void visit(CHRStatement statement) {
+ statement.head.accept(this);
+ statement.body.accept(this);
+ }
+
+ @Override
+ public void visit(CHRAstAtom query) {
+ query.expression = query.expression.accept(this);
+ }
+
+ @Override
+ public void visit(CHRAstBinds query) {
+ query.left = query.left.accept(this);
+ query.right = 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 = query.left.accept(this);
+ query.right = query.right.accept(this);
+ }
+
+ @Override
+ public void visit(CHRAstNegation query) {
+ query.subquery.accept(this);
+ }
+
}