]> gerrit.simantics Code Review - simantics/platform.git/blobdiff - bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/elaboration/expressions/StandardExpressionTransformer.java
(refs #7322) Implemented visitors for CHRStatement
[simantics/platform.git] / bundles / org.simantics.scl.compiler / src / org / simantics / scl / compiler / elaboration / expressions / StandardExpressionTransformer.java
index 17f13889d9471098c9a14e48a60cc14adc654055..1bd0d22c4ec4b7f4a075f0375da97a53075714c0 100644 (file)
@@ -1,13 +1,17 @@
 package org.simantics.scl.compiler.elaboration.expressions;
 
+import org.simantics.scl.compiler.elaboration.chr.CHRLiteral;
+import org.simantics.scl.compiler.elaboration.chr.CHRRule;
+import org.simantics.scl.compiler.elaboration.chr.CHRRuleset;
 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;
@@ -38,6 +42,11 @@ public class StandardExpressionTransformer implements
 ExpressionTransformer, QueryTransformer, ListQualifierTransformer, StatementVisitor,
 EquationVisitor {
 
+    @Override
+    public Expression transform(EAmbiguous expression) {
+        return expression;
+    }
+
     @Override
     public Expression transform(EApply expression) {
         expression.function = expression.function.accept(this);
@@ -74,6 +83,13 @@ EquationVisitor {
         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)
@@ -105,21 +121,42 @@ EquationVisitor {
     }
 
     @Override
-    public Expression transform(EConstant expression) {
+    public void visit(IncludeStatement statement) {
+        statement.value = statement.value.accept(this);
+    }
+    
+    public void transform(CHRRuleset ruleset) {
+        for(CHRRule rule : ruleset.rules) {
+            for(CHRLiteral lit : rule.head.literals)
+                for(int i=0;i<lit.parameters.length;++i)
+                    lit.parameters[i] = lit.parameters[i].accept(this);
+            for(CHRLiteral lit : rule.body.literals)
+                for(int i=0;i<lit.parameters.length;++i)
+                    lit.parameters[i] = lit.parameters[i].accept(this);
+        }
+    }
+    
+    @Override
+    public Expression transform(ECHRRuleset expression) {
+        expression.in = expression.in.accept(this);
+        transform(expression.ruleset);
+        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;
     }
 
@@ -136,11 +173,10 @@ EquationVisitor {
     @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;
     }
 
@@ -153,7 +189,8 @@ EquationVisitor {
     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;
     }
 
@@ -481,4 +518,12 @@ EquationVisitor {
         equation.guard =  equation.guard.accept(this);
     }
 
+    @Override
+    public void visit(CHRStatement statement) {
+        for(int i=0;i<statement.body.length;++i)
+            statement.body[i] = statement.body[i].accept(this);
+        for(int i=0;i<statement.head.length;++i)
+            statement.head[i] = statement.head[i].accept(this);
+    }
+
 }