You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
50 lines
1.2 KiB
50 lines
1.2 KiB
<?php declare(strict_types=1); |
|
|
|
namespace PhpParser\NodeVisitor; |
|
|
|
use PhpParser\Node; |
|
use PhpParser\NodeTraverser; |
|
use PhpParser\NodeVisitorAbstract; |
|
|
|
/** |
|
* This visitor can be used to find the first node satisfying some criterion determined by |
|
* a filter callback. |
|
*/ |
|
class FirstFindingVisitor extends NodeVisitorAbstract |
|
{ |
|
/** @var callable Filter callback */ |
|
protected $filterCallback; |
|
/** @var null|Node Found node */ |
|
protected $foundNode; |
|
|
|
public function __construct(callable $filterCallback) { |
|
$this->filterCallback = $filterCallback; |
|
} |
|
|
|
/** |
|
* Get found node satisfying the filter callback. |
|
* |
|
* Returns null if no node satisfies the filter callback. |
|
* |
|
* @return null|Node Found node (or null if not found) |
|
*/ |
|
public function getFoundNode() { |
|
return $this->foundNode; |
|
} |
|
|
|
public function beforeTraverse(array $nodes) { |
|
$this->foundNode = null; |
|
|
|
return null; |
|
} |
|
|
|
public function enterNode(Node $node) { |
|
$filterCallback = $this->filterCallback; |
|
if ($filterCallback($node)) { |
|
$this->foundNode = $node; |
|
return NodeTraverser::STOP_TRAVERSAL; |
|
} |
|
|
|
return null; |
|
} |
|
}
|
|
|