mirror of
https://github.com/Combodo/iTop.git
synced 2026-02-27 06:04:12 +01:00
We were on v3 that is no longer maintained and compatibility is annonced for PHP 7.2. v4 is active and supports PHP up to 8.0 No problem to update as this is only used in the config editor (\Combodo\iTop\Config\Validator\iTopConfigAstValidator)
82 lines
2.4 KiB
PHP
82 lines
2.4 KiB
PHP
<?php declare(strict_types=1);
|
|
|
|
namespace PhpParser;
|
|
|
|
use PhpParser\NodeVisitor\FindingVisitor;
|
|
use PhpParser\NodeVisitor\FirstFindingVisitor;
|
|
|
|
class NodeFinder
|
|
{
|
|
/**
|
|
* Find all nodes satisfying a filter callback.
|
|
*
|
|
* @param Node|Node[] $nodes Single node or array of nodes to search in
|
|
* @param callable $filter Filter callback: function(Node $node) : bool
|
|
*
|
|
* @return Node[] Found nodes satisfying the filter callback
|
|
*/
|
|
public function find($nodes, callable $filter) : array {
|
|
if (!is_array($nodes)) {
|
|
$nodes = [$nodes];
|
|
}
|
|
|
|
$visitor = new FindingVisitor($filter);
|
|
|
|
$traverser = new NodeTraverser;
|
|
$traverser->addVisitor($visitor);
|
|
$traverser->traverse($nodes);
|
|
|
|
return $visitor->getFoundNodes();
|
|
}
|
|
|
|
/**
|
|
* Find all nodes that are instances of a certain class.
|
|
*
|
|
* @param Node|Node[] $nodes Single node or array of nodes to search in
|
|
* @param string $class Class name
|
|
*
|
|
* @return Node[] Found nodes (all instances of $class)
|
|
*/
|
|
public function findInstanceOf($nodes, string $class) : array {
|
|
return $this->find($nodes, function ($node) use ($class) {
|
|
return $node instanceof $class;
|
|
});
|
|
}
|
|
|
|
/**
|
|
* Find first node satisfying a filter callback.
|
|
*
|
|
* @param Node|Node[] $nodes Single node or array of nodes to search in
|
|
* @param callable $filter Filter callback: function(Node $node) : bool
|
|
*
|
|
* @return null|Node Found node (or null if none found)
|
|
*/
|
|
public function findFirst($nodes, callable $filter) {
|
|
if (!is_array($nodes)) {
|
|
$nodes = [$nodes];
|
|
}
|
|
|
|
$visitor = new FirstFindingVisitor($filter);
|
|
|
|
$traverser = new NodeTraverser;
|
|
$traverser->addVisitor($visitor);
|
|
$traverser->traverse($nodes);
|
|
|
|
return $visitor->getFoundNode();
|
|
}
|
|
|
|
/**
|
|
* Find first node that is an instance of a certain class.
|
|
*
|
|
* @param Node|Node[] $nodes Single node or array of nodes to search in
|
|
* @param string $class Class name
|
|
*
|
|
* @return null|Node Found node, which is an instance of $class (or null if none found)
|
|
*/
|
|
public function findFirstInstanceOf($nodes, string $class) {
|
|
return $this->findFirst($nodes, function ($node) use ($class) {
|
|
return $node instanceof $class;
|
|
});
|
|
}
|
|
}
|