mirror of
https://github.com/rectorphp/rector.git
synced 2024-05-28 15:00:50 +00:00
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:
parent
0ae3d3835f
commit
d23a5ea440
|
@ -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;
|
||||
}
|
||||
}
|
|
@ -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));
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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
|
||||
*/
|
||||
|
|
|
@ -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
2
vendor/autoload.php
vendored
|
@ -22,4 +22,4 @@ if (PHP_VERSION_ID < 50600) {
|
|||
|
||||
require_once __DIR__ . '/composer/autoload_real.php';
|
||||
|
||||
return ComposerAutoloaderInit74870ba010272db02231fae9febf0260::getLoader();
|
||||
return ComposerAutoloaderInit52786243186c196feed1f286859ddfdc::getLoader();
|
||||
|
|
1
vendor/composer/autoload_classmap.php
vendored
1
vendor/composer/autoload_classmap.php
vendored
|
@ -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',
|
||||
|
|
10
vendor/composer/autoload_real.php
vendored
10
vendor/composer/autoload_real.php
vendored
|
@ -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;
|
||||
|
|
9
vendor/composer/autoload_static.php
vendored
9
vendor/composer/autoload_static.php
vendored
|
@ -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);
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue
Block a user