From 088accd46cfabe2ee6d63c49b9dd8fbd9685d436 Mon Sep 17 00:00:00 2001 From: Tomas Votruba Date: Tue, 12 Sep 2023 12:38:05 +0000 Subject: [PATCH] Updated Rector to commit aeba96a811638e3954028b70d8163c43a8866fa8 https://github.com/rectorphp/rector-src/commit/aeba96a811638e3954028b70d8163c43a8866fa8 Refactor use import resolving (#4998) --- .../Application/UseImportsAdder.php | 14 +++-- .../ClassNameImport/AliasUsesResolver.php | 7 ++- .../ClassNameImport/UseImportsTraverser.php | 43 +++----------- .../ClassNameImport/UsedImportsResolver.php | 52 +++++++---------- .../ValueObject/UsedImports.php | 57 +++++++++++++++++++ src/Application/VersionResolver.php | 4 +- vendor/autoload.php | 2 +- vendor/composer/autoload_classmap.php | 1 + vendor/composer/autoload_real.php | 10 ++-- vendor/composer/autoload_static.php | 9 +-- 10 files changed, 113 insertions(+), 86 deletions(-) create mode 100644 rules/CodingStyle/ClassNameImport/ValueObject/UsedImports.php diff --git a/rules/CodingStyle/Application/UseImportsAdder.php b/rules/CodingStyle/Application/UseImportsAdder.php index 6efe64df2f2..e40dca6e245 100644 --- a/rules/CodingStyle/Application/UseImportsAdder.php +++ b/rules/CodingStyle/Application/UseImportsAdder.php @@ -43,9 +43,10 @@ final class UseImportsAdder */ public function addImportsToStmts(FileWithoutNamespace $fileWithoutNamespace, array $stmts, array $useImportTypes, array $constantUseImportTypes, array $functionUseImportTypes) : array { - $existingUseImportTypes = $this->usedImportsResolver->resolveForStmts($stmts); - $existingConstantUseImports = $this->usedImportsResolver->resolveConstantImportsForStmts($stmts); - $existingFunctionUseImports = $this->usedImportsResolver->resolveFunctionImportsForStmts($stmts); + $usedImports = $this->usedImportsResolver->resolveForStmts($stmts); + $existingUseImportTypes = $usedImports->getUseImports(); + $existingConstantUseImports = $usedImports->getConstantImports(); + $existingFunctionUseImports = $usedImports->getFunctionImports(); $useImportTypes = $this->diffFullyQualifiedObjectTypes($useImportTypes, $existingUseImportTypes); $constantUseImportTypes = $this->diffFullyQualifiedObjectTypes($constantUseImportTypes, $existingConstantUseImports); $functionUseImportTypes = $this->diffFullyQualifiedObjectTypes($functionUseImportTypes, $existingFunctionUseImports); @@ -83,9 +84,10 @@ final class UseImportsAdder public function addImportsToNamespace(Namespace_ $namespace, array $useImportTypes, array $constantUseImportTypes, array $functionUseImportTypes) : void { $namespaceName = $this->getNamespaceName($namespace); - $existingUseImportTypes = $this->usedImportsResolver->resolveForStmts($namespace->stmts); - $existingConstantUseImportTypes = $this->usedImportsResolver->resolveConstantImportsForStmts($namespace->stmts); - $existingFunctionUseImportTypes = $this->usedImportsResolver->resolveFunctionImportsForStmts($namespace->stmts); + $existingUsedImports = $this->usedImportsResolver->resolveForStmts($namespace->stmts); + $existingUseImportTypes = $existingUsedImports->getUseImports(); + $existingConstantUseImportTypes = $existingUsedImports->getConstantImports(); + $existingFunctionUseImportTypes = $existingUsedImports->getFunctionImports(); $existingUseImportTypes = $this->typeFactory->uniquateTypes($existingUseImportTypes); $useImportTypes = $this->diffFullyQualifiedObjectTypes($useImportTypes, $existingUseImportTypes); $constantUseImportTypes = $this->diffFullyQualifiedObjectTypes($constantUseImportTypes, $existingConstantUseImportTypes); diff --git a/rules/CodingStyle/ClassNameImport/AliasUsesResolver.php b/rules/CodingStyle/ClassNameImport/AliasUsesResolver.php index 178e2f98ce3..54a3e1da44e 100644 --- a/rules/CodingStyle/ClassNameImport/AliasUsesResolver.php +++ b/rules/CodingStyle/ClassNameImport/AliasUsesResolver.php @@ -3,6 +3,7 @@ declare (strict_types=1); namespace Rector\CodingStyle\ClassNameImport; +use PhpParser\Node\Stmt\Use_; use PhpParser\Node; use PhpParser\Node\Identifier; use PhpParser\Node\Stmt; @@ -44,7 +45,11 @@ final class AliasUsesResolver public function resolveFromStmts(array $stmts) : array { $aliasedUses = []; - $this->useImportsTraverser->traverserStmts($stmts, static function (UseUse $useUse, string $name) use(&$aliasedUses) : void { + /** @param Use_::TYPE_* $useType */ + $this->useImportsTraverser->traverserStmts($stmts, static function (int $useType, UseUse $useUse, string $name) use(&$aliasedUses) : void { + if ($useType !== Use_::TYPE_NORMAL) { + return; + } if (!$useUse->alias instanceof Identifier) { return; } diff --git a/rules/CodingStyle/ClassNameImport/UseImportsTraverser.php b/rules/CodingStyle/ClassNameImport/UseImportsTraverser.php index a3bca32eefb..e23cb1b35ed 100644 --- a/rules/CodingStyle/ClassNameImport/UseImportsTraverser.php +++ b/rules/CodingStyle/ClassNameImport/UseImportsTraverser.php @@ -32,68 +32,41 @@ final class UseImportsTraverser } /** * @param Stmt[] $stmts - * @param callable(UseUse $useUse, string $name): void $callable + * @param callable(Use_::TYPE_* $useType, UseUse $useUse, string $name): void $callable */ public function traverserStmts(array $stmts, callable $callable) : void { - $this->traverseForType($stmts, $callable, Use_::TYPE_NORMAL); - } - /** - * @param Stmt[] $stmts - * @param callable(UseUse $useUse, string $name): void $callable - */ - public function traverserStmtsForConstants(array $stmts, callable $callable) : void - { - $this->traverseForType($stmts, $callable, Use_::TYPE_CONSTANT); - } - /** - * @param Stmt[] $stmts - * @param callable(UseUse $useUse, string $name): void $callable - */ - public function traverserStmtsForFunctions(array $stmts, callable $callable) : void - { - $this->traverseForType($stmts, $callable, Use_::TYPE_FUNCTION); - } - /** - * @param callable(UseUse $useUse, string $name): void $callable - * @param Stmt[] $stmts - */ - private function traverseForType(array $stmts, callable $callable, int $desiredType) : void - { - $this->simpleCallableNodeTraverser->traverseNodesWithCallable($stmts, function (Node $node) use($callable, $desiredType) : ?int { + $this->simpleCallableNodeTraverser->traverseNodesWithCallable($stmts, function (Node $node) use($callable) : ?int { if ($node instanceof Namespace_ || $node instanceof FileWithoutNamespace) { // traverse into namespaces return null; } - if ($node instanceof Use_ && $node->type === $desiredType) { + if ($node instanceof Use_) { foreach ($node->uses as $useUse) { $name = $this->nodeNameResolver->getName($useUse); if ($name === null) { continue; } - $callable($useUse, $name); + $callable($node->type, $useUse, $name); } } elseif ($node instanceof GroupUse) { - $this->processGroupUse($node, $desiredType, $callable); + $this->processGroupUse($node, $callable); } return NodeTraverser::DONT_TRAVERSE_CURRENT_AND_CHILDREN; }); } /** - * @param callable(UseUse $useUse, string $name): void $callable + * @param callable(Use_::TYPE_* $useType, UseUse $useUse, string $name): void $callable */ - private function processGroupUse(GroupUse $groupUse, int $desiredType, callable $callable) : void + private function processGroupUse(GroupUse $groupUse, callable $callable) : void { if ($groupUse->type !== Use_::TYPE_UNKNOWN) { return; } $prefixName = $groupUse->prefix->toString(); foreach ($groupUse->uses as $useUse) { - if ($useUse->type !== $desiredType) { - continue; - } $name = $prefixName . '\\' . $this->nodeNameResolver->getName($useUse); - $callable($useUse, $name); + $callable($useUse->type, $useUse, $name); } } } diff --git a/rules/CodingStyle/ClassNameImport/UsedImportsResolver.php b/rules/CodingStyle/ClassNameImport/UsedImportsResolver.php index 8560a4e5dbc..f750838afb9 100644 --- a/rules/CodingStyle/ClassNameImport/UsedImportsResolver.php +++ b/rules/CodingStyle/ClassNameImport/UsedImportsResolver.php @@ -3,10 +3,12 @@ declare (strict_types=1); namespace Rector\CodingStyle\ClassNameImport; +use PhpParser\Node\Stmt\Use_; use PhpParser\Node\Identifier; use PhpParser\Node\Stmt; use PhpParser\Node\Stmt\Class_; use PhpParser\Node\Stmt\UseUse; +use Rector\CodingStyle\ClassNameImport\ValueObject\UsedImports; use Rector\Core\PhpParser\Node\BetterNodeFinder; use Rector\NodeNameResolver\NodeNameResolver; use Rector\StaticTypeMapper\ValueObject\Type\AliasedObjectType; @@ -36,9 +38,8 @@ final class UsedImportsResolver } /** * @param Stmt[] $stmts - * @return array */ - public function resolveForStmts(array $stmts) : array + public function resolveForStmts(array $stmts) : UsedImports { $usedImports = []; /** @var Class_|null $class */ @@ -49,37 +50,24 @@ final class UsedImportsResolver $className = (string) $this->nodeNameResolver->getName($class); $usedImports[] = new FullyQualifiedObjectType($className); } - $this->useImportsTraverser->traverserStmts($stmts, static function (UseUse $useUse, string $name) use(&$usedImports) : void { - if ($useUse->alias instanceof Identifier) { - $usedImports[] = new AliasedObjectType($useUse->alias->toString(), $name); - } else { - $usedImports[] = new FullyQualifiedObjectType($name); + $usedConstImports = []; + $usedFunctionImports = []; + /** @param Use_::TYPE_* $useType */ + $this->useImportsTraverser->traverserStmts($stmts, static function (int $useType, UseUse $useUse, string $name) use(&$usedImports, &$usedFunctionImports, &$usedConstImports) : void { + if ($useType === Use_::TYPE_NORMAL) { + if ($useUse->alias instanceof Identifier) { + $usedImports[] = new AliasedObjectType($useUse->alias->toString(), $name); + } else { + $usedImports[] = new FullyQualifiedObjectType($name); + } + } + if ($useType === Use_::TYPE_FUNCTION) { + $usedFunctionImports[] = new FullyQualifiedObjectType($name); + } + if ($useType === Use_::TYPE_CONSTANT) { + $usedConstImports[] = new FullyQualifiedObjectType($name); } }); - return $usedImports; - } - /** - * @param Stmt[] $stmts - * @return FullyQualifiedObjectType[] - */ - public function resolveConstantImportsForStmts(array $stmts) : array - { - $usedConstImports = []; - $this->useImportsTraverser->traverserStmtsForConstants($stmts, static function (UseUse $useUse, string $name) use(&$usedConstImports) : void { - $usedConstImports[] = new FullyQualifiedObjectType($name); - }); - return $usedConstImports; - } - /** - * @param Stmt[] $stmts - * @return FullyQualifiedObjectType[] - */ - public function resolveFunctionImportsForStmts(array $stmts) : array - { - $usedFunctionImports = []; - $this->useImportsTraverser->traverserStmtsForFunctions($stmts, static function (UseUse $useUse, string $name) use(&$usedFunctionImports) : void { - $usedFunctionImports[] = new FullyQualifiedObjectType($name); - }); - return $usedFunctionImports; + return new UsedImports($usedImports, $usedFunctionImports, $usedConstImports); } } diff --git a/rules/CodingStyle/ClassNameImport/ValueObject/UsedImports.php b/rules/CodingStyle/ClassNameImport/ValueObject/UsedImports.php new file mode 100644 index 00000000000..a60eb527f4a --- /dev/null +++ b/rules/CodingStyle/ClassNameImport/ValueObject/UsedImports.php @@ -0,0 +1,57 @@ + + * @readonly + */ + private $useImports; + /** + * @var FullyQualifiedObjectType[] + * @readonly + */ + private $functionImports; + /** + * @var FullyQualifiedObjectType[] + * @readonly + */ + private $constantImports; + /** + * @param array $useImports + * @param FullyQualifiedObjectType[] $functionImports + * @param FullyQualifiedObjectType[] $constantImports + */ + public function __construct(array $useImports, array $functionImports, array $constantImports) + { + $this->useImports = $useImports; + $this->functionImports = $functionImports; + $this->constantImports = $constantImports; + } + /** + * @return array + */ + public function getUseImports() : array + { + return $this->useImports; + } + /** + * @return FullyQualifiedObjectType[] + */ + public function getFunctionImports() : array + { + return $this->functionImports; + } + /** + * @return FullyQualifiedObjectType[] + */ + public function getConstantImports() : array + { + return $this->constantImports; + } +} diff --git a/src/Application/VersionResolver.php b/src/Application/VersionResolver.php index f88b8b37f89..d4da3ce5463 100644 --- a/src/Application/VersionResolver.php +++ b/src/Application/VersionResolver.php @@ -19,12 +19,12 @@ final class VersionResolver * @api * @var string */ - public const PACKAGE_VERSION = 'cbc632c1eda3f2b9aba3fba07b0f1b45cc58caec'; + public const PACKAGE_VERSION = 'aeba96a811638e3954028b70d8163c43a8866fa8'; /** * @api * @var string */ - public const RELEASE_DATE = '2023-09-12 18:55:31'; + public const RELEASE_DATE = '2023-09-12 14:35:11'; /** * @var int */ diff --git a/vendor/autoload.php b/vendor/autoload.php index a60c2e9deb5..28ba54cd8cc 100644 --- a/vendor/autoload.php +++ b/vendor/autoload.php @@ -22,4 +22,4 @@ if (PHP_VERSION_ID < 50600) { require_once __DIR__ . '/composer/autoload_real.php'; -return ComposerAutoloaderInitcf163137832100dcfaee9be37765beff::getLoader(); +return ComposerAutoloaderInit07977e21b93fabd68f9574de1dd036c6::getLoader(); diff --git a/vendor/composer/autoload_classmap.php b/vendor/composer/autoload_classmap.php index 2f7f4f21d0e..137149527db 100644 --- a/vendor/composer/autoload_classmap.php +++ b/vendor/composer/autoload_classmap.php @@ -1101,6 +1101,7 @@ return array( 'Rector\\CodingStyle\\ClassNameImport\\ShortNameResolver' => $baseDir . '/rules/CodingStyle/ClassNameImport/ShortNameResolver.php', 'Rector\\CodingStyle\\ClassNameImport\\UseImportsTraverser' => $baseDir . '/rules/CodingStyle/ClassNameImport/UseImportsTraverser.php', 'Rector\\CodingStyle\\ClassNameImport\\UsedImportsResolver' => $baseDir . '/rules/CodingStyle/ClassNameImport/UsedImportsResolver.php', + 'Rector\\CodingStyle\\ClassNameImport\\ValueObject\\UsedImports' => $baseDir . '/rules/CodingStyle/ClassNameImport/ValueObject/UsedImports.php', 'Rector\\CodingStyle\\Contract\\ClassNameImport\\ClassNameImportSkipVoterInterface' => $baseDir . '/rules/CodingStyle/Contract/ClassNameImport/ClassNameImportSkipVoterInterface.php', 'Rector\\CodingStyle\\Guard\\StaticGuard' => $baseDir . '/rules/CodingStyle/Guard/StaticGuard.php', 'Rector\\CodingStyle\\Naming\\ClassNaming' => $baseDir . '/rules/CodingStyle/Naming/ClassNaming.php', diff --git a/vendor/composer/autoload_real.php b/vendor/composer/autoload_real.php index 1b9c8b800a5..40dfe75c6f3 100644 --- a/vendor/composer/autoload_real.php +++ b/vendor/composer/autoload_real.php @@ -2,7 +2,7 @@ // autoload_real.php @generated by Composer -class ComposerAutoloaderInitcf163137832100dcfaee9be37765beff +class ComposerAutoloaderInit07977e21b93fabd68f9574de1dd036c6 { private static $loader; @@ -22,17 +22,17 @@ class ComposerAutoloaderInitcf163137832100dcfaee9be37765beff return self::$loader; } - spl_autoload_register(array('ComposerAutoloaderInitcf163137832100dcfaee9be37765beff', 'loadClassLoader'), true, true); + spl_autoload_register(array('ComposerAutoloaderInit07977e21b93fabd68f9574de1dd036c6', 'loadClassLoader'), true, true); self::$loader = $loader = new \Composer\Autoload\ClassLoader(\dirname(__DIR__)); - spl_autoload_unregister(array('ComposerAutoloaderInitcf163137832100dcfaee9be37765beff', 'loadClassLoader')); + spl_autoload_unregister(array('ComposerAutoloaderInit07977e21b93fabd68f9574de1dd036c6', 'loadClassLoader')); require __DIR__ . '/autoload_static.php'; - call_user_func(\Composer\Autoload\ComposerStaticInitcf163137832100dcfaee9be37765beff::getInitializer($loader)); + call_user_func(\Composer\Autoload\ComposerStaticInit07977e21b93fabd68f9574de1dd036c6::getInitializer($loader)); $loader->setClassMapAuthoritative(true); $loader->register(true); - $filesToLoad = \Composer\Autoload\ComposerStaticInitcf163137832100dcfaee9be37765beff::$files; + $filesToLoad = \Composer\Autoload\ComposerStaticInit07977e21b93fabd68f9574de1dd036c6::$files; $requireFile = \Closure::bind(static function ($fileIdentifier, $file) { if (empty($GLOBALS['__composer_autoload_files'][$fileIdentifier])) { $GLOBALS['__composer_autoload_files'][$fileIdentifier] = true; diff --git a/vendor/composer/autoload_static.php b/vendor/composer/autoload_static.php index 1beb34ff574..944b791297c 100644 --- a/vendor/composer/autoload_static.php +++ b/vendor/composer/autoload_static.php @@ -4,7 +4,7 @@ namespace Composer\Autoload; -class ComposerStaticInitcf163137832100dcfaee9be37765beff +class ComposerStaticInit07977e21b93fabd68f9574de1dd036c6 { public static $files = array ( 'ad155f8f1cf0d418fe49e248db8c661b' => __DIR__ . '/..' . '/react/promise/src/functions_include.php', @@ -1321,6 +1321,7 @@ class ComposerStaticInitcf163137832100dcfaee9be37765beff 'Rector\\CodingStyle\\ClassNameImport\\ShortNameResolver' => __DIR__ . '/../..' . '/rules/CodingStyle/ClassNameImport/ShortNameResolver.php', 'Rector\\CodingStyle\\ClassNameImport\\UseImportsTraverser' => __DIR__ . '/../..' . '/rules/CodingStyle/ClassNameImport/UseImportsTraverser.php', 'Rector\\CodingStyle\\ClassNameImport\\UsedImportsResolver' => __DIR__ . '/../..' . '/rules/CodingStyle/ClassNameImport/UsedImportsResolver.php', + 'Rector\\CodingStyle\\ClassNameImport\\ValueObject\\UsedImports' => __DIR__ . '/../..' . '/rules/CodingStyle/ClassNameImport/ValueObject/UsedImports.php', 'Rector\\CodingStyle\\Contract\\ClassNameImport\\ClassNameImportSkipVoterInterface' => __DIR__ . '/../..' . '/rules/CodingStyle/Contract/ClassNameImport/ClassNameImportSkipVoterInterface.php', 'Rector\\CodingStyle\\Guard\\StaticGuard' => __DIR__ . '/../..' . '/rules/CodingStyle/Guard/StaticGuard.php', 'Rector\\CodingStyle\\Naming\\ClassNaming' => __DIR__ . '/../..' . '/rules/CodingStyle/Naming/ClassNaming.php', @@ -2592,9 +2593,9 @@ class ComposerStaticInitcf163137832100dcfaee9be37765beff public static function getInitializer(ClassLoader $loader) { return \Closure::bind(function () use ($loader) { - $loader->prefixLengthsPsr4 = ComposerStaticInitcf163137832100dcfaee9be37765beff::$prefixLengthsPsr4; - $loader->prefixDirsPsr4 = ComposerStaticInitcf163137832100dcfaee9be37765beff::$prefixDirsPsr4; - $loader->classMap = ComposerStaticInitcf163137832100dcfaee9be37765beff::$classMap; + $loader->prefixLengthsPsr4 = ComposerStaticInit07977e21b93fabd68f9574de1dd036c6::$prefixLengthsPsr4; + $loader->prefixDirsPsr4 = ComposerStaticInit07977e21b93fabd68f9574de1dd036c6::$prefixDirsPsr4; + $loader->classMap = ComposerStaticInit07977e21b93fabd68f9574de1dd036c6::$classMap; }, null, ClassLoader::class); }