+package org.simantics.scl.compiler.elaboration.expressions.visitors;
+
+import org.simantics.scl.compiler.elaboration.expressions.EApply;
+import org.simantics.scl.compiler.elaboration.expressions.ECHRRuleset;
+import org.simantics.scl.compiler.elaboration.expressions.ECHRSelect;
+import org.simantics.scl.compiler.elaboration.expressions.EFieldAccess;
+import org.simantics.scl.compiler.elaboration.expressions.ELambda;
+import org.simantics.scl.compiler.elaboration.expressions.ESimpleLambda;
+import org.simantics.scl.compiler.elaboration.expressions.ETransformation;
+import org.simantics.scl.compiler.elaboration.expressions.StandardExpressionVisitor;
+import org.simantics.scl.compiler.types.Type;
+import org.simantics.scl.compiler.types.Types;
+
+import gnu.trove.set.hash.THashSet;
+
+public class CollectEffectsVisitor extends StandardExpressionVisitor {
+ public final THashSet<Type> effects = new THashSet<Type>();
+
+ @Override
+ public void visit(EApply expression) {
+ effects.add(expression.effect);
+ super.visit(expression);
+ }
+
+ @Override
+ public void visit(ECHRRuleset expression) {
+ effects.add(Types.PROC);
+ super.visit(expression);
+ }
+
+ @Override
+ public void visit(ECHRSelect expression) {
+ effects.add(Types.PROC);
+ super.visit(expression);
+ }
+
+ @Override
+ public void visit(EFieldAccess expression) {
+ // FIXME
+ effects.add(Types.READ_GRAPH);
+ super.visit(expression);
+ }
+
+ @Override
+ public void visit(ETransformation expression) {
+ // FIXME
+ effects.add(Types.PROC);
+ super.visit(expression);
+ }
+
+ @Override
+ public void visit(ELambda expression) {
+ }
+
+ @Override
+ public void visit(ESimpleLambda expression) {
+ }
+
+ public Type getCombinedEffect() {
+ return Types.union(effects.toArray(new Type[effects.size()]));
+ }
+}