]> gerrit.simantics Code Review - simantics/platform.git/blobdiff - bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/elaboration/expressions/Expression.java
(refs #7375) Replaced collectVars method by a visitor
[simantics/platform.git] / bundles / org.simantics.scl.compiler / src / org / simantics / scl / compiler / elaboration / expressions / Expression.java
index 507d335e3479379ce7cd4ae1a66e196493e5c920..427acbd19b9dbbdd082df33f7c8ca97b0792d3ed 100644 (file)
@@ -1,6 +1,7 @@
 package org.simantics.scl.compiler.elaboration.expressions;
 
 import java.util.ArrayList;
+import java.util.Set;
 
 import org.simantics.scl.compiler.common.exceptions.InternalCompilerError;
 import org.simantics.scl.compiler.common.precedence.Precedence;
@@ -15,8 +16,11 @@ import org.simantics.scl.compiler.elaboration.expressions.lhstype.LhsType;
 import org.simantics.scl.compiler.elaboration.expressions.lhstype.PatternMatchingLhs;
 import org.simantics.scl.compiler.elaboration.expressions.printing.ExpressionToStringVisitor;
 import org.simantics.scl.compiler.elaboration.expressions.visitors.CollectEffectsVisitor;
+import org.simantics.scl.compiler.elaboration.expressions.visitors.CollectFreeVariablesVisitor;
 import org.simantics.scl.compiler.elaboration.expressions.visitors.CollectRefsVisitor;
+import org.simantics.scl.compiler.elaboration.expressions.visitors.CollectVarsVisitor;
 import org.simantics.scl.compiler.elaboration.expressions.visitors.ForVariablesUsesVisitor;
+import org.simantics.scl.compiler.elaboration.expressions.visitors.StandardExpressionVisitor;
 import org.simantics.scl.compiler.elaboration.query.QAtom;
 import org.simantics.scl.compiler.elaboration.relations.SCLRelation;
 import org.simantics.scl.compiler.internal.codegen.references.IVal;
@@ -36,7 +40,6 @@ import org.simantics.scl.compiler.types.kinds.Kinds;
 import org.simantics.scl.compiler.types.util.Typed;
 
 import gnu.trove.map.hash.TObjectIntHashMap;
-import gnu.trove.set.hash.THashSet;
 import gnu.trove.set.hash.TIntHashSet;
 
 public abstract class Expression extends Symbol implements Typed {
@@ -161,7 +164,9 @@ public abstract class Expression extends Symbol implements Typed {
         accept(new CollectRefsVisitor(allRefs, refs));
     }
 
-    public abstract void collectVars(TObjectIntHashMap<Variable> allVars, TIntHashSet vars);
+    public final void collectVars(TObjectIntHashMap<Variable> allVars, TIntHashSet vars) {
+        accept(new CollectVarsVisitor(allVars, vars));
+    }
 
     public final void forVariableUses(VariableProcedure procedure) {
         accept(new ForVariablesUsesVisitor(procedure));
@@ -212,8 +217,6 @@ public abstract class Expression extends Symbol implements Typed {
         return new ELambdaType(vars, this);
        }
     
-    public abstract void collectFreeVariables(THashSet<Variable> vars);
-    
     public Expression simplify(SimplificationContext context) {
         System.out.println("#############################");
         System.out.println(this);
@@ -246,10 +249,6 @@ public abstract class Expression extends Symbol implements Typed {
         context.getErrorLog().log(location, "Pattern was expected here.");
         return new EError();
     }
-
-    public void removeFreeVariables(THashSet<Variable> vars) {
-        throw new InternalCompilerError(getClass().getSimpleName() + " is not a pattern.");
-    }
     
     public Expression checkTypeAsPattern(TypingContext context, Type requiredType) {
         if(context.isInPattern())
@@ -263,10 +262,10 @@ public abstract class Expression extends Symbol implements Typed {
     /**
      * Used during simplification and in toIExpression
      */
-    public THashSet<Variable> getFreeVariables() {
-        THashSet<Variable> result = new THashSet<Variable>();
-        collectFreeVariables(result);
-        return result;
+    public Set<Variable> getFreeVariables() {
+        CollectFreeVariablesVisitor visitor = new CollectFreeVariablesVisitor(); 
+        accept(visitor);
+        return visitor.getFreeVariables();
     }
 
     public static Expression[] concat(Expression[] a, Expression[] b) {