diff --git a/packages/PostRector/Rector/NameImportingPostRector.php b/packages/PostRector/Rector/NameImportingPostRector.php index 1f9b8a323fa..490137cab66 100644 --- a/packages/PostRector/Rector/NameImportingPostRector.php +++ b/packages/PostRector/Rector/NameImportingPostRector.php @@ -129,9 +129,6 @@ final class NameImportingPostRector extends \Rector\PostRector\Rector\AbstractPo $currentUses = $this->useImportsResolver->resolve(); if ($this->classNameImportSkipper->shouldImportName($name, $currentUses)) { $nameInUse = $this->resolveNameInUse($name, $currentUses); - if ($nameInUse instanceof FullyQualified) { - return null; - } if ($nameInUse instanceof Name) { return $nameInUse; } @@ -141,9 +138,8 @@ final class NameImportingPostRector extends \Rector\PostRector\Rector\AbstractPo } /** * @param Use_[]|GroupUse[] $currentUses - * @return null|\PhpParser\Node\Name|\PhpParser\Node\Name\FullyQualified */ - private function resolveNameInUse(Name $name, array $currentUses) + private function resolveNameInUse(Name $name, array $currentUses) : ?\PhpParser\Node\Name { $originalName = $name->getAttribute(AttributeKey::ORIGINAL_NAME); if (!$originalName instanceof FullyQualified) { @@ -153,17 +149,16 @@ final class NameImportingPostRector extends \Rector\PostRector\Rector\AbstractPo if (\is_string($aliasName)) { return new Name($aliasName); } - $isShortFullyQualifiedName = \substr_count($name->toCodeString(), '\\') === 1; - if (!$isShortFullyQualifiedName) { - return $this->resolveLongNameInUseName($name, $currentUses); - } - return $this->resolveConflictedShortNameInUse($name, $currentUses); + return $this->resolveLongNameInUseName($name, $currentUses); } /** * @param Use_[]|GroupUse[] $currentUses */ private function resolveLongNameInUseName(Name $name, array $currentUses) : ?Name { + if (\substr_count($name->toCodeString(), '\\') === 1) { + return null; + } $lastName = $name->getLast(); foreach ($currentUses as $currentUse) { foreach ($currentUse->uses as $useUse) { @@ -177,25 +172,4 @@ final class NameImportingPostRector extends \Rector\PostRector\Rector\AbstractPo } return null; } - /** - * @param Use_[]|GroupUse[] $currentUses - */ - private function resolveConflictedShortNameInUse(Name $name, array $currentUses) : ?FullyQualified - { - $currentName = $name->toString(); - foreach ($currentUses as $currentUse) { - $prefix = $this->useImportsResolver->resolvePrefix($currentUse); - foreach ($currentUse->uses as $useUse) { - $useName = $prefix . $name->toString(); - $lastUseName = $name->getLast(); - if (!$useUse->alias instanceof Identifier && $useName !== $currentName && $lastUseName === $currentName) { - return new FullyQualified($currentName); - } - if ($useUse->alias instanceof Identifier && $useUse->alias->toString() === $currentName) { - return new FullyQualified($currentName); - } - } - } - return null; - } } diff --git a/rules/CodingStyle/ClassNameImport/ClassNameImportSkipper.php b/rules/CodingStyle/ClassNameImport/ClassNameImportSkipper.php index bba9a6a94b7..5f01bd47668 100644 --- a/rules/CodingStyle/ClassNameImport/ClassNameImportSkipper.php +++ b/rules/CodingStyle/ClassNameImport/ClassNameImportSkipper.php @@ -4,6 +4,7 @@ declare (strict_types=1); namespace Rector\CodingStyle\ClassNameImport; use PhpParser\Node; +use PhpParser\Node\Identifier; use PhpParser\Node\Name; use PhpParser\Node\Stmt\GroupUse; use PhpParser\Node\Stmt\Use_; @@ -57,9 +58,11 @@ final class ClassNameImportSkipper return \true; } $stringName = $name->toString(); - $nameLastName = \strtolower($name->getLast()); + $lastUseName = $name->getLast(); + $nameLastName = \strtolower($lastUseName); foreach ($uses as $use) { $prefix = $this->useImportsResolver->resolvePrefix($use); + $useName = $prefix . $stringName; foreach ($use->uses as $useUse) { $useUseLastName = \strtolower($useUse->name->getLast()); if ($useUseLastName !== $nameLastName) { @@ -68,11 +71,21 @@ final class ClassNameImportSkipper if ($this->isJustRenamedClass($stringName, $prefix, $useUse)) { continue; } + if ($this->isConflictedShortNameInUse($useUse, $useName, $lastUseName, $stringName)) { + return \false; + } return $prefix . $useUse->name->toString() === $stringName; } } return \true; } + private function isConflictedShortNameInUse(UseUse $useUse, string $useName, string $lastUseName, string $stringName) : bool + { + if (!$useUse->alias instanceof Identifier && $useName !== $stringName && $lastUseName === $stringName) { + return \true; + } + return $useUse->alias instanceof Identifier && $useUse->alias->toString() === $stringName; + } private function isJustRenamedClass(string $stringName, string $prefix, UseUse $useUse) : bool { $useUseNameString = $prefix . $useUse->name->toString(); diff --git a/src/Application/VersionResolver.php b/src/Application/VersionResolver.php index 68b00dafc7b..ea33f235ea5 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 = 'c9e0823ef35b56b8cc78005c90d7462688d44c09'; + public const PACKAGE_VERSION = '478b257792be25a6f32e1a7bf672d33d2832a574'; /** * @api * @var string */ - public const RELEASE_DATE = '2023-10-02 18:07:50'; + public const RELEASE_DATE = '2023-10-02 22:38:10'; /** * @var int */