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