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