package de.gaalop; import de.gaalop.dfg.*; import java.util.HashSet; import java.util.Set; /** * Keeps track of variables that are actually in use. This can be used to detect unused variables in order to remove them from the * graph. Used variables can be queried by {@link #getVariables()}. */ public class UsedVariablesVisitor implements ExpressionVisitor { private Set<Variable> variables = new HashSet<Variable>(); public Set<Variable> getVariables() { return variables; } private void visitBinaryOperation(BinaryOperation op) { op.getLeft().accept(this); op.getRight().accept(this); } @Override public void visit(Subtraction subtraction) { visitBinaryOperation(subtraction); } @Override public void visit(Addition addition) { visitBinaryOperation(addition); } @Override public void visit(Division division) { visitBinaryOperation(division); } @Override public void visit(InnerProduct innerProduct) { visitBinaryOperation(innerProduct); } @Override public void visit(Multiplication multiplication) { visitBinaryOperation(multiplication); } @Override public void visit(MathFunctionCall mathFunctionCall) { mathFunctionCall.getOperand().accept(this); } @Override public void visit(Variable variable) { variables.add(variable); } @Override public void visit(MultivectorComponent component) { variables.add(component); } @Override public void visit(Exponentiation exponentiation) { visitBinaryOperation(exponentiation); } @Override public void visit(FloatConstant floatConstant) { } @Override public void visit(OuterProduct outerProduct) { visitBinaryOperation(outerProduct); } @Override public void visit(BaseVector baseVector) { } @Override public void visit(Negation negation) { negation.getOperand().accept(this); } @Override public void visit(Reverse node) { node.getOperand().accept(this); } @Override public void visit(LogicalOr node) { visitBinaryOperation(node); } @Override public void visit(LogicalAnd node) { visitBinaryOperation(node); } @Override public void visit(LogicalNegation node) { node.getOperand().accept(this); } @Override public void visit(Equality node) { visitBinaryOperation(node); } @Override public void visit(Inequality node) { visitBinaryOperation(node); } @Override public void visit(Relation relation) { visitBinaryOperation(relation); } @Override public void visit(FunctionArgument node) { } @Override public void visit(MacroCall node) { for (Expression arg : node.getArguments()) { arg.accept(this); } } }