diff --git a/packages/NodeTypeResolver/PhpDocNodeVisitor/ClassRenamePhpDocNodeVisitor.php b/packages/NodeTypeResolver/PhpDocNodeVisitor/ClassRenamePhpDocNodeVisitor.php index d02815c8563..8251193a8ce 100644 --- a/packages/NodeTypeResolver/PhpDocNodeVisitor/ClassRenamePhpDocNodeVisitor.php +++ b/packages/NodeTypeResolver/PhpDocNodeVisitor/ClassRenamePhpDocNodeVisitor.php @@ -15,8 +15,6 @@ use PHPStan\Type\ObjectType; use PHPStan\Type\Type; use Rector\BetterPhpDocParser\ValueObject\PhpDocAttributeKey; -use Rector\Core\Configuration\Option; -use Rector\Core\Configuration\Parameter\SimpleParameterProvider; use Rector\Core\Exception\ShouldNotHappenException; use Rector\Naming\Naming\UseImportsResolver; use Rector\NodeTypeResolver\Node\AttributeKey; @@ -78,14 +76,6 @@ public function enterNode(Node $node): ?Node $identifier->name = $this->resolveNamespacedName($identifier, $currentPhpNode, $node->name); $staticType = $this->staticTypeMapper->mapPHPStanPhpDocTypeNodeToPHPStanType($identifier, $currentPhpNode); - $shouldImport = SimpleParameterProvider::provideBoolParameter(Option::AUTO_IMPORT_NAMES); - $isNoNamespacedName = ! str_starts_with($identifier->name, '\\') && substr_count($identifier->name, '\\') === 0; - - // tweak overlapped import + rename - if ($shouldImport && $isNoNamespacedName) { - return null; - } - // make sure to compare FQNs $objectType = $this->expandShortenedObjectType($staticType); foreach ($this->oldToNewTypes as $oldToNewType) { diff --git a/rules-tests/Renaming/Rector/Name/RenameClassRector/FixtureAutoImportNamesWithoutRemoveUnusedImport/rename_docblock.php.inc b/rules-tests/Renaming/Rector/Name/RenameClassRector/FixtureAutoImportNamesWithoutRemoveUnusedImport/rename_docblock.php.inc new file mode 100644 index 00000000000..baacbbef7d7 --- /dev/null +++ b/rules-tests/Renaming/Rector/Name/RenameClassRector/FixtureAutoImportNamesWithoutRemoveUnusedImport/rename_docblock.php.inc @@ -0,0 +1,21 @@ +get('Foo'); + +?> +----- +get('Foo'); + +?> diff --git a/rules-tests/Renaming/Rector/Name/RenameClassRector/FixtureAutoImportNamesWithoutRemoveUnusedImport/rename_docblock2.php.inc b/rules-tests/Renaming/Rector/Name/RenameClassRector/FixtureAutoImportNamesWithoutRemoveUnusedImport/rename_docblock2.php.inc new file mode 100644 index 00000000000..96ed11cb2fd --- /dev/null +++ b/rules-tests/Renaming/Rector/Name/RenameClassRector/FixtureAutoImportNamesWithoutRemoveUnusedImport/rename_docblock2.php.inc @@ -0,0 +1,25 @@ +get('Foo'); +} + +?> +----- +get('Foo'); +} + +?> diff --git a/rules-tests/Renaming/Rector/Name/RenameClassRector/FixtureAutoImportNamesWithoutRemoveUnusedImport/rename_docblock3.php.inc b/rules-tests/Renaming/Rector/Name/RenameClassRector/FixtureAutoImportNamesWithoutRemoveUnusedImport/rename_docblock3.php.inc new file mode 100644 index 00000000000..831c159b5b6 --- /dev/null +++ b/rules-tests/Renaming/Rector/Name/RenameClassRector/FixtureAutoImportNamesWithoutRemoveUnusedImport/rename_docblock3.php.inc @@ -0,0 +1,25 @@ +get('Foo'); +} + +?> +----- +get('Foo'); +} + +?> diff --git a/rules-tests/Renaming/Rector/Name/RenameClassRector/FixtureAutoImportNamesWithoutRemoveUnusedImport/rename_docblock4.php.inc b/rules-tests/Renaming/Rector/Name/RenameClassRector/FixtureAutoImportNamesWithoutRemoveUnusedImport/rename_docblock4.php.inc new file mode 100644 index 00000000000..bdefe046686 --- /dev/null +++ b/rules-tests/Renaming/Rector/Name/RenameClassRector/FixtureAutoImportNamesWithoutRemoveUnusedImport/rename_docblock4.php.inc @@ -0,0 +1,25 @@ +format('Y-m-d'); +} + +?> +----- +format('Y-m-d'); +} + +?> diff --git a/rules-tests/Renaming/Rector/Name/RenameClassRector/config/auto_import_names_without_remove_unused_use.php b/rules-tests/Renaming/Rector/Name/RenameClassRector/config/auto_import_names_without_remove_unused_use.php index c72ee009072..5d330b85eba 100644 --- a/rules-tests/Renaming/Rector/Name/RenameClassRector/config/auto_import_names_without_remove_unused_use.php +++ b/rules-tests/Renaming/Rector/Name/RenameClassRector/config/auto_import_names_without_remove_unused_use.php @@ -10,5 +10,6 @@ $rectorConfig->ruleWithConfiguration(RenameClassRector::class, [ 'Interop\Container\ContainerInterface' => 'Psr\Container\ContainerInterface', + 'DateTime' => 'DateTimeInterface', ]); }; diff --git a/rules/CodingStyle/ClassNameImport/ClassNameImportSkipVoter/FullyQualifiedNameClassNameImportSkipVoter.php b/rules/CodingStyle/ClassNameImport/ClassNameImportSkipVoter/FullyQualifiedNameClassNameImportSkipVoter.php index 0b8e9bf8175..a25a536c304 100644 --- a/rules/CodingStyle/ClassNameImport/ClassNameImportSkipVoter/FullyQualifiedNameClassNameImportSkipVoter.php +++ b/rules/CodingStyle/ClassNameImport/ClassNameImportSkipVoter/FullyQualifiedNameClassNameImportSkipVoter.php @@ -4,6 +4,7 @@ namespace Rector\CodingStyle\ClassNameImport\ClassNameImportSkipVoter; +use Nette\Utils\Strings; use PhpParser\Node; use Rector\CodingStyle\ClassNameImport\ShortNameResolver; use Rector\CodingStyle\Contract\ClassNameImport\ClassNameImportSkipVoterInterface; @@ -34,17 +35,30 @@ public function shouldSkip(File $file, FullyQualifiedObjectType $fullyQualifiedO /** @var array $shortNamesToFullyQualifiedNames */ $shortNamesToFullyQualifiedNames = $this->shortNameResolver->resolveFromFile($file); $removedUses = $this->renamedClassesDataCollector->getOldClasses(); + $fullyQualifiedObjectTypeShortName = $fullyQualifiedObjectType->getShortName(); + $className = $fullyQualifiedObjectType->getClassName(); foreach ($shortNamesToFullyQualifiedNames as $shortName => $fullyQualifiedName) { - if ($fullyQualifiedObjectType->getShortName() !== $shortName) { + if ($fullyQualifiedObjectTypeShortName !== $shortName) { + $shortName = str_starts_with($shortName, '\\') + ? ltrim((string) Strings::after($shortName, '\\', -1)) + : $shortName; + } + + if ($fullyQualifiedObjectTypeShortName !== $shortName) { continue; } + $fullyQualifiedName = ltrim($fullyQualifiedName, '\\'); + if ($className === $fullyQualifiedName) { + return false; + } + if (in_array($fullyQualifiedName, $removedUses, true)) { - continue; + return false; } - return $fullyQualifiedObjectType->getClassName() !== $fullyQualifiedName; + return str_contains($fullyQualifiedName, '\\'); } return false;