]> gerrit.simantics Code Review - simantics/platform.git/blob - bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/elaboration/expressions/block/RuleStatement.java
New type class MonadE and corresponding monad syntax with edo keyword
[simantics/platform.git] / bundles / org.simantics.scl.compiler / src / org / simantics / scl / compiler / elaboration / expressions / block / RuleStatement.java
1 package org.simantics.scl.compiler.elaboration.expressions.block;
2
3 import org.simantics.scl.compiler.elaboration.contexts.EnvironmentalContext;
4 import org.simantics.scl.compiler.elaboration.contexts.ReplaceContext;
5 import org.simantics.scl.compiler.elaboration.contexts.TranslationContext;
6 import org.simantics.scl.compiler.elaboration.expressions.Expression;
7 import org.simantics.scl.compiler.elaboration.query.Query;
8 import org.simantics.scl.compiler.errors.Locations;
9
10 public class RuleStatement extends Statement {
11
12     public Expression head;
13     public Query body;
14
15     public RuleStatement(Expression head, Query body) {
16         this.head = head;
17         this.body = body;
18     }
19
20     @Override
21     public Expression toExpression(EnvironmentalContext context, BlockType blockType, Expression in) {
22         throw new UnsupportedOperationException();
23     }
24     
25     @Override
26     public void setLocationDeep(long loc) {
27         if(location == Locations.NO_LOCATION) {
28             location = loc;
29             head.setLocationDeep(loc);
30             body.setLocationDeep(loc);
31         }
32     }
33     
34     @Override
35     public void resolvePattern(TranslationContext context) {
36         head = head.resolveAsPattern(context);
37     }
38     
39     @Override
40     public boolean mayBeRecursive() {
41         return true;
42     }
43     
44     @Override
45     public Statement replace(ReplaceContext context) {
46         return new RuleStatement(head.replaceInPattern(context), body.replace(context));
47     }
48     
49     @Override
50     public void accept(StatementVisitor visitor) {
51         visitor.visit(this);
52     }
53
54     @Override
55     public StatementGroup getStatementGroup() {
56         return StatementGroup.Rule;
57     }
58 }