1: <?php declare(strict_types=1);
2:
3: namespace PhpParser\NodeVisitor;
4:
5: use PhpParser\Node;
6: use PhpParser\NodeVisitorAbstract;
7:
8: /**
9: * This visitor can be used to find and collect all nodes satisfying some criterion determined by
10: * a filter callback.
11: */
12: class FindingVisitor extends NodeVisitorAbstract
13: {
14: /** @var callable Filter callback */
15: protected $filterCallback;
16: /** @var Node[] Found nodes */
17: protected $foundNodes;
18:
19: public function __construct(callable $filterCallback) {
20: $this->filterCallback = $filterCallback;
21: }
22:
23: /**
24: * Get found nodes satisfying the filter callback.
25: *
26: * Nodes are returned in pre-order.
27: *
28: * @return Node[] Found nodes
29: */
30: public function getFoundNodes() : array {
31: return $this->foundNodes;
32: }
33:
34: public function beforeTraverse(array $nodes) {
35: $this->foundNodes = [];
36:
37: return null;
38: }
39:
40: public function enterNode(Node $node) {
41: $filterCallback = $this->filterCallback;
42: if ($filterCallback($node)) {
43: $this->foundNodes[] = $node;
44: }
45:
46: return null;
47: }
48: }
49: