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); } } }