Updated Rector to commit d320ac74b9bf2f19dae9405449f3253e546c318c

d320ac74b9 [PhpParser] Reduce AstResolver complexity by move check fileName is null to parseFileNameToDecoratedNodes() (#5138)
This commit is contained in:
Tomas Votruba 2023-10-07 10:20:38 +00:00
parent ba8a9c44c4
commit 738c193e65
5 changed files with 29 additions and 97 deletions

View File

@ -19,12 +19,12 @@ final class VersionResolver
* @api
* @var string
*/
public const PACKAGE_VERSION = 'b29a6f80c319c6819007a604cc20b788e3abe59c';
public const PACKAGE_VERSION = 'd320ac74b9bf2f19dae9405449f3253e546c318c';
/**
* @api
* @var string
*/
public const RELEASE_DATE = '2023-10-07 04:55:21';
public const RELEASE_DATE = '2023-10-07 12:16:42';
/**
* @var int
*/

View File

@ -26,6 +26,7 @@ use PHPStan\Reflection\MethodReflection;
use PHPStan\Reflection\Php\PhpPropertyReflection;
use PHPStan\Reflection\ReflectionProvider;
use PHPStan\Type\TypeWithClassName;
use Rector\Core\PhpParser\Node\BetterNodeFinder;
use Rector\Core\Reflection\MethodReflectionResolver;
use Rector\Core\ValueObject\MethodName;
use Rector\NodeNameResolver\NodeNameResolver;
@ -70,16 +71,16 @@ final class AstResolver
* @var \Rector\NodeTypeResolver\NodeTypeResolver
*/
private $nodeTypeResolver;
/**
* @readonly
* @var \Rector\Core\PhpParser\ClassLikeAstResolver
*/
private $classLikeAstResolver;
/**
* @readonly
* @var \Rector\Core\Reflection\MethodReflectionResolver
*/
private $methodReflectionResolver;
/**
* @readonly
* @var \Rector\Core\PhpParser\Node\BetterNodeFinder
*/
private $betterNodeFinder;
/**
* Parsing files is very heavy performance, so this will help to leverage it
* The value can be also null, when no statements could be parsed from the file.
@ -87,7 +88,7 @@ final class AstResolver
* @var array<string, Stmt[]|null>
*/
private $parsedFileNodes = [];
public function __construct(SmartPhpParser $smartPhpParser, NodeScopeAndMetadataDecorator $nodeScopeAndMetadataDecorator, SimpleCallableNodeTraverser $simpleCallableNodeTraverser, NodeNameResolver $nodeNameResolver, ReflectionProvider $reflectionProvider, NodeTypeResolver $nodeTypeResolver, \Rector\Core\PhpParser\ClassLikeAstResolver $classLikeAstResolver, MethodReflectionResolver $methodReflectionResolver)
public function __construct(SmartPhpParser $smartPhpParser, NodeScopeAndMetadataDecorator $nodeScopeAndMetadataDecorator, SimpleCallableNodeTraverser $simpleCallableNodeTraverser, NodeNameResolver $nodeNameResolver, ReflectionProvider $reflectionProvider, NodeTypeResolver $nodeTypeResolver, MethodReflectionResolver $methodReflectionResolver, BetterNodeFinder $betterNodeFinder)
{
$this->smartPhpParser = $smartPhpParser;
$this->nodeScopeAndMetadataDecorator = $nodeScopeAndMetadataDecorator;
@ -95,8 +96,8 @@ final class AstResolver
$this->nodeNameResolver = $nodeNameResolver;
$this->reflectionProvider = $reflectionProvider;
$this->nodeTypeResolver = $nodeTypeResolver;
$this->classLikeAstResolver = $classLikeAstResolver;
$this->methodReflectionResolver = $methodReflectionResolver;
$this->betterNodeFinder = $betterNodeFinder;
}
/**
* @api downgrade
@ -114,14 +115,7 @@ final class AstResolver
{
$classReflection = $methodReflection->getDeclaringClass();
$fileName = $classReflection->getFileName();
// probably native PHP method → un-parseable
if ($fileName === null) {
return null;
}
$nodes = $this->parseFileNameToDecoratedNodes($fileName);
if ($nodes === []) {
return null;
}
$classLikeName = $classReflection->getName();
$methodName = $methodReflection->getName();
$classMethod = null;
@ -156,13 +150,7 @@ final class AstResolver
public function resolveFunctionFromFunctionReflection(FunctionReflection $functionReflection) : ?Function_
{
$fileName = $functionReflection->getFileName();
if ($fileName === null) {
return null;
}
$nodes = $this->parseFileNameToDecoratedNodes($fileName);
if ($nodes === []) {
return null;
}
$functionName = $functionReflection->getName();
$functionNode = null;
$this->simpleCallableNodeTraverser->traverseNodesWithCallable($nodes, function (Node $node) use($functionName, &$functionNode) : ?int {
@ -213,7 +201,20 @@ final class AstResolver
*/
public function resolveClassFromClassReflection(ClassReflection $classReflection)
{
return $this->classLikeAstResolver->resolveClassFromClassReflection($classReflection, $this);
if ($classReflection->isBuiltin()) {
return null;
}
$fileName = $classReflection->getFileName();
$stmts = $this->parseFileNameToDecoratedNodes($fileName);
$className = $classReflection->getName();
/** @var Class_|Trait_|Interface_|Enum_|null $classLike */
$classLike = $this->betterNodeFinder->findFirst($stmts, function (Node $node) use($className) : bool {
if (!$node instanceof ClassLike) {
return \false;
}
return $this->nodeNameResolver->isName($node, $className);
});
return $classLike;
}
/**
* @return Trait_[]
@ -225,13 +226,7 @@ final class AstResolver
$traits = [];
foreach ($classLikes as $classLike) {
$fileName = $classLike->getFileName();
if ($fileName === null) {
continue;
}
$nodes = $this->parseFileNameToDecoratedNodes($fileName);
if ($nodes === []) {
continue;
}
$traitName = $classLike->getName();
$traitNode = null;
$this->simpleCallableNodeTraverser->traverseNodesWithCallable($nodes, function (Node $node) use($traitName, &$traitNode) : ?int {
@ -258,9 +253,6 @@ final class AstResolver
{
$classReflection = $phpPropertyReflection->getDeclaringClass();
$fileName = $classReflection->getFileName();
if ($fileName === null) {
return null;
}
$nodes = $this->parseFileNameToDecoratedNodes($fileName);
if ($nodes === []) {
return null;
@ -293,8 +285,12 @@ final class AstResolver
/**
* @return Stmt[]
*/
public function parseFileNameToDecoratedNodes(string $fileName) : array
public function parseFileNameToDecoratedNodes(?string $fileName) : array
{
// probably native PHP → un-parseable
if ($fileName === null) {
return [];
}
if (isset($this->parsedFileNodes[$fileName])) {
return $this->parsedFileNodes[$fileName];
}

View File

@ -1,62 +0,0 @@
<?php
declare (strict_types=1);
namespace Rector\Core\PhpParser;
use PhpParser\Node;
use PhpParser\Node\Stmt\Class_;
use PhpParser\Node\Stmt\ClassLike;
use PhpParser\Node\Stmt\Enum_;
use PhpParser\Node\Stmt\Interface_;
use PhpParser\Node\Stmt\Trait_;
use PHPStan\Reflection\ClassReflection;
use Rector\Core\PhpParser\Node\BetterNodeFinder;
use Rector\NodeNameResolver\NodeNameResolver;
/**
* @internal called from AstResolver
*/
final class ClassLikeAstResolver
{
/**
* @readonly
* @var \Rector\Core\PhpParser\Node\BetterNodeFinder
*/
private $betterNodeFinder;
/**
* @readonly
* @var \Rector\NodeNameResolver\NodeNameResolver
*/
private $nodeNameResolver;
public function __construct(BetterNodeFinder $betterNodeFinder, NodeNameResolver $nodeNameResolver)
{
$this->betterNodeFinder = $betterNodeFinder;
$this->nodeNameResolver = $nodeNameResolver;
}
/**
* @return \PhpParser\Node\Stmt\Trait_|\PhpParser\Node\Stmt\Class_|\PhpParser\Node\Stmt\Interface_|\PhpParser\Node\Stmt\Enum_|null
*/
public function resolveClassFromClassReflection(ClassReflection $classReflection, \Rector\Core\PhpParser\AstResolver $astResolver)
{
if ($classReflection->isBuiltin()) {
return null;
}
$fileName = $classReflection->getFileName();
// probably internal class
if ($fileName === null) {
return null;
}
$stmts = $astResolver->parseFileNameToDecoratedNodes($fileName);
if ($stmts === []) {
return null;
}
$className = $classReflection->getName();
/** @var Class_|Trait_|Interface_|Enum_|null $classLike */
$classLike = $this->betterNodeFinder->findFirst($stmts, function (Node $node) use($className) : bool {
if (!$node instanceof ClassLike) {
return \false;
}
return $this->nodeNameResolver->isName($node, $className);
});
return $classLike;
}
}

View File

@ -1237,7 +1237,6 @@ return array(
'Rector\\Core\\PHPStan\\NodeVisitor\\UnreachableStatementNodeVisitor' => $baseDir . '/src/PHPStan/NodeVisitor/UnreachableStatementNodeVisitor.php',
'Rector\\Core\\PHPStan\\NodeVisitor\\WrappedNodeRestoringNodeVisitor' => $baseDir . '/src/PHPStan/NodeVisitor/WrappedNodeRestoringNodeVisitor.php',
'Rector\\Core\\PhpParser\\AstResolver' => $baseDir . '/src/PhpParser/AstResolver.php',
'Rector\\Core\\PhpParser\\ClassLikeAstResolver' => $baseDir . '/src/PhpParser/ClassLikeAstResolver.php',
'Rector\\Core\\PhpParser\\Comparing\\NodeComparator' => $baseDir . '/src/PhpParser/Comparing/NodeComparator.php',
'Rector\\Core\\PhpParser\\NodeFinder\\LocalMethodCallFinder' => $baseDir . '/src/PhpParser/NodeFinder/LocalMethodCallFinder.php',
'Rector\\Core\\PhpParser\\NodeFinder\\PropertyFetchFinder' => $baseDir . '/src/PhpParser/NodeFinder/PropertyFetchFinder.php',

View File

@ -1456,7 +1456,6 @@ class ComposerStaticInit46a0b0ac2ea1371bb06be09a20f71c2b
'Rector\\Core\\PHPStan\\NodeVisitor\\UnreachableStatementNodeVisitor' => __DIR__ . '/../..' . '/src/PHPStan/NodeVisitor/UnreachableStatementNodeVisitor.php',
'Rector\\Core\\PHPStan\\NodeVisitor\\WrappedNodeRestoringNodeVisitor' => __DIR__ . '/../..' . '/src/PHPStan/NodeVisitor/WrappedNodeRestoringNodeVisitor.php',
'Rector\\Core\\PhpParser\\AstResolver' => __DIR__ . '/../..' . '/src/PhpParser/AstResolver.php',
'Rector\\Core\\PhpParser\\ClassLikeAstResolver' => __DIR__ . '/../..' . '/src/PhpParser/ClassLikeAstResolver.php',
'Rector\\Core\\PhpParser\\Comparing\\NodeComparator' => __DIR__ . '/../..' . '/src/PhpParser/Comparing/NodeComparator.php',
'Rector\\Core\\PhpParser\\NodeFinder\\LocalMethodCallFinder' => __DIR__ . '/../..' . '/src/PhpParser/NodeFinder/LocalMethodCallFinder.php',
'Rector\\Core\\PhpParser\\NodeFinder\\PropertyFetchFinder' => __DIR__ . '/../..' . '/src/PhpParser/NodeFinder/PropertyFetchFinder.php',