package org.jruby.ast.visitor;

import java.util.HashSet;
import java.util.List;
import java.util.Set;

import org.jruby.RubySymbol;
import org.jruby.ast.ClassNode;
import org.jruby.ast.InstAsgnNode;
import org.jruby.ast.InstVarNode;
import org.jruby.ast.ModuleNode;
import org.jruby.ast.Node;
import org.jruby.ast.PostExeNode;
import org.jruby.ast.PreExeNode;

Visitor to search AST nodes for instance variables. Certain nodes are ignored during walking since they always create a new context with a new self. Example usage: Node node = getNodeFromSomewhere(); InstanceVariableFinder finder = new InstanceVariableFinder(); node.accept(finder); System.out.println("found: " + finder.getFoundVariables);
/** * Visitor to search AST nodes for instance variables. Certain nodes are * ignored during walking since they always create a new context with a new * self. * * Example usage: * * <code> * Node node = getNodeFromSomewhere(); * InstanceVariableFinder finder = new InstanceVariableFinder(); * node.accept(finder); * System.out.println("found: " + finder.getFoundVariables); * </code> */
public class InstanceVariableFinder extends AbstractNodeVisitor<Void> { @Override protected Void defaultVisit(Node iVisited) { visitChildren(iVisited); return null; }
The set of instance variables found during walking.
/** The set of instance variables found during walking. */
private final Set<RubySymbol> foundVariables = new HashSet<>();
Walk a node and its children looking for instance variables using a new InstanceVariableFinder. Return an array of the variable names found.
Params:
  • node – the node to walk
Returns:an array of instance variable names found
/** * Walk a node and its children looking for instance variables using a new * InstanceVariableFinder. Return an array of the variable names found. * * @param node the node to walk * @return an array of instance variable names found */
public static Set<RubySymbol> findVariables(Node node) { InstanceVariableFinder ivf = new InstanceVariableFinder(); node.accept(ivf); return ivf.getFoundVariables(); }
Return the Set of all instance variables found during walking.
Returns:a Set of all instance variable names found
/** * Return the Set of all instance variables found during walking. * * @return a Set of all instance variable names found */
public Set<RubySymbol> getFoundVariables() { return foundVariables; }
ClassNode creates a new scope and self, so do not search for ivars.
Returns:null
/** * ClassNode creates a new scope and self, so do not search for ivars. * * @return null */
@Override public Void visitClassNode(ClassNode iVisited) { return null; }
Add the name of the instance variable being assigned to our set of instance variable names and continue to walk child nodes.
Returns:null
/** * Add the name of the instance variable being assigned to our set of * instance variable names and continue to walk child nodes. * * @return null */
@Override public Void visitInstAsgnNode(InstAsgnNode iVisited) { foundVariables.add(iVisited.getName()); List<Node> nodes = iVisited.childNodes(); for (int i = 0; i < nodes.size(); i++) { Node node = nodes.get(i); node.accept(this); } return null; }
Add the name of the instance variable being retrieved to our set of instance variable names and continue to walk child nodes.
Returns:null
/** * Add the name of the instance variable being retrieved to our set of * instance variable names and continue to walk child nodes. * * @return null */
@Override public Void visitInstVarNode(InstVarNode iVisited) { foundVariables.add(iVisited.getName()); List<Node> nodes = iVisited.childNodes(); for (int i = 0; i < nodes.size(); i++) { Node node = nodes.get(i); } return null; }
ModuleNode creates a new scope and self, so do not search for ivars.
Returns:null
/** * ModuleNode creates a new scope and self, so do not search for ivars. * * @return null */
@Override public Void visitModuleNode(ModuleNode iVisited) { return null; }
PreExeNode can't appear in methods, so do not search for ivars.
Returns:null
/** * PreExeNode can't appear in methods, so do not search for ivars. * * @return null */
@Override public Void visitPreExeNode(PreExeNode iVisited) { return null; }
PostExeNode can't appear in methods, so do not search for ivars.
Returns:null
/** * PostExeNode can't appear in methods, so do not search for ivars. * * @return null */
@Override public Void visitPostExeNode(PostExeNode iVisited) { return null; } }