| Current Path : /home/rtorresani/www/vendor/rector/rector/vendor/rector/rector-symfony/src/ |
| Current File : //home/rtorresani/www/vendor/rector/rector/vendor/rector/rector-symfony/src/BundleClassResolver.php |
<?php
declare (strict_types=1);
namespace Rector\Symfony;
use PhpParser\Node;
use PhpParser\Node\Stmt\ClassLike;
use PhpParser\NodeTraverser;
use PhpParser\NodeVisitor\NameResolver;
use PHPStan\Reflection\ReflectionProvider;
use Rector\Core\PhpParser\Node\BetterNodeFinder;
use Rector\Core\PhpParser\Parser\RectorParser;
use Rector\NodeNameResolver\NodeNameResolver;
final class BundleClassResolver
{
/**
* @readonly
* @var \Rector\Core\PhpParser\Node\BetterNodeFinder
*/
private $betterNodeFinder;
/**
* @readonly
* @var \Rector\NodeNameResolver\NodeNameResolver
*/
private $nodeNameResolver;
/**
* @readonly
* @var \Rector\Core\PhpParser\Parser\RectorParser
*/
private $rectorParser;
/**
* @readonly
* @var \PHPStan\Reflection\ReflectionProvider
*/
private $reflectionProvider;
public function __construct(BetterNodeFinder $betterNodeFinder, NodeNameResolver $nodeNameResolver, RectorParser $rectorParser, ReflectionProvider $reflectionProvider)
{
$this->betterNodeFinder = $betterNodeFinder;
$this->nodeNameResolver = $nodeNameResolver;
$this->rectorParser = $rectorParser;
$this->reflectionProvider = $reflectionProvider;
}
public function resolveShortBundleClassFromControllerClass(string $class) : ?string
{
$classReflection = $this->reflectionProvider->getClass($class);
// resolve bundle from existing ones
$fileName = $classReflection->getFileName();
if ($fileName === null) {
return null;
}
$controllerDirectory = \dirname($fileName);
$rootFolder = \getenv('SystemDrive', \true) . \DIRECTORY_SEPARATOR;
// traverse up, un-till first bundle class appears
$bundleFiles = [];
while ($bundleFiles === [] && $controllerDirectory !== $rootFolder) {
$bundleFiles = (array) \glob($controllerDirectory . '/**Bundle.php');
$controllerDirectory = \dirname($controllerDirectory);
}
/** @var string[] $bundleFiles */
if ($bundleFiles === []) {
return null;
}
$bundleFile = $bundleFiles[0];
$bundleClassName = $this->resolveClassNameFromFilePath($bundleFile);
if ($bundleClassName !== null) {
return $this->nodeNameResolver->getShortName($bundleClassName);
}
return null;
}
private function resolveClassNameFromFilePath(string $filePath) : ?string
{
$nodes = $this->rectorParser->parseFile($filePath);
$this->addFullyQualifiedNamesToNodes($nodes);
$classLike = $this->betterNodeFinder->findFirstNonAnonymousClass($nodes);
if (!$classLike instanceof ClassLike) {
return null;
}
return $this->nodeNameResolver->getName($classLike);
}
/**
* @param Node[] $nodes
*/
private function addFullyQualifiedNamesToNodes(array $nodes) : void
{
$nodeTraverser = new NodeTraverser();
$nameResolver = new NameResolver();
$nodeTraverser->addVisitor($nameResolver);
$nodeTraverser->traverse($nodes);
}
}