package net.iplantevin.ql.gui.main; import net.iplantevin.ql.ast.expressions.Expression; import net.iplantevin.ql.ast.expressions.Par; import net.iplantevin.ql.ast.expressions.literals.Bool; import net.iplantevin.ql.ast.expressions.literals.ID; import net.iplantevin.ql.ast.expressions.literals.Int; import net.iplantevin.ql.ast.expressions.literals.Str; import net.iplantevin.ql.ast.expressions.operators.Add; import net.iplantevin.ql.ast.expressions.operators.And; import net.iplantevin.ql.ast.expressions.operators.Binary; import net.iplantevin.ql.ast.expressions.operators.Div; import net.iplantevin.ql.ast.expressions.operators.EQ; import net.iplantevin.ql.ast.expressions.operators.GEQ; import net.iplantevin.ql.ast.expressions.operators.GT; import net.iplantevin.ql.ast.expressions.operators.LEQ; import net.iplantevin.ql.ast.expressions.operators.LT; import net.iplantevin.ql.ast.expressions.operators.Mul; import net.iplantevin.ql.ast.expressions.operators.NEQ; import net.iplantevin.ql.ast.expressions.operators.Neg; import net.iplantevin.ql.ast.expressions.operators.Not; import net.iplantevin.ql.ast.expressions.operators.Or; import net.iplantevin.ql.ast.expressions.operators.Pos; import net.iplantevin.ql.ast.expressions.operators.Sub; import net.iplantevin.ql.ast.expressions.operators.Unary; import net.iplantevin.ql.ast.visitors.IExpressionVisitor; import java.util.HashSet; import java.util.Set; /** * Visitor that gathers all identifiers in an expression and returns them as * a set. * * @author Ivan */ public class IdentifierGatherer implements IExpressionVisitor<Void> { private final Set<String> identifiers; /** * IdentifierGatherers are always constructed by a public static method. */ private IdentifierGatherer() { identifiers = new HashSet<String>(); } /** * Static method that returns a set with all identifiers (Strings) in the * given expression. * * @param expression the expression for which to get all contained identifiers. */ public static Set<String> gather(Expression expression) { IdentifierGatherer gatherer = new IdentifierGatherer(); expression.accept(gatherer); return gatherer.getIdentifiers(); } public Set<String> getIdentifiers() { return identifiers; } private void visitBinary(Binary expression) { expression.getLeftHS().accept(this); expression.getRightHS().accept(this); } private void visitUnary(Unary expression) { expression.getExpression().accept(this); } @Override public Void visit(Par par) { par.getExpression().accept(this); return null; } @Override public Void visit(Add add) { visitBinary(add); return null; } @Override public Void visit(And and) { visitBinary(and); return null; } @Override public Void visit(Div div) { visitBinary(div); return null; } @Override public Void visit(EQ eq) { visitBinary(eq); return null; } @Override public Void visit(GEQ geq) { visitBinary(geq); return null; } @Override public Void visit(GT gt) { visitBinary(gt); return null; } @Override public Void visit(LEQ leq) { visitBinary(leq); return null; } @Override public Void visit(LT lt) { visitBinary(lt); return null; } @Override public Void visit(Mul mul) { visitBinary(mul); return null; } @Override public Void visit(Neg neg) { visitUnary(neg); return null; } @Override public Void visit(NEQ neq) { visitBinary(neq); return null; } @Override public Void visit(Not not) { visitUnary(not); return null; } @Override public Void visit(Or or) { visitBinary(or); return null; } @Override public Void visit(Pos pos) { visitUnary(pos); return null; } @Override public Void visit(Sub sub) { visitBinary(sub); return null; } @Override public Void visit(Bool bool) { return null; } /** * String identifier is added upon visit of an ID. */ @Override public Void visit(ID id) { identifiers.add(id.getName()); return null; } @Override public Void visit(Int integer) { return null; } @Override public Void visit(Str str) { return null; } }