Preview: FamilyRelationsAnalyzer.php
Size: 2.63 KB
/opt/cpanel/ea-wappspector/vendor/rector/rector/src/FamilyTree/Reflection/FamilyRelationsAnalyzer.php
<?php
declare (strict_types=1);
namespace Rector\FamilyTree\Reflection;
use PhpParser\Node\Name;
use PhpParser\Node\Stmt\Class_;
use PhpParser\Node\Stmt\Interface_;
use PHPStan\Reflection\ClassReflection;
use PHPStan\Reflection\ReflectionProvider;
use Rector\NodeNameResolver\NodeNameResolver;
final class FamilyRelationsAnalyzer
{
/**
* @readonly
* @var \PHPStan\Reflection\ReflectionProvider
*/
private $reflectionProvider;
/**
* @readonly
* @var \Rector\NodeNameResolver\NodeNameResolver
*/
private $nodeNameResolver;
public function __construct(ReflectionProvider $reflectionProvider, NodeNameResolver $nodeNameResolver)
{
$this->reflectionProvider = $reflectionProvider;
$this->nodeNameResolver = $nodeNameResolver;
}
/**
* @api
* @return string[]
* @param \PhpParser\Node\Stmt\Class_|\PhpParser\Node\Stmt\Interface_|\PhpParser\Node\Name $classOrName
*/
public function getClassLikeAncestorNames($classOrName) : array
{
$ancestorNames = [];
if ($classOrName instanceof Name) {
$fullName = $this->nodeNameResolver->getName($classOrName);
if (!$this->reflectionProvider->hasClass($fullName)) {
return [];
}
$classReflection = $this->reflectionProvider->getClass($fullName);
$ancestors = \array_merge($classReflection->getParents(), $classReflection->getInterfaces());
return \array_map(static function (ClassReflection $classReflection) : string {
return $classReflection->getName();
}, $ancestors);
}
if ($classOrName instanceof Interface_) {
foreach ($classOrName->extends as $extendInterfaceName) {
$ancestorNames[] = $this->nodeNameResolver->getName($extendInterfaceName);
$ancestorNames = \array_merge($ancestorNames, $this->getClassLikeAncestorNames($extendInterfaceName));
}
}
if ($classOrName instanceof Class_) {
if ($classOrName->extends instanceof Name) {
$ancestorNames[] = $this->nodeNameResolver->getName($classOrName->extends);
$ancestorNames = \array_merge($ancestorNames, $this->getClassLikeAncestorNames($classOrName->extends));
}
foreach ($classOrName->implements as $implement) {
$ancestorNames[] = $this->nodeNameResolver->getName($implement);
$ancestorNames = \array_merge($ancestorNames, $this->getClassLikeAncestorNames($implement));
}
}
/** @var string[] $ancestorNames */
return $ancestorNames;
}
}
Directory Contents
Dirs: 0 × Files: 1