Skip to content

Commit

Permalink
Updated Rector to commit fa4c805047d25cd7024c1d415aa5550b884101eb
Browse files Browse the repository at this point in the history
rectorphp/rector-src@fa4c805 Reuse AstResolver memoizing on ClassLikeAstResolver (#3498)
  • Loading branch information
TomasVotruba committed Mar 21, 2023
1 parent fd25bb9 commit 76fd715
Show file tree
Hide file tree
Showing 7 changed files with 50 additions and 59 deletions.
4 changes: 2 additions & 2 deletions src/Application/VersionResolver.php
Original file line number Diff line number Diff line change
Expand Up @@ -19,12 +19,12 @@ final class VersionResolver
* @api
* @var string
*/
public const PACKAGE_VERSION = '28e9cdb10785dc382ba2c9251cf1dde9024affa2';
public const PACKAGE_VERSION = 'fa4c805047d25cd7024c1d415aa5550b884101eb';
/**
* @api
* @var string
*/
public const RELEASE_DATE = '2023-03-21 09:15:09';
public const RELEASE_DATE = '2023-03-21 20:11:08';
/**
* @var int
*/
Expand Down
14 changes: 7 additions & 7 deletions src/PhpParser/AstResolver.php
Original file line number Diff line number Diff line change
Expand Up @@ -121,7 +121,7 @@ public function resolveClassMethodFromMethodReflection(MethodReflection $methodR
return null;
}
$nodes = $this->parseFileNameToDecoratedNodes($fileName);
if ($nodes === null) {
if ($nodes === []) {
return null;
}
$classMethod = null;
Expand Down Expand Up @@ -161,7 +161,7 @@ public function resolveFunctionFromFunctionReflection(FunctionReflection $functi
return null;
}
$nodes = $this->parseFileNameToDecoratedNodes($fileName);
if ($nodes === null) {
if ($nodes === []) {
return null;
}
$functionNode = null;
Expand Down Expand Up @@ -229,7 +229,7 @@ public function parseClassReflectionTraits(ClassReflection $classReflection) : a
continue;
}
$nodes = $this->parseFileNameToDecoratedNodes($fileName);
if ($nodes === null) {
if ($nodes === []) {
continue;
}
$traitName = $classLike->getName();
Expand Down Expand Up @@ -262,7 +262,7 @@ public function resolvePropertyFromPropertyReflection(PhpPropertyReflection $php
return null;
}
$nodes = $this->parseFileNameToDecoratedNodes($fileName);
if ($nodes === null) {
if ($nodes === []) {
return null;
}
$nativeReflectionProperty = $phpPropertyReflection->getNativeReflection();
Expand Down Expand Up @@ -309,16 +309,16 @@ private function locateClassMethodInTrait(string $methodName, MethodReflection $
return $classMethod;
}
/**
* @return Stmt[]|null
* @return Stmt[]
*/
private function parseFileNameToDecoratedNodes(string $fileName) : ?array
public function parseFileNameToDecoratedNodes(string $fileName) : array
{
if (isset($this->parsedFileNodes[$fileName])) {
return $this->parsedFileNodes[$fileName];
}
$stmts = $this->smartPhpParser->parseFile($fileName);
if ($stmts === []) {
return $this->parsedFileNodes[$fileName] = null;
return $this->parsedFileNodes[$fileName] = [];
}
$file = new File($fileName, FileSystem::read($fileName));
return $this->parsedFileNodes[$fileName] = $this->nodeScopeAndMetadataDecorator->decorateNodesFromFile($file, $stmts);
Expand Down
55 changes: 20 additions & 35 deletions src/PhpParser/ClassLikeAstResolver.php
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@
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_;
Expand All @@ -11,21 +12,13 @@
use PHPStan\Reflection\ClassReflection;
use Rector\Core\PhpParser\Node\BetterNodeFinder;
use Rector\NodeNameResolver\NodeNameResolver;
use Rector\PhpDocParser\PhpParser\SmartPhpParser;
use RectorPrefix202303\Symfony\Contracts\Service\Attribute\Required;
final class ClassLikeAstResolver
{
/**
* Parsing files is very heavy performance, so this will help to leverage it
* The value can be also null, as the method might not exist in the class.
*
* @var array<class-string, Class_|Trait_|Interface_|Enum_|null>
* @var \Rector\Core\PhpParser\AstResolver
*/
private $classLikesByName = [];
/**
* @readonly
* @var \Rector\PhpDocParser\PhpParser\SmartPhpParser
*/
private $smartPhpParser;
private $astResolver;
/**
* @readonly
* @var \Rector\Core\PhpParser\Node\BetterNodeFinder
Expand All @@ -36,12 +29,18 @@ final class ClassLikeAstResolver
* @var \Rector\NodeNameResolver\NodeNameResolver
*/
private $nodeNameResolver;
public function __construct(SmartPhpParser $smartPhpParser, BetterNodeFinder $betterNodeFinder, NodeNameResolver $nodeNameResolver)
public function __construct(BetterNodeFinder $betterNodeFinder, NodeNameResolver $nodeNameResolver)
{
$this->smartPhpParser = $smartPhpParser;
$this->betterNodeFinder = $betterNodeFinder;
$this->nodeNameResolver = $nodeNameResolver;
}
/**
* @required
*/
public function autowire(\Rector\Core\PhpParser\AstResolver $astResolver) : void
{
$this->astResolver = $astResolver;
}
/**
* @return \PhpParser\Node\Stmt\Trait_|\PhpParser\Node\Stmt\Class_|\PhpParser\Node\Stmt\Interface_|\PhpParser\Node\Stmt\Enum_|null
*/
Expand All @@ -51,36 +50,22 @@ public function resolveClassFromClassReflection(ClassReflection $classReflection
return null;
}
$className = $classReflection->getName();
if (isset($this->classLikesByName[$className])) {
return $this->classLikesByName[$className];
}
// saved as null data
if (\array_key_exists($className, $this->classLikesByName)) {
return null;
}
$fileName = $classReflection->getFileName();
// probably internal class
if ($fileName === null) {
// avoid parsing falsy-file again
$this->classLikesByName[$className] = null;
return null;
}
$stmts = $this->smartPhpParser->parseFile($fileName);
$stmts = $this->astResolver->parseFileNameToDecoratedNodes($fileName);
if ($stmts === []) {
// avoid parsing falsy-file again
$this->classLikesByName[$className] = null;
return null;
}
/** @var array<Class_|Trait_|Interface_|Enum_> $classLikes */
$classLikes = $this->betterNodeFinder->findInstanceOf($stmts, ClassLike::class);
foreach ($classLikes as $classLike) {
if (!$this->nodeNameResolver->isName($classLike, $className)) {
continue;
/** @var Class_|Trait_|Interface_|Enum_|null $classLike */
$classLike = $this->betterNodeFinder->findFirst($stmts, function (Node $node) use($className) : bool {
if (!$node instanceof ClassLike) {
return \false;
}
$this->classLikesByName[$className] = $classLike;
return $classLike;
}
$this->classLikesByName[$className] = null;
return null;
return $this->nodeNameResolver->isName($node, $className);
});
return $classLike;
}
}
2 changes: 1 addition & 1 deletion vendor/autoload.php
Original file line number Diff line number Diff line change
Expand Up @@ -22,4 +22,4 @@

require_once __DIR__ . '/composer/autoload_real.php';

return ComposerAutoloaderInitccdf9f908490bf25dd002e1bd180a056::getLoader();
return ComposerAutoloaderInitbd4513564e83fd35058ea2dc9c1a5928::getLoader();
16 changes: 11 additions & 5 deletions vendor/composer/InstalledVersions.php
Original file line number Diff line number Diff line change
Expand Up @@ -87,7 +87,7 @@ public static function isInstalled($packageName, $includeDevRequirements = \true
{
foreach (self::getInstalled() as $installed) {
if (isset($installed['versions'][$packageName])) {
return $includeDevRequirements || empty($installed['versions'][$packageName]['dev_requirement']);
return $includeDevRequirements || !isset($installed['versions'][$packageName]['dev_requirement']) || $installed['versions'][$packageName]['dev_requirement'] === \false;
}
}
return \false;
Expand All @@ -106,7 +106,7 @@ public static function isInstalled($packageName, $includeDevRequirements = \true
*/
public static function satisfies(VersionParser $parser, $packageName, $constraint)
{
$constraint = $parser->parseConstraints($constraint);
$constraint = $parser->parseConstraints((string) $constraint);
$provided = $parser->parseConstraints(self::getVersionRanges($packageName));
return $provided->matches($constraint);
}
Expand Down Expand Up @@ -285,7 +285,9 @@ private static function getInstalled()
if (isset(self::$installedByVendor[$vendorDir])) {
$installed[] = self::$installedByVendor[$vendorDir];
} elseif (\is_file($vendorDir . '/composer/installed.php')) {
$installed[] = self::$installedByVendor[$vendorDir] = (require $vendorDir . '/composer/installed.php');
/** @var array{root: array{name: string, pretty_version: string, version: string, reference: string|null, type: string, install_path: string, aliases: string[], dev: bool}, versions: array<string, array{pretty_version?: string, version?: string, reference?: string|null, type?: string, install_path?: string, aliases?: string[], dev_requirement: bool, replaced?: string[], provided?: string[]}>} $required */
$required = (require $vendorDir . '/composer/installed.php');
$installed[] = self::$installedByVendor[$vendorDir] = $required;
if (null === self::$installed && \strtr($vendorDir . '/composer', '\\', '/') === \strtr(__DIR__, '\\', '/')) {
self::$installed = $installed[\count($installed) - 1];
}
Expand All @@ -296,12 +298,16 @@ private static function getInstalled()
// only require the installed.php file if this file is loaded from its dumped location,
// and not from its source location in the composer/composer package, see https://github.com/composer/composer/issues/9937
if (\substr(__DIR__, -8, 1) !== 'C') {
self::$installed = (require __DIR__ . '/installed.php');
/** @var array{root: array{name: string, pretty_version: string, version: string, reference: string|null, type: string, install_path: string, aliases: string[], dev: bool}, versions: array<string, array{pretty_version?: string, version?: string, reference?: string|null, type?: string, install_path?: string, aliases?: string[], dev_requirement: bool, replaced?: string[], provided?: string[]}>} $required */
$required = (require __DIR__ . '/installed.php');
self::$installed = $required;
} else {
self::$installed = array();
}
}
$installed[] = self::$installed;
if (self::$installed !== array()) {
$installed[] = self::$installed;
}
return $installed;
}
}
10 changes: 5 additions & 5 deletions vendor/composer/autoload_real.php
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@

// autoload_real.php @generated by Composer

class ComposerAutoloaderInitccdf9f908490bf25dd002e1bd180a056
class ComposerAutoloaderInitbd4513564e83fd35058ea2dc9c1a5928
{
private static $loader;

Expand All @@ -22,17 +22,17 @@ public static function getLoader()
return self::$loader;
}

spl_autoload_register(array('ComposerAutoloaderInitccdf9f908490bf25dd002e1bd180a056', 'loadClassLoader'), true, true);
spl_autoload_register(array('ComposerAutoloaderInitbd4513564e83fd35058ea2dc9c1a5928', 'loadClassLoader'), true, true);
self::$loader = $loader = new \Composer\Autoload\ClassLoader(\dirname(__DIR__));
spl_autoload_unregister(array('ComposerAutoloaderInitccdf9f908490bf25dd002e1bd180a056', 'loadClassLoader'));
spl_autoload_unregister(array('ComposerAutoloaderInitbd4513564e83fd35058ea2dc9c1a5928', 'loadClassLoader'));

require __DIR__ . '/autoload_static.php';
call_user_func(\Composer\Autoload\ComposerStaticInitccdf9f908490bf25dd002e1bd180a056::getInitializer($loader));
call_user_func(\Composer\Autoload\ComposerStaticInitbd4513564e83fd35058ea2dc9c1a5928::getInitializer($loader));

$loader->setClassMapAuthoritative(true);
$loader->register(true);

$filesToLoad = \Composer\Autoload\ComposerStaticInitccdf9f908490bf25dd002e1bd180a056::$files;
$filesToLoad = \Composer\Autoload\ComposerStaticInitbd4513564e83fd35058ea2dc9c1a5928::$files;
$requireFile = \Closure::bind(static function ($fileIdentifier, $file) {
if (empty($GLOBALS['__composer_autoload_files'][$fileIdentifier])) {
$GLOBALS['__composer_autoload_files'][$fileIdentifier] = true;
Expand Down
8 changes: 4 additions & 4 deletions vendor/composer/autoload_static.php
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@

namespace Composer\Autoload;

class ComposerStaticInitccdf9f908490bf25dd002e1bd180a056
class ComposerStaticInitbd4513564e83fd35058ea2dc9c1a5928
{
public static $files = array (
'ad155f8f1cf0d418fe49e248db8c661b' => __DIR__ . '/..' . '/react/promise/src/functions_include.php',
Expand Down Expand Up @@ -3127,9 +3127,9 @@ class ComposerStaticInitccdf9f908490bf25dd002e1bd180a056
public static function getInitializer(ClassLoader $loader)
{
return \Closure::bind(function () use ($loader) {
$loader->prefixLengthsPsr4 = ComposerStaticInitccdf9f908490bf25dd002e1bd180a056::$prefixLengthsPsr4;
$loader->prefixDirsPsr4 = ComposerStaticInitccdf9f908490bf25dd002e1bd180a056::$prefixDirsPsr4;
$loader->classMap = ComposerStaticInitccdf9f908490bf25dd002e1bd180a056::$classMap;
$loader->prefixLengthsPsr4 = ComposerStaticInitbd4513564e83fd35058ea2dc9c1a5928::$prefixLengthsPsr4;
$loader->prefixDirsPsr4 = ComposerStaticInitbd4513564e83fd35058ea2dc9c1a5928::$prefixDirsPsr4;
$loader->classMap = ComposerStaticInitbd4513564e83fd35058ea2dc9c1a5928::$classMap;

}, null, ClassLoader::class);
}
Expand Down

0 comments on commit 76fd715

Please sign in to comment.