Updated Rector to commit f9900dd236001d117a7b3fdb9fcc2d0d5ec569bc

f9900dd236 [AutoImport][PostRector] Handle duplicated import on namespaced class on UseAddingPostRector (#3461)
This commit is contained in:
Tomas Votruba 2023-03-07 00:55:13 +00:00
parent 3cdd9d3ecb
commit b146658bb5
7 changed files with 60 additions and 37 deletions

View File

@ -81,29 +81,46 @@ final class UseAddingPostRector extends \Rector\PostRector\Rector\AbstractPostRe
}
$useImportTypes = $this->useNodesToAddCollector->getObjectImportsByFilePath($file->getFilePath());
$functionUseImportTypes = $this->useNodesToAddCollector->getFunctionImportsByFilePath($file->getFilePath());
$oldToNewClasses = $this->renamedClassesDataCollector->getOldToNewClasses();
$removedUses = $this->renamedClassesDataCollector->getOldClasses();
// nothing to import or remove
if ($useImportTypes === [] && $functionUseImportTypes === [] && $oldToNewClasses === []) {
if ($useImportTypes === [] && $functionUseImportTypes === [] && $removedUses === []) {
return $nodes;
}
/** @var FullyQualifiedObjectType[] $useImportTypes */
$useImportTypes = $this->typeFactory->uniquateTypes($useImportTypes);
// A. has namespace? add under it
$namespace = $this->betterNodeFinder->findFirstInstanceOf($nodes, Namespace_::class);
if ($namespace instanceof Namespace_) {
// first clean
// then add, to prevent adding + removing false positive of same short use
$this->useImportsAdder->addImportsToNamespace($namespace, $useImportTypes, $functionUseImportTypes);
return $nodes;
}
$firstNode = $nodes[0];
if ($firstNode instanceof FileWithoutNamespace) {
$nodes = $firstNode->stmts;
}
$removedShortUses = $this->renamedClassesDataCollector->getOldClasses();
$namespace = $this->betterNodeFinder->findFirstInstanceOf($nodes, Namespace_::class);
if (!$firstNode instanceof FileWithoutNamespace && !$namespace instanceof Namespace_) {
return $nodes;
}
if ($namespace instanceof Namespace_) {
// clean namespace stmts, don't assign, this used to clean the stmts of Namespace_
$this->useImportsRemover->removeImportsFromStmts($namespace->stmts, $removedUses);
}
if ($firstNode instanceof FileWithoutNamespace) {
// clean no-namespace stmts, assign
$nodes = $this->useImportsRemover->removeImportsFromStmts($nodes, $removedUses);
}
return $this->resolveNodesWithImportedUses($nodes, $useImportTypes, $functionUseImportTypes, $namespace);
}
/**
* @param Stmt[] $nodes
* @param FullyQualifiedObjectType[] $useImportTypes
* @param FullyQualifiedObjectType[] $functionUseImportTypes
* @return Stmt[]
*/
private function resolveNodesWithImportedUses(array $nodes, array $useImportTypes, array $functionUseImportTypes, ?Namespace_ $namespace) : array
{
// A. has namespace? add under it
if ($namespace instanceof Namespace_) {
// then add, to prevent adding + removing false positive of same short use
$this->useImportsAdder->addImportsToNamespace($namespace, $useImportTypes, $functionUseImportTypes);
return $nodes;
}
// B. no namespace? add in the top
// first clean
$nodes = $this->useImportsRemover->removeImportsFromStmts($nodes, $removedShortUses);
$useImportTypes = $this->filterOutNonNamespacedNames($useImportTypes);
// then add, to prevent adding + removing false positive of same short use
return $this->useImportsAdder->addImportsToStmts($nodes, $useImportTypes, $functionUseImportTypes);

View File

@ -6,6 +6,7 @@ namespace Rector\CodingStyle\Application;
use PhpParser\Node\Stmt;
use PhpParser\Node\Stmt\Use_;
use Rector\Core\Configuration\RectorConfigProvider;
use Rector\NodeRemoval\NodeRemover;
final class UseImportsRemover
{
/**
@ -13,16 +14,22 @@ final class UseImportsRemover
* @var \Rector\Core\Configuration\RectorConfigProvider
*/
private $rectorConfigProvider;
public function __construct(RectorConfigProvider $rectorConfigProvider)
/**
* @readonly
* @var \Rector\NodeRemoval\NodeRemover
*/
private $nodeRemover;
public function __construct(RectorConfigProvider $rectorConfigProvider, NodeRemover $nodeRemover)
{
$this->rectorConfigProvider = $rectorConfigProvider;
$this->nodeRemover = $nodeRemover;
}
/**
* @param Stmt[] $stmts
* @param string[] $removedShortUses
* @param string[] $removedUses
* @return Stmt[]
*/
public function removeImportsFromStmts(array $stmts, array $removedShortUses) : array
public function removeImportsFromStmts(array $stmts, array $removedUses) : array
{
/**
* Verify import name to cover conflict on rename+import,
@ -35,7 +42,7 @@ final class UseImportsRemover
if (!$stmt instanceof Use_) {
continue;
}
$this->removeUseFromUse($removedShortUses, $stmt);
$this->removeUseFromUse($removedUses, $stmt);
// nothing left → remove
if ($stmt->uses === []) {
unset($stmts[$stmtKey]);
@ -44,16 +51,19 @@ final class UseImportsRemover
return $stmts;
}
/**
* @param string[] $removedShortUses
* @param string[] $removedUses
*/
private function removeUseFromUse(array $removedShortUses, Use_ $use) : void
private function removeUseFromUse(array $removedUses, Use_ $use) : void
{
foreach ($use->uses as $usesKey => $useUse) {
foreach ($removedShortUses as $removedShortUse) {
if ($useUse->name->toString() === $removedShortUse) {
foreach ($removedUses as $removedUse) {
if ($useUse->name->toString() === $removedUse) {
unset($use->uses[$usesKey]);
}
}
}
if ($use->uses === []) {
$this->nodeRemover->removeNode($use);
}
}
}

View File

@ -19,12 +19,12 @@ final class VersionResolver
* @api
* @var string
*/
public const PACKAGE_VERSION = 'b3da981d01f2caa1534033e208a6131c9e61b9c3';
public const PACKAGE_VERSION = 'f9900dd236001d117a7b3fdb9fcc2d0d5ec569bc';
/**
* @api
* @var string
*/
public const RELEASE_DATE = '2023-03-06 18:57:18';
public const RELEASE_DATE = '2023-03-07 07:50:41';
/**
* @var int
*/

View File

@ -92,8 +92,4 @@ final class SetupCICommand extends Command
$match = Strings::match($output, self::GITHUB_REPOSITORY_REGEX);
return $match['repository_name'] ?? null;
}
private function createClickableLink(string $url) : string
{
return sprintf('<href=%s>%s</>', $url, $url);
}
}

2
vendor/autoload.php vendored
View File

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

View File

@ -2,7 +2,7 @@
// autoload_real.php @generated by Composer
class ComposerAutoloaderInita3d416d8ea058b46a58d23ee9aa66e42
class ComposerAutoloaderInita8c08423566309234c8255bb0c049cd8
{
private static $loader;
@ -22,17 +22,17 @@ class ComposerAutoloaderInita3d416d8ea058b46a58d23ee9aa66e42
return self::$loader;
}
spl_autoload_register(array('ComposerAutoloaderInita3d416d8ea058b46a58d23ee9aa66e42', 'loadClassLoader'), true, true);
spl_autoload_register(array('ComposerAutoloaderInita8c08423566309234c8255bb0c049cd8', 'loadClassLoader'), true, true);
self::$loader = $loader = new \Composer\Autoload\ClassLoader(\dirname(__DIR__));
spl_autoload_unregister(array('ComposerAutoloaderInita3d416d8ea058b46a58d23ee9aa66e42', 'loadClassLoader'));
spl_autoload_unregister(array('ComposerAutoloaderInita8c08423566309234c8255bb0c049cd8', 'loadClassLoader'));
require __DIR__ . '/autoload_static.php';
call_user_func(\Composer\Autoload\ComposerStaticInita3d416d8ea058b46a58d23ee9aa66e42::getInitializer($loader));
call_user_func(\Composer\Autoload\ComposerStaticInita8c08423566309234c8255bb0c049cd8::getInitializer($loader));
$loader->setClassMapAuthoritative(true);
$loader->register(true);
$filesToLoad = \Composer\Autoload\ComposerStaticInita3d416d8ea058b46a58d23ee9aa66e42::$files;
$filesToLoad = \Composer\Autoload\ComposerStaticInita8c08423566309234c8255bb0c049cd8::$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 ComposerStaticInita3d416d8ea058b46a58d23ee9aa66e42
class ComposerStaticInita8c08423566309234c8255bb0c049cd8
{
public static $files = array (
'ad155f8f1cf0d418fe49e248db8c661b' => __DIR__ . '/..' . '/react/promise/src/functions_include.php',
@ -3133,9 +3133,9 @@ class ComposerStaticInita3d416d8ea058b46a58d23ee9aa66e42
public static function getInitializer(ClassLoader $loader)
{
return \Closure::bind(function () use ($loader) {
$loader->prefixLengthsPsr4 = ComposerStaticInita3d416d8ea058b46a58d23ee9aa66e42::$prefixLengthsPsr4;
$loader->prefixDirsPsr4 = ComposerStaticInita3d416d8ea058b46a58d23ee9aa66e42::$prefixDirsPsr4;
$loader->classMap = ComposerStaticInita3d416d8ea058b46a58d23ee9aa66e42::$classMap;
$loader->prefixLengthsPsr4 = ComposerStaticInita8c08423566309234c8255bb0c049cd8::$prefixLengthsPsr4;
$loader->prefixDirsPsr4 = ComposerStaticInita8c08423566309234c8255bb0c049cd8::$prefixDirsPsr4;
$loader->classMap = ComposerStaticInita8c08423566309234c8255bb0c049cd8::$classMap;
}, null, ClassLoader::class);
}