1 package org.simantics.scl.compiler.elaboration.expressions.visitors;
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;
14 import gnu.trove.set.hash.THashSet;
16 public class CollectEffectsVisitor extends StandardExpressionVisitor {
17 public final THashSet<Type> effects = new THashSet<Type>();
20 public void visit(EApply expression) {
21 effects.add(expression.effect);
22 super.visit(expression);
26 public void visit(CHRRule rule) {
27 for(CHRLiteral literal : rule.head.literals) {
29 literal.relation.collectQueryEffects(effects);
31 for(CHRLiteral literal : rule.body.literals) {
33 literal.relation.collectEnforceEffects(effects);
38 public void visit(ECHRSelect expression) {
39 for(CHRLiteral literal : expression.query.literals) {
41 literal.relation.collectQueryEffects(effects);
43 expression.expression.accept(this);
47 public void visit(EFieldAccess expression) {
49 effects.add(Types.READ_GRAPH);
50 super.visit(expression);
54 public void visit(ETransformation expression) {
56 effects.add(Types.PROC);
57 super.visit(expression);
61 public void visit(ELambda expression) {
65 public void visit(ESimpleLambda expression) {
68 public Type getCombinedEffect() {
69 return Types.union(effects.toArray(new Type[effects.size()]));