]> gerrit.simantics Code Review - simantics/platform.git/blob - bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/elaboration/expressions/visitors/CollectEffectsVisitor.java
Fixed multiple issues causing dangling references to discarded queries
[simantics/platform.git] / bundles / org.simantics.scl.compiler / src / org / simantics / scl / compiler / elaboration / expressions / visitors / CollectEffectsVisitor.java
1 package org.simantics.scl.compiler.elaboration.expressions.visitors;
2
3 import org.simantics.scl.compiler.elaboration.chr.CHRLiteral;
4 import org.simantics.scl.compiler.elaboration.chr.CHRRule;
5 import org.simantics.scl.compiler.elaboration.expressions.EApply;
6 import org.simantics.scl.compiler.elaboration.expressions.ECHRSelect;
7 import org.simantics.scl.compiler.elaboration.expressions.EFieldAccess;
8 import org.simantics.scl.compiler.elaboration.expressions.ELambda;
9 import org.simantics.scl.compiler.elaboration.expressions.ESimpleLambda;
10 import org.simantics.scl.compiler.elaboration.expressions.ETransformation;
11 import org.simantics.scl.compiler.types.Type;
12 import org.simantics.scl.compiler.types.Types;
13
14 import gnu.trove.set.hash.THashSet;
15
16 public class CollectEffectsVisitor extends StandardExpressionVisitor {
17     public final THashSet<Type> effects = new THashSet<Type>();
18     
19     @Override
20     public void visit(EApply expression) {
21         effects.add(expression.effect);
22         super.visit(expression);
23     }
24     
25     @Override
26     public void visit(CHRRule rule) {
27         for(CHRLiteral literal : rule.head.literals) {
28             super.visit(literal);
29             literal.relation.collectQueryEffects(effects);
30         }
31         for(CHRLiteral literal : rule.body.literals) {
32             super.visit(literal);
33             literal.relation.collectEnforceEffects(effects);
34         }
35     }
36     
37     @Override
38     public void visit(ECHRSelect expression) {
39         for(CHRLiteral literal : expression.query.literals) {
40             super.visit(literal);
41             literal.relation.collectQueryEffects(effects);
42         }
43         expression.expression.accept(this);
44     }
45     
46     @Override
47     public void visit(EFieldAccess expression) {
48         // FIXME
49         effects.add(Types.READ_GRAPH);
50         super.visit(expression);
51     }
52     
53     @Override
54     public void visit(ETransformation expression) {
55         // FIXME
56         effects.add(Types.PROC);
57         super.visit(expression);
58     }
59     
60     @Override
61     public void visit(ELambda expression) {
62     }
63     
64     @Override
65     public void visit(ESimpleLambda expression) {
66     }
67     
68     public Type getCombinedEffect() {
69         return Types.union(effects.toArray(new Type[effects.size()]));
70     }
71 }