public boolean apply(ASTNode node) { // stops when found - that's the reason to use ApplyAll if (exists) return false; if (node.getType() == ASTNode.CLASS_DECLARATION || node.getType() == ASTNode.FUNCTION_DECLARATION) { isGlobalScope = false; node.childrenAccept(this); isGlobalScope = true; return false; } else if (node instanceof Identifier) { Identifier identifier = (Identifier) node; if (identifier.getParent().getType() == ASTNode.VARIABLE) { Variable variable = (Variable) identifier.getParent(); if (variable.isDollared() && isGlobalScope && name.equals(identifier.getName())) { exists = true; } } } else if (node.getType() == ASTNode.GLOBAL_STATEMENT) { GlobalStatement globalStatement = (GlobalStatement) node; final List<Variable> variables = globalStatement.variables(); for (final Variable variable : variables) { final Expression variableName = variable.getName(); if (variable.isDollared() && variableName instanceof Identifier) { Identifier identifier = (Identifier) variableName; if (name.equals(identifier.getName())) { exists = true; } } } } return true; }