1 <?php declare(strict_types=1);
5 use PhpParser\NodeVisitor\FindingVisitor;
6 use PhpParser\NodeVisitor\FirstFindingVisitor;
11 * Find all nodes satisfying a filter callback.
13 * @param Node|Node[] $nodes Single node or array of nodes to search in
14 * @param callable $filter Filter callback: function(Node $node) : bool
16 * @return Node[] Found nodes satisfying the filter callback
18 public function find($nodes, callable $filter) : array {
19 if (!is_array($nodes)) {
23 $visitor = new FindingVisitor($filter);
25 $traverser = new NodeTraverser;
26 $traverser->addVisitor($visitor);
27 $traverser->traverse($nodes);
29 return $visitor->getFoundNodes();
33 * Find all nodes that are instances of a certain class.
35 * @param Node|Node[] $nodes Single node or array of nodes to search in
36 * @param string $class Class name
38 * @return Node[] Found nodes (all instances of $class)
40 public function findInstanceOf($nodes, string $class) : array {
41 return $this->find($nodes, function ($node) use ($class) {
42 return $node instanceof $class;
47 * Find first node satisfying a filter callback.
49 * @param Node|Node[] $nodes Single node or array of nodes to search in
50 * @param callable $filter Filter callback: function(Node $node) : bool
52 * @return null|Node Found node (or null if none found)
54 public function findFirst($nodes, callable $filter) {
55 if (!is_array($nodes)) {
59 $visitor = new FirstFindingVisitor($filter);
61 $traverser = new NodeTraverser;
62 $traverser->addVisitor($visitor);
63 $traverser->traverse($nodes);
65 return $visitor->getFoundNode();
69 * Find first node that is an instance of a certain class.
71 * @param Node|Node[] $nodes Single node or array of nodes to search in
72 * @param string $class Class name
74 * @return null|Node Found node, which is an instance of $class (or null if none found)
76 public function findFirstInstanceOf($nodes, string $class) {
77 return $this->findFirst($nodes, function ($node) use ($class) {
78 return $node instanceof $class;