X-Git-Url: https://gerrit.simantics.org/r/gitweb?a=blobdiff_plain;f=bundles%2Forg.simantics.scl.compiler%2Fsrc%2Forg%2Fsimantics%2Fscl%2Fcompiler%2Felaboration%2Fexpressions%2Fvisitors%2FCollectRefsVisitor.java;fp=bundles%2Forg.simantics.scl.compiler%2Fsrc%2Forg%2Fsimantics%2Fscl%2Fcompiler%2Felaboration%2Fexpressions%2Fvisitors%2FCollectRefsVisitor.java;h=366dc514bb690fde4fdd83d2311eb762b8f9048c;hb=a9f88c57e622d9ecf2732bd0278e0989dc0dfd5a;hp=0000000000000000000000000000000000000000;hpb=2f63e7a58e49a233b28c6968b848281060117c43;p=simantics%2Fplatform.git 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 index 000000000..366dc514b --- /dev/null +++ b/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/elaboration/expressions/visitors/CollectRefsVisitor.java @@ -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 allRefs; + private final TIntHashSet refs; + + public CollectRefsVisitor(TObjectIntHashMap 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); + } + } +}