From 3e495aae4c8e97a935972fb9090c5e333f784f94 Mon Sep 17 00:00:00 2001 From: Abdul Malik Ikhsan Date: Thu, 2 Nov 2023 15:23:42 +0700 Subject: [PATCH 01/10] [AutoImport] Allow auto import just renamed @var only docblock on RenameClassRector without removeUnusedImports() enabled --- .../rename_docblock.php.inc | 21 +++++++++++++++++++ 1 file changed, 21 insertions(+) create mode 100644 rules-tests/Renaming/Rector/Name/RenameClassRector/FixtureAutoImportNamesWithoutRemoveUnusedImport/rename_docblock.php.inc 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'); + +?> From 790834f54329d3693886a7e99bd137c3638c1080 Mon Sep 17 00:00:00 2001 From: Abdul Malik Ikhsan Date: Thu, 2 Nov 2023 19:33:05 +0700 Subject: [PATCH 02/10] Fixed :tada: --- .../FullyQualifiedNameClassNameImportSkipVoter.php | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/rules/CodingStyle/ClassNameImport/ClassNameImportSkipVoter/FullyQualifiedNameClassNameImportSkipVoter.php b/rules/CodingStyle/ClassNameImport/ClassNameImportSkipVoter/FullyQualifiedNameClassNameImportSkipVoter.php index 0b8e9bf8175..faae2007f55 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,14 +35,22 @@ public function shouldSkip(File $file, FullyQualifiedObjectType $fullyQualifiedO /** @var array $shortNamesToFullyQualifiedNames */ $shortNamesToFullyQualifiedNames = $this->shortNameResolver->resolveFromFile($file); $removedUses = $this->renamedClassesDataCollector->getOldClasses(); + $fullyQualifiedObjectTypeShortName = $fullyQualifiedObjectType->getShortName(); foreach ($shortNamesToFullyQualifiedNames as $shortName => $fullyQualifiedName) { - if ($fullyQualifiedObjectType->getShortName() !== $shortName) { + if ($fullyQualifiedObjectTypeShortName !== $shortName) { + $shortName = str_contains($shortName, '\\') + ? ltrim(Strings::after($shortName, '\\', -1)) + : $shortName; + } + + if ($fullyQualifiedObjectTypeShortName !== $shortName) { continue; } + $fullyQualifiedName = ltrim($fullyQualifiedName, '\\'); if (in_array($fullyQualifiedName, $removedUses, true)) { - continue; + return false; } return $fullyQualifiedObjectType->getClassName() !== $fullyQualifiedName; From 29f2b4dcb3ab483392184290a2d738ef7a02351f Mon Sep 17 00:00:00 2001 From: Abdul Malik Ikhsan Date: Thu, 2 Nov 2023 20:42:33 +0700 Subject: [PATCH 03/10] add more fixture --- .../rename_docblock2.php.inc | 25 +++++++++++++++++++ ...yQualifiedNameClassNameImportSkipVoter.php | 2 +- 2 files changed, 26 insertions(+), 1 deletion(-) create mode 100644 rules-tests/Renaming/Rector/Name/RenameClassRector/FixtureAutoImportNamesWithoutRemoveUnusedImport/rename_docblock2.php.inc 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/CodingStyle/ClassNameImport/ClassNameImportSkipVoter/FullyQualifiedNameClassNameImportSkipVoter.php b/rules/CodingStyle/ClassNameImport/ClassNameImportSkipVoter/FullyQualifiedNameClassNameImportSkipVoter.php index faae2007f55..158e93d1f9c 100644 --- a/rules/CodingStyle/ClassNameImport/ClassNameImportSkipVoter/FullyQualifiedNameClassNameImportSkipVoter.php +++ b/rules/CodingStyle/ClassNameImport/ClassNameImportSkipVoter/FullyQualifiedNameClassNameImportSkipVoter.php @@ -40,7 +40,7 @@ public function shouldSkip(File $file, FullyQualifiedObjectType $fullyQualifiedO foreach ($shortNamesToFullyQualifiedNames as $shortName => $fullyQualifiedName) { if ($fullyQualifiedObjectTypeShortName !== $shortName) { $shortName = str_contains($shortName, '\\') - ? ltrim(Strings::after($shortName, '\\', -1)) + ? ltrim((string) Strings::after($shortName, '\\', -1)) : $shortName; } From 66540ae7ae5e67ceb89fd3ada132888bd4d08f48 Mon Sep 17 00:00:00 2001 From: Abdul Malik Ikhsan Date: Fri, 3 Nov 2023 14:45:05 +0700 Subject: [PATCH 04/10] fix --- .../FullyQualifiedNameClassNameImportSkipVoter.php | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/rules/CodingStyle/ClassNameImport/ClassNameImportSkipVoter/FullyQualifiedNameClassNameImportSkipVoter.php b/rules/CodingStyle/ClassNameImport/ClassNameImportSkipVoter/FullyQualifiedNameClassNameImportSkipVoter.php index 158e93d1f9c..e361cee33e5 100644 --- a/rules/CodingStyle/ClassNameImport/ClassNameImportSkipVoter/FullyQualifiedNameClassNameImportSkipVoter.php +++ b/rules/CodingStyle/ClassNameImport/ClassNameImportSkipVoter/FullyQualifiedNameClassNameImportSkipVoter.php @@ -53,6 +53,10 @@ public function shouldSkip(File $file, FullyQualifiedObjectType $fullyQualifiedO return false; } + if (! str_contains($fullyQualifiedName, '\\')) { + return $shortName !== $fullyQualifiedName; + } + return $fullyQualifiedObjectType->getClassName() !== $fullyQualifiedName; } From d41c3fa19113396515ff1850c38b521de22845b4 Mon Sep 17 00:00:00 2001 From: Abdul Malik Ikhsan Date: Fri, 3 Nov 2023 14:47:56 +0700 Subject: [PATCH 05/10] more fixture --- .../rename_docblock3.php.inc | 25 +++++++++++++++++++ 1 file changed, 25 insertions(+) create mode 100644 rules-tests/Renaming/Rector/Name/RenameClassRector/FixtureAutoImportNamesWithoutRemoveUnusedImport/rename_docblock3.php.inc 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'); +} + +?> From 1833a755f9bf175415b3b1dd466b29cb4d056802 Mon Sep 17 00:00:00 2001 From: Abdul Malik Ikhsan Date: Fri, 3 Nov 2023 14:53:10 +0700 Subject: [PATCH 06/10] use str_start_with() to make by use case fixture match --- .../FullyQualifiedNameClassNameImportSkipVoter.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/rules/CodingStyle/ClassNameImport/ClassNameImportSkipVoter/FullyQualifiedNameClassNameImportSkipVoter.php b/rules/CodingStyle/ClassNameImport/ClassNameImportSkipVoter/FullyQualifiedNameClassNameImportSkipVoter.php index e361cee33e5..7d3242d3134 100644 --- a/rules/CodingStyle/ClassNameImport/ClassNameImportSkipVoter/FullyQualifiedNameClassNameImportSkipVoter.php +++ b/rules/CodingStyle/ClassNameImport/ClassNameImportSkipVoter/FullyQualifiedNameClassNameImportSkipVoter.php @@ -39,7 +39,7 @@ public function shouldSkip(File $file, FullyQualifiedObjectType $fullyQualifiedO foreach ($shortNamesToFullyQualifiedNames as $shortName => $fullyQualifiedName) { if ($fullyQualifiedObjectTypeShortName !== $shortName) { - $shortName = str_contains($shortName, '\\') + $shortName = str_starts_with($shortName, '\\') ? ltrim((string) Strings::after($shortName, '\\', -1)) : $shortName; } From 7db3799eba526a671c42ee233c1641d96006471a Mon Sep 17 00:00:00 2001 From: Abdul Malik Ikhsan Date: Fri, 3 Nov 2023 14:59:18 +0700 Subject: [PATCH 07/10] fix --- .../FullyQualifiedNameClassNameImportSkipVoter.php | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/rules/CodingStyle/ClassNameImport/ClassNameImportSkipVoter/FullyQualifiedNameClassNameImportSkipVoter.php b/rules/CodingStyle/ClassNameImport/ClassNameImportSkipVoter/FullyQualifiedNameClassNameImportSkipVoter.php index 7d3242d3134..f66ae16cf2f 100644 --- a/rules/CodingStyle/ClassNameImport/ClassNameImportSkipVoter/FullyQualifiedNameClassNameImportSkipVoter.php +++ b/rules/CodingStyle/ClassNameImport/ClassNameImportSkipVoter/FullyQualifiedNameClassNameImportSkipVoter.php @@ -36,6 +36,7 @@ public function shouldSkip(File $file, FullyQualifiedObjectType $fullyQualifiedO $shortNamesToFullyQualifiedNames = $this->shortNameResolver->resolveFromFile($file); $removedUses = $this->renamedClassesDataCollector->getOldClasses(); $fullyQualifiedObjectTypeShortName = $fullyQualifiedObjectType->getShortName(); + $className = $fullyQualifiedObjectType->getClassName(); foreach ($shortNamesToFullyQualifiedNames as $shortName => $fullyQualifiedName) { if ($fullyQualifiedObjectTypeShortName !== $shortName) { @@ -53,11 +54,9 @@ public function shouldSkip(File $file, FullyQualifiedObjectType $fullyQualifiedO return false; } - if (! str_contains($fullyQualifiedName, '\\')) { - return $shortName !== $fullyQualifiedName; + if (str_contains($fullyQualifiedName, '\\')) { + return $className !== $fullyQualifiedName; } - - return $fullyQualifiedObjectType->getClassName() !== $fullyQualifiedName; } return false; From f86e3a5bd17328793f49952e6df430d22526c9a4 Mon Sep 17 00:00:00 2001 From: Abdul Malik Ikhsan Date: Fri, 3 Nov 2023 15:00:03 +0700 Subject: [PATCH 08/10] fix --- .../FullyQualifiedNameClassNameImportSkipVoter.php | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/rules/CodingStyle/ClassNameImport/ClassNameImportSkipVoter/FullyQualifiedNameClassNameImportSkipVoter.php b/rules/CodingStyle/ClassNameImport/ClassNameImportSkipVoter/FullyQualifiedNameClassNameImportSkipVoter.php index f66ae16cf2f..ce895ef6232 100644 --- a/rules/CodingStyle/ClassNameImport/ClassNameImportSkipVoter/FullyQualifiedNameClassNameImportSkipVoter.php +++ b/rules/CodingStyle/ClassNameImport/ClassNameImportSkipVoter/FullyQualifiedNameClassNameImportSkipVoter.php @@ -54,9 +54,11 @@ public function shouldSkip(File $file, FullyQualifiedObjectType $fullyQualifiedO return false; } - if (str_contains($fullyQualifiedName, '\\')) { - return $className !== $fullyQualifiedName; + if (! str_contains($fullyQualifiedName, '\\')) { + return false; } + + return $className !== $fullyQualifiedName; } return false; From ca0571e3596a6daf8df5790cb069d09ce214f42c Mon Sep 17 00:00:00 2001 From: Abdul Malik Ikhsan Date: Fri, 3 Nov 2023 15:02:19 +0700 Subject: [PATCH 09/10] add fixture for @var DateTime to DateTimeInterface --- .../rename_docblock4.php.inc | 25 +++++++++++++++++++ ...import_names_without_remove_unused_use.php | 1 + 2 files changed, 26 insertions(+) create mode 100644 rules-tests/Renaming/Rector/Name/RenameClassRector/FixtureAutoImportNamesWithoutRemoveUnusedImport/rename_docblock4.php.inc 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', ]); }; From 26667c5c8c443ec0ef00df0789c358864dd0ddd7 Mon Sep 17 00:00:00 2001 From: Abdul Malik Ikhsan Date: Fri, 3 Nov 2023 15:33:16 +0700 Subject: [PATCH 10/10] Fix --- .../PhpDocNodeVisitor/ClassRenamePhpDocNodeVisitor.php | 10 ---------- .../FullyQualifiedNameClassNameImportSkipVoter.php | 6 +++--- 2 files changed, 3 insertions(+), 13 deletions(-) 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/CodingStyle/ClassNameImport/ClassNameImportSkipVoter/FullyQualifiedNameClassNameImportSkipVoter.php b/rules/CodingStyle/ClassNameImport/ClassNameImportSkipVoter/FullyQualifiedNameClassNameImportSkipVoter.php index ce895ef6232..a25a536c304 100644 --- a/rules/CodingStyle/ClassNameImport/ClassNameImportSkipVoter/FullyQualifiedNameClassNameImportSkipVoter.php +++ b/rules/CodingStyle/ClassNameImport/ClassNameImportSkipVoter/FullyQualifiedNameClassNameImportSkipVoter.php @@ -50,15 +50,15 @@ public function shouldSkip(File $file, FullyQualifiedObjectType $fullyQualifiedO } $fullyQualifiedName = ltrim($fullyQualifiedName, '\\'); - if (in_array($fullyQualifiedName, $removedUses, true)) { + if ($className === $fullyQualifiedName) { return false; } - if (! str_contains($fullyQualifiedName, '\\')) { + if (in_array($fullyQualifiedName, $removedUses, true)) { return false; } - return $className !== $fullyQualifiedName; + return str_contains($fullyQualifiedName, '\\'); } return false;