]> gerrit.simantics Code Review - simantics/platform.git/blobdiff - bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/elaboration/expressions/visitors/CollectRefsVisitor.java
(refs #7375) Replace collectRefs by CollectRefsVisitor
[simantics/platform.git] / bundles / org.simantics.scl.compiler / src / org / simantics / scl / compiler / elaboration / expressions / visitors / CollectRefsVisitor.java
diff --git a/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/elaboration/expressions/visitors/CollectRefsVisitor.java b/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/elaboration/expressions/visitors/CollectRefsVisitor.java
new file mode 100644 (file)
index 0000000..366dc51
--- /dev/null
@@ -0,0 +1,56 @@
+package org.simantics.scl.compiler.elaboration.expressions.visitors;
+
+import org.simantics.scl.compiler.elaboration.expressions.EConstant;
+import org.simantics.scl.compiler.elaboration.expressions.ETransformation;
+import org.simantics.scl.compiler.elaboration.expressions.StandardExpressionVisitor;
+import org.simantics.scl.compiler.elaboration.query.QAtom;
+import org.simantics.scl.compiler.elaboration.relations.CompositeRelation;
+import org.simantics.scl.compiler.elaboration.relations.SCLRelation;
+
+import gnu.trove.map.hash.TObjectIntHashMap;
+import gnu.trove.set.hash.TIntHashSet;
+
+public class CollectRefsVisitor extends StandardExpressionVisitor {
+    private final TObjectIntHashMap<Object> allRefs;
+    private final TIntHashSet refs;
+    
+    public CollectRefsVisitor(TObjectIntHashMap<Object> allRefs, TIntHashSet refs) {
+        this.allRefs = allRefs;
+        this.refs = refs;
+    }
+    
+    @Override
+    public void visit(ETransformation expression) {
+        {
+            int ref = allRefs.get(ETransformation.TRANSFORMATION_RULES_TYPECHECKED);
+            if(ref >= 0)
+                refs.add(ref);
+        }
+        super.visit(expression);
+    }
+    
+    @Override
+    public void visit(EConstant expression) {
+        int id = allRefs.get(expression.value);
+        if(id >= 0)
+            refs.add(id);
+    }
+    
+    @Override
+    public void visit(QAtom query) {
+        collectRelationRefs(query.relation);
+        super.visit(query);
+    }
+    
+    private void collectRelationRefs(SCLRelation relation) {
+        if(relation instanceof CompositeRelation) {
+            for(SCLRelation subrelation : ((CompositeRelation) relation).getSubrelations())
+                collectRelationRefs(subrelation);
+        }
+        else {
+            int id = allRefs.get(relation);
+            if(id >= 0)
+                refs.add(id);
+        }
+    }
+}