Updated Rector to commit b23294698f066a48e35be76ba0f25616f48f375e

b23294698f [Renaming] Remove callables from class renames to avoid missed rename bugs, better handle with PHSPtan and custom rule (#4745)
This commit is contained in:
Tomas Votruba 2023-08-09 16:15:16 +00:00
parent 0ae3d3835f
commit d23a5ea440
9 changed files with 17 additions and 153 deletions

View File

@ -1,81 +0,0 @@
<?php
declare (strict_types=1);
namespace Rector\Renaming\Helper;
use PhpParser\Node;
use PhpParser\Node\Identifier;
use PhpParser\Node\Stmt\ClassLike;
use PhpParser\NodeVisitorAbstract;
use PHPStan\Reflection\ReflectionProvider;
use Rector\Core\Configuration\RenamedClassesDataCollector;
use Rector\NodeNameResolver\NodeNameResolver;
final class RenameClassCallbackHandler extends NodeVisitorAbstract
{
/**
* @readonly
* @var \Rector\Core\Configuration\RenamedClassesDataCollector
*/
private $renamedClassesDataCollector;
/**
* @readonly
* @var \Rector\NodeNameResolver\NodeNameResolver
*/
private $nodeNameResolver;
/**
* @readonly
* @var \PHPStan\Reflection\ReflectionProvider
*/
private $reflectionProvider;
/**
* @var array<callable(ClassLike, NodeNameResolver, ReflectionProvider): ?string>
*/
private $oldToNewClassCallbacks = [];
public function __construct(RenamedClassesDataCollector $renamedClassesDataCollector, NodeNameResolver $nodeNameResolver, ReflectionProvider $reflectionProvider)
{
$this->renamedClassesDataCollector = $renamedClassesDataCollector;
$this->nodeNameResolver = $nodeNameResolver;
$this->reflectionProvider = $reflectionProvider;
}
public function hasOldToNewClassCallbacks() : bool
{
return $this->oldToNewClassCallbacks !== [];
}
/**
* @param array<callable(ClassLike, NodeNameResolver, ReflectionProvider): ?string> $oldToNewClassCallbacks
*/
public function addOldToNewClassCallbacks(array $oldToNewClassCallbacks) : void
{
$this->oldToNewClassCallbacks = \array_merge($this->oldToNewClassCallbacks, $oldToNewClassCallbacks);
}
/**
* @return array<string, string>
*/
public function getOldToNewClassesFromNode(Node $node) : array
{
if ($node instanceof ClassLike) {
return $this->handleClassLike($node);
}
return [];
}
/**
* @return array<string, string>
*/
private function handleClassLike(ClassLike $classLike) : array
{
$oldToNewClasses = [];
$className = $classLike->name;
if (!$className instanceof Identifier) {
return [];
}
foreach ($this->oldToNewClassCallbacks as $oldToNewClassCallback) {
$newClassName = $oldToNewClassCallback($classLike, $this->nodeNameResolver, $this->reflectionProvider);
if ($newClassName !== null) {
$fullyQualifiedClassName = (string) $this->nodeNameResolver->getName($classLike);
$this->renamedClassesDataCollector->addOldToNewClass($fullyQualifiedClassName, $newClassName);
$oldToNewClasses[$fullyQualifiedClassName] = $newClassName;
}
}
return $oldToNewClasses;
}
}

View File

@ -27,7 +27,6 @@ use Rector\NodeTypeResolver\Node\AttributeKey;
use Rector\NodeTypeResolver\PhpDoc\NodeAnalyzer\DocBlockClassRenamer;
use Rector\NodeTypeResolver\ValueObject\OldToNewType;
use Rector\PhpDocParser\NodeTraverser\SimpleCallableNodeTraverser;
use Rector\Renaming\Helper\RenameClassCallbackHandler;
use Rector\StaticTypeMapper\ValueObject\Type\FullyQualifiedObjectType;
final class ClassRenamer
{
@ -71,11 +70,6 @@ final class ClassRenamer
* @var \PHPStan\Reflection\ReflectionProvider
*/
private $reflectionProvider;
/**
* @readonly
* @var \Rector\Renaming\Helper\RenameClassCallbackHandler
*/
private $renameClassCallbackHandler;
/**
* @readonly
* @var \Rector\Core\Util\FileHasher
@ -89,7 +83,7 @@ final class ClassRenamer
* @var array<string, OldToNewType[]>
*/
private $oldToNewTypesByCacheKey = [];
public function __construct(BetterNodeFinder $betterNodeFinder, SimpleCallableNodeTraverser $simpleCallableNodeTraverser, ClassNaming $classNaming, NodeNameResolver $nodeNameResolver, PhpDocClassRenamer $phpDocClassRenamer, PhpDocInfoFactory $phpDocInfoFactory, DocBlockClassRenamer $docBlockClassRenamer, ReflectionProvider $reflectionProvider, RenameClassCallbackHandler $renameClassCallbackHandler, FileHasher $fileHasher)
public function __construct(BetterNodeFinder $betterNodeFinder, SimpleCallableNodeTraverser $simpleCallableNodeTraverser, ClassNaming $classNaming, NodeNameResolver $nodeNameResolver, PhpDocClassRenamer $phpDocClassRenamer, PhpDocInfoFactory $phpDocInfoFactory, DocBlockClassRenamer $docBlockClassRenamer, ReflectionProvider $reflectionProvider, FileHasher $fileHasher)
{
$this->betterNodeFinder = $betterNodeFinder;
$this->simpleCallableNodeTraverser = $simpleCallableNodeTraverser;
@ -99,7 +93,6 @@ final class ClassRenamer
$this->phpDocInfoFactory = $phpDocInfoFactory;
$this->docBlockClassRenamer = $docBlockClassRenamer;
$this->reflectionProvider = $reflectionProvider;
$this->renameClassCallbackHandler = $renameClassCallbackHandler;
$this->fileHasher = $fileHasher;
}
/**
@ -107,7 +100,7 @@ final class ClassRenamer
*/
public function renameNode(Node $node, array $oldToNewClasses, ?Scope $scope) : ?Node
{
$oldToNewTypes = $this->createOldToNewTypes($node, $oldToNewClasses);
$oldToNewTypes = $this->createOldToNewTypes($oldToNewClasses);
if ($node instanceof Name) {
return $this->refactorName($node, $oldToNewClasses);
}
@ -333,9 +326,8 @@ final class ClassRenamer
* @param array<string, string> $oldToNewClasses
* @return OldToNewType[]
*/
private function createOldToNewTypes(Node $node, array $oldToNewClasses) : array
private function createOldToNewTypes(array $oldToNewClasses) : array
{
$oldToNewClasses = $this->resolveOldToNewClassCallbacks($node, $oldToNewClasses);
$serialized = \serialize($oldToNewClasses);
$cacheKey = $this->fileHasher->hash($serialized);
if (isset($this->oldToNewTypesByCacheKey[$cacheKey])) {
@ -350,12 +342,4 @@ final class ClassRenamer
$this->oldToNewTypesByCacheKey[$cacheKey] = $oldToNewTypes;
return $oldToNewTypes;
}
/**
* @param array<string, string> $oldToNewClasses
* @return array<string, string>
*/
private function resolveOldToNewClassCallbacks(Node $node, array $oldToNewClasses) : array
{
return \array_merge($oldToNewClasses, $this->renameClassCallbackHandler->getOldToNewClassesFromNode($node));
}
}

View File

@ -13,9 +13,7 @@ use PhpParser\Node\Stmt\Property;
use Rector\Core\Configuration\RenamedClassesDataCollector;
use Rector\Core\Contract\Rector\ConfigurableRectorInterface;
use Rector\Core\Rector\AbstractRector;
use Rector\NodeNameResolver\NodeNameResolver;
use Rector\NodeTypeResolver\Node\AttributeKey;
use Rector\Renaming\Helper\RenameClassCallbackHandler;
use Rector\Renaming\NodeManipulator\ClassRenamer;
use Symplify\RuleDocGenerator\ValueObject\CodeSample\ConfiguredCodeSample;
use Symplify\RuleDocGenerator\ValueObject\RuleDefinition;
@ -35,20 +33,10 @@ final class RenameClassRector extends AbstractRector implements ConfigurableRect
* @var \Rector\Renaming\NodeManipulator\ClassRenamer
*/
private $classRenamer;
/**
* @readonly
* @var \Rector\Renaming\Helper\RenameClassCallbackHandler
*/
private $renameClassCallbackHandler;
/**
* @var string
*/
public const CALLBACKS = '#callbacks#';
public function __construct(RenamedClassesDataCollector $renamedClassesDataCollector, ClassRenamer $classRenamer, RenameClassCallbackHandler $renameClassCallbackHandler)
public function __construct(RenamedClassesDataCollector $renamedClassesDataCollector, ClassRenamer $classRenamer)
{
$this->renamedClassesDataCollector = $renamedClassesDataCollector;
$this->classRenamer = $classRenamer;
$this->renameClassCallbackHandler = $renameClassCallbackHandler;
}
public function getRuleDefinition() : RuleDefinition
{
@ -95,10 +83,6 @@ CODE_SAMPLE
$scope = $node->getAttribute(AttributeKey::SCOPE);
return $this->classRenamer->renameNode($node, $oldToNewClasses, $scope);
}
if ($this->renameClassCallbackHandler->hasOldToNewClassCallbacks()) {
$scope = $node->getAttribute(AttributeKey::SCOPE);
return $this->classRenamer->renameNode($node, $oldToNewClasses, $scope);
}
return null;
}
/**
@ -106,25 +90,8 @@ CODE_SAMPLE
*/
public function configure(array $configuration) : void
{
$oldToNewClassCallbacks = $configuration[self::CALLBACKS] ?? [];
Assert::isArray($oldToNewClassCallbacks);
if ($oldToNewClassCallbacks !== []) {
Assert::allIsCallable($oldToNewClassCallbacks);
/** @var array<callable(ClassLike, NodeNameResolver): ?string> $oldToNewClassCallbacks */
$this->renameClassCallbackHandler->addOldToNewClassCallbacks($oldToNewClassCallbacks);
unset($configuration[self::CALLBACKS]);
}
Assert::allString($configuration);
Assert::allString(\array_keys($configuration));
$this->addOldToNewClasses($configuration);
}
/**
* @param mixed[] $oldToNewClasses
*/
private function addOldToNewClasses(array $oldToNewClasses) : void
{
Assert::allString(\array_keys($oldToNewClasses));
Assert::allString($oldToNewClasses);
$this->renamedClassesDataCollector->addOldToNewClasses($oldToNewClasses);
$this->renamedClassesDataCollector->addOldToNewClasses($configuration);
}
}

View File

@ -19,12 +19,12 @@ final class VersionResolver
* @api
* @var string
*/
public const PACKAGE_VERSION = '6272769869e6de54b4cf172b8825af96ce51e11d';
public const PACKAGE_VERSION = 'b23294698f066a48e35be76ba0f25616f48f375e';
/**
* @api
* @var string
*/
public const RELEASE_DATE = '2023-08-09 15:59:46';
public const RELEASE_DATE = '2023-08-09 17:10:43';
/**
* @var int
*/

View File

@ -10,10 +10,6 @@ final class RenamedClassesDataCollector
* @var array<string, string>
*/
private $oldToNewClasses = [];
public function addOldToNewClass(string $oldClass, string $newClass) : void
{
$this->oldToNewClasses[$oldClass] = $newClass;
}
public function hasOldClass(string $oldClass) : bool
{
return isset($this->oldToNewClasses[$oldClass]);

2
vendor/autoload.php vendored
View File

@ -22,4 +22,4 @@ if (PHP_VERSION_ID < 50600) {
require_once __DIR__ . '/composer/autoload_real.php';
return ComposerAutoloaderInit74870ba010272db02231fae9febf0260::getLoader();
return ComposerAutoloaderInit52786243186c196feed1f286859ddfdc::getLoader();

View File

@ -2336,7 +2336,6 @@ return array(
'Rector\\Renaming\\Contract\\MethodCallRenameInterface' => $baseDir . '/rules/Renaming/Contract/MethodCallRenameInterface.php',
'Rector\\Renaming\\Contract\\RenameAnnotationInterface' => $baseDir . '/rules/Renaming/Contract/RenameAnnotationInterface.php',
'Rector\\Renaming\\Contract\\RenameClassConstFetchInterface' => $baseDir . '/rules/Renaming/Contract/RenameClassConstFetchInterface.php',
'Rector\\Renaming\\Helper\\RenameClassCallbackHandler' => $baseDir . '/rules/Renaming/Helper/RenameClassCallbackHandler.php',
'Rector\\Renaming\\NodeManipulator\\ClassRenamer' => $baseDir . '/rules/Renaming/NodeManipulator/ClassRenamer.php',
'Rector\\Renaming\\NodeManipulator\\SwitchManipulator' => $baseDir . '/rules/Renaming/NodeManipulator/SwitchManipulator.php',
'Rector\\Renaming\\Rector\\ClassConstFetch\\RenameClassConstFetchRector' => $baseDir . '/rules/Renaming/Rector/ClassConstFetch/RenameClassConstFetchRector.php',

View File

@ -2,7 +2,7 @@
// autoload_real.php @generated by Composer
class ComposerAutoloaderInit74870ba010272db02231fae9febf0260
class ComposerAutoloaderInit52786243186c196feed1f286859ddfdc
{
private static $loader;
@ -22,17 +22,17 @@ class ComposerAutoloaderInit74870ba010272db02231fae9febf0260
return self::$loader;
}
spl_autoload_register(array('ComposerAutoloaderInit74870ba010272db02231fae9febf0260', 'loadClassLoader'), true, true);
spl_autoload_register(array('ComposerAutoloaderInit52786243186c196feed1f286859ddfdc', 'loadClassLoader'), true, true);
self::$loader = $loader = new \Composer\Autoload\ClassLoader(\dirname(__DIR__));
spl_autoload_unregister(array('ComposerAutoloaderInit74870ba010272db02231fae9febf0260', 'loadClassLoader'));
spl_autoload_unregister(array('ComposerAutoloaderInit52786243186c196feed1f286859ddfdc', 'loadClassLoader'));
require __DIR__ . '/autoload_static.php';
call_user_func(\Composer\Autoload\ComposerStaticInit74870ba010272db02231fae9febf0260::getInitializer($loader));
call_user_func(\Composer\Autoload\ComposerStaticInit52786243186c196feed1f286859ddfdc::getInitializer($loader));
$loader->setClassMapAuthoritative(true);
$loader->register(true);
$filesToLoad = \Composer\Autoload\ComposerStaticInit74870ba010272db02231fae9febf0260::$files;
$filesToLoad = \Composer\Autoload\ComposerStaticInit52786243186c196feed1f286859ddfdc::$files;
$requireFile = \Closure::bind(static function ($fileIdentifier, $file) {
if (empty($GLOBALS['__composer_autoload_files'][$fileIdentifier])) {
$GLOBALS['__composer_autoload_files'][$fileIdentifier] = true;

View File

@ -4,7 +4,7 @@
namespace Composer\Autoload;
class ComposerStaticInit74870ba010272db02231fae9febf0260
class ComposerStaticInit52786243186c196feed1f286859ddfdc
{
public static $files = array (
'ad155f8f1cf0d418fe49e248db8c661b' => __DIR__ . '/..' . '/react/promise/src/functions_include.php',
@ -2590,7 +2590,6 @@ class ComposerStaticInit74870ba010272db02231fae9febf0260
'Rector\\Renaming\\Contract\\MethodCallRenameInterface' => __DIR__ . '/../..' . '/rules/Renaming/Contract/MethodCallRenameInterface.php',
'Rector\\Renaming\\Contract\\RenameAnnotationInterface' => __DIR__ . '/../..' . '/rules/Renaming/Contract/RenameAnnotationInterface.php',
'Rector\\Renaming\\Contract\\RenameClassConstFetchInterface' => __DIR__ . '/../..' . '/rules/Renaming/Contract/RenameClassConstFetchInterface.php',
'Rector\\Renaming\\Helper\\RenameClassCallbackHandler' => __DIR__ . '/../..' . '/rules/Renaming/Helper/RenameClassCallbackHandler.php',
'Rector\\Renaming\\NodeManipulator\\ClassRenamer' => __DIR__ . '/../..' . '/rules/Renaming/NodeManipulator/ClassRenamer.php',
'Rector\\Renaming\\NodeManipulator\\SwitchManipulator' => __DIR__ . '/../..' . '/rules/Renaming/NodeManipulator/SwitchManipulator.php',
'Rector\\Renaming\\Rector\\ClassConstFetch\\RenameClassConstFetchRector' => __DIR__ . '/../..' . '/rules/Renaming/Rector/ClassConstFetch/RenameClassConstFetchRector.php',
@ -3003,9 +3002,9 @@ class ComposerStaticInit74870ba010272db02231fae9febf0260
public static function getInitializer(ClassLoader $loader)
{
return \Closure::bind(function () use ($loader) {
$loader->prefixLengthsPsr4 = ComposerStaticInit74870ba010272db02231fae9febf0260::$prefixLengthsPsr4;
$loader->prefixDirsPsr4 = ComposerStaticInit74870ba010272db02231fae9febf0260::$prefixDirsPsr4;
$loader->classMap = ComposerStaticInit74870ba010272db02231fae9febf0260::$classMap;
$loader->prefixLengthsPsr4 = ComposerStaticInit52786243186c196feed1f286859ddfdc::$prefixLengthsPsr4;
$loader->prefixDirsPsr4 = ComposerStaticInit52786243186c196feed1f286859ddfdc::$prefixDirsPsr4;
$loader->classMap = ComposerStaticInit52786243186c196feed1f286859ddfdc::$classMap;
}, null, ClassLoader::class);
}