EVOLUTION-NINJA
Edit File: SimpleNodeFinder.php
<?php declare (strict_types=1); namespace RectorPrefix20211231\Symplify\Astral\NodeFinder; use PhpParser\Node; use PhpParser\NodeFinder; use RectorPrefix20211231\Symplify\Astral\ValueObject\AttributeKey; use RectorPrefix20211231\Symplify\PackageBuilder\Php\TypeChecker; final class SimpleNodeFinder { /** * @var \Symplify\PackageBuilder\Php\TypeChecker */ private $typeChecker; /** * @var \PhpParser\NodeFinder */ private $nodeFinder; public function __construct(\RectorPrefix20211231\Symplify\PackageBuilder\Php\TypeChecker $typeChecker, \PhpParser\NodeFinder $nodeFinder) { $this->typeChecker = $typeChecker; $this->nodeFinder = $nodeFinder; } /** * @template T of Node * @param class-string<T> $nodeClass * @return \PhpParser\Node|null */ public function findFirstByType(\PhpParser\Node $node, string $nodeClass) { return $this->nodeFinder->findFirstInstanceOf($node, $nodeClass); } /** * @template T of Node * @param class-string<T> $nodeClass * @return T[] */ public function findByType(\PhpParser\Node $node, string $nodeClass) : array { return $this->nodeFinder->findInstanceOf($node, $nodeClass); } /** * @template T of Node * @param array<class-string<T>> $nodeClasses */ public function hasByTypes(\PhpParser\Node $node, array $nodeClasses) : bool { foreach ($nodeClasses as $nodeClass) { $foundNodes = $this->findByType($node, $nodeClass); if ($foundNodes !== []) { return \true; } } return \false; } /** * @see https://phpstan.org/blog/generics-in-php-using-phpdocs for template * * @template T of Node * @param class-string<T> $nodeClass * @return T|null */ public function findFirstParentByType(\PhpParser\Node $node, string $nodeClass) : ?\PhpParser\Node { $node = $node->getAttribute(\RectorPrefix20211231\Symplify\Astral\ValueObject\AttributeKey::PARENT); while ($node) { if (\is_a($node, $nodeClass, \true)) { return $node; } $node = $node->getAttribute(\RectorPrefix20211231\Symplify\Astral\ValueObject\AttributeKey::PARENT); } return null; } /** * @template T of Node * @param array<class-string<T>&class-string<Node>> $nodeTypes * @return T|null */ public function findFirstParentByTypes(\PhpParser\Node $node, array $nodeTypes) : ?\PhpParser\Node { $node = $node->getAttribute(\RectorPrefix20211231\Symplify\Astral\ValueObject\AttributeKey::PARENT); while ($node) { if ($this->typeChecker->isInstanceOf($node, $nodeTypes)) { return $node; } $node = $node->getAttribute(\RectorPrefix20211231\Symplify\Astral\ValueObject\AttributeKey::PARENT); } return null; } }