From 5d1a9e059950a5a0bf7c809438bf753bc7609ac1 Mon Sep 17 00:00:00 2001 From: Abdul Malik Ikhsan Date: Wed, 10 Sep 2025 18:54:30 +0700 Subject: [PATCH 1/3] [AutoImport] Allow on FQCN current same class (part 2) --- .../ClassLikeNameClassNameImportSkipVoter.php | 20 ++++++++++++++++++- 1 file changed, 19 insertions(+), 1 deletion(-) diff --git a/rules/CodingStyle/ClassNameImport/ClassNameImportSkipVoter/ClassLikeNameClassNameImportSkipVoter.php b/rules/CodingStyle/ClassNameImport/ClassNameImportSkipVoter/ClassLikeNameClassNameImportSkipVoter.php index 2f5dbeeb3b2..da2abe53d51 100644 --- a/rules/CodingStyle/ClassNameImport/ClassNameImportSkipVoter/ClassLikeNameClassNameImportSkipVoter.php +++ b/rules/CodingStyle/ClassNameImport/ClassNameImportSkipVoter/ClassLikeNameClassNameImportSkipVoter.php @@ -5,8 +5,10 @@ namespace Rector\CodingStyle\ClassNameImport\ClassNameImportSkipVoter; use PhpParser\Node; +use PHPStan\Analyser\Scope; use Rector\CodingStyle\ClassNameImport\ShortNameResolver; use Rector\CodingStyle\Contract\ClassNameImport\ClassNameImportSkipVoterInterface; +use Rector\NodeTypeResolver\Node\AttributeKey; use Rector\StaticTypeMapper\ValueObject\Type\FullyQualifiedObjectType; use Rector\ValueObject\Application\File; @@ -33,9 +35,25 @@ public function shouldSkip(File $file, FullyQualifiedObjectType $fullyQualifiedO return false; } + $scope = $node->getAttribute(AttributeKey::SCOPE); + $namespace = $scope instanceof Scope ? $scope->getNamespace() : null; + $namespace = strtolower((string) $namespace); + $shortNameLowered = $fullyQualifiedObjectType->getShortNameLowered(); + $fullyQualifiedObjectTypeNamespace = strtolower( + substr($fullyQualifiedObjectType->getClassName(), 0, -strlen($fullyQualifiedObjectType->getShortName()) - 1) + ); + foreach ($classLikeNames as $classLikeName) { - if (strtolower($classLikeName) === $shortNameLowered) { + if (strtolower($classLikeName) !== $shortNameLowered) { + continue; + } + + if ($namespace === '') { + return true; + } + + if ($namespace !== $fullyQualifiedObjectTypeNamespace) { return true; } } From e02dbda5737f8555490ca4e29a012dd2b6eaa859 Mon Sep 17 00:00:00 2001 From: Abdul Malik Ikhsan Date: Wed, 10 Sep 2025 18:54:33 +0700 Subject: [PATCH 2/3] [AutoImport] Allow on FQCN current same class (part 2) --- .../Fixture/fqcn_current_same_class.php.inc | 21 +++++++++++++++++++ 1 file changed, 21 insertions(+) create mode 100644 tests/Issues/AutoImport/Fixture/fqcn_current_same_class.php.inc diff --git a/tests/Issues/AutoImport/Fixture/fqcn_current_same_class.php.inc b/tests/Issues/AutoImport/Fixture/fqcn_current_same_class.php.inc new file mode 100644 index 00000000000..bdab86555ff --- /dev/null +++ b/tests/Issues/AutoImport/Fixture/fqcn_current_same_class.php.inc @@ -0,0 +1,21 @@ + +----- + From 140480b0f84e2bfa07a904e837485edfd69adfd5 Mon Sep 17 00:00:00 2001 From: Abdul Malik Ikhsan Date: Wed, 10 Sep 2025 18:56:08 +0700 Subject: [PATCH 3/3] add note: ensure future not forget about it --- .../ClassLikeNameClassNameImportSkipVoter.php | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/rules/CodingStyle/ClassNameImport/ClassNameImportSkipVoter/ClassLikeNameClassNameImportSkipVoter.php b/rules/CodingStyle/ClassNameImport/ClassNameImportSkipVoter/ClassLikeNameClassNameImportSkipVoter.php index da2abe53d51..fb522f0ecbd 100644 --- a/rules/CodingStyle/ClassNameImport/ClassNameImportSkipVoter/ClassLikeNameClassNameImportSkipVoter.php +++ b/rules/CodingStyle/ClassNameImport/ClassNameImportSkipVoter/ClassLikeNameClassNameImportSkipVoter.php @@ -35,6 +35,12 @@ public function shouldSkip(File $file, FullyQualifiedObjectType $fullyQualifiedO return false; } + /** + * Note: Don't use ScopeFetcher::fetch() on Name instance, + * Scope can be null on Name + * This is part of ScopeAnalyzer::NON_REFRESHABLE_NODES + * @see https://github.com/rectorphp/rector-src/blob/9929af7c0179929b4fde6915cb7a06c3141dde6c/src/NodeAnalyzer/ScopeAnalyzer.php#L17 + */ $scope = $node->getAttribute(AttributeKey::SCOPE); $namespace = $scope instanceof Scope ? $scope->getNamespace() : null; $namespace = strtolower((string) $namespace);