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