From 12f7b6025842ef2a66befd345e847cc8f947c4dd Mon Sep 17 00:00:00 2001 From: Abdul Malik Ikhsan Date: Wed, 8 Oct 2025 14:19:29 +0700 Subject: [PATCH 1/9] verify string equal first before substr with negative -1 --- .../ClassLikeNameClassNameImportSkipVoter.php | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/rules/CodingStyle/ClassNameImport/ClassNameImportSkipVoter/ClassLikeNameClassNameImportSkipVoter.php b/rules/CodingStyle/ClassNameImport/ClassNameImportSkipVoter/ClassLikeNameClassNameImportSkipVoter.php index 3030cdb8275..895a279ce0c 100644 --- a/rules/CodingStyle/ClassNameImport/ClassNameImportSkipVoter/ClassLikeNameClassNameImportSkipVoter.php +++ b/rules/CodingStyle/ClassNameImport/ClassNameImportSkipVoter/ClassLikeNameClassNameImportSkipVoter.php @@ -46,12 +46,13 @@ public function shouldSkip(File $file, FullyQualifiedObjectType $fullyQualifiedO $namespace = strtolower((string) $namespace); $shortNameLowered = $fullyQualifiedObjectType->getShortNameLowered(); - - $subClassName = substr( - $fullyQualifiedObjectType->getClassName(), - 0, - -strlen($fullyQualifiedObjectType->getShortName()) - 1 - ); + $subClassName = $fullyQualifiedObjectType->getClassName() === $fullyQualifiedObjectType->getShortName() + ? '' + : substr( + $fullyQualifiedObjectType->getClassName(), + 0, + -strlen($fullyQualifiedObjectType->getShortName()) - 1 + ); $fullyQualifiedObjectTypeNamespace = strtolower($subClassName); From 3aa021293493a98572be0b978da01aafe8df4a6f Mon Sep 17 00:00:00 2001 From: Abdul Malik Ikhsan Date: Wed, 8 Oct 2025 14:22:25 +0700 Subject: [PATCH 2/9] fix --- rector.php | 6 ------ 1 file changed, 6 deletions(-) diff --git a/rector.php b/rector.php index 09fb70c3cf8..b24f7fe82f0 100644 --- a/rector.php +++ b/rector.php @@ -4,7 +4,6 @@ use Rector\CodingStyle\Rector\String_\UseClassKeywordForClassNameResolutionRector; use Rector\Config\RectorConfig; -use Rector\DeadCode\Rector\Cast\RecastingRemovalRector; use Rector\DeadCode\Rector\ConstFetch\RemovePhpVersionIdCheckRector; use Rector\Php55\Rector\String_\StringClassNameToClassConstantRector; @@ -53,9 +52,4 @@ __DIR__ . '/src/Configuration/RectorConfigBuilder.php', __DIR__ . '/src/Console/Notifier.php', ], - - // on php 7.x, substr() result can return false, so force (string) is needed - RecastingRemovalRector::class => [ - __DIR__ . '/rules/CodingStyle/ClassNameImport/ClassNameImportSkipVoter/ClassLikeNameClassNameImportSkipVoter.php', - ], ]); From 4a47deb077ac69d957454731cb141ebece063d7b Mon Sep 17 00:00:00 2001 From: Abdul Malik Ikhsan Date: Wed, 8 Oct 2025 14:32:43 +0700 Subject: [PATCH 3/9] move logic to separate service --- .../ClassLikeNameClassNameImportSkipVoter.php | 14 ++++------- .../NamespaceBeforeClassNameResolver.php | 24 +++++++++++++++++++ 2 files changed, 29 insertions(+), 9 deletions(-) create mode 100644 rules/CodingStyle/ClassNameImport/NamespaceBeforeClassNameResolver.php diff --git a/rules/CodingStyle/ClassNameImport/ClassNameImportSkipVoter/ClassLikeNameClassNameImportSkipVoter.php b/rules/CodingStyle/ClassNameImport/ClassNameImportSkipVoter/ClassLikeNameClassNameImportSkipVoter.php index 895a279ce0c..ba463335658 100644 --- a/rules/CodingStyle/ClassNameImport/ClassNameImportSkipVoter/ClassLikeNameClassNameImportSkipVoter.php +++ b/rules/CodingStyle/ClassNameImport/ClassNameImportSkipVoter/ClassLikeNameClassNameImportSkipVoter.php @@ -6,6 +6,8 @@ use PhpParser\Node; use PHPStan\Analyser\Scope; +use Rector\CodingStyle\ClassNameImport\LastNamespaceResolver; +use Rector\CodingStyle\ClassNameImport\NamespaceBeforeClassNameResolver; use Rector\CodingStyle\ClassNameImport\ShortNameResolver; use Rector\CodingStyle\Contract\ClassNameImport\ClassNameImportSkipVoterInterface; use Rector\NodeTypeResolver\Node\AttributeKey; @@ -24,7 +26,8 @@ final readonly class ClassLikeNameClassNameImportSkipVoter implements ClassNameImportSkipVoterInterface { public function __construct( - private ShortNameResolver $shortNameResolver + private ShortNameResolver $shortNameResolver, + private NamespaceBeforeClassNameResolver $namespaceBeforeClassNameResolver ) { } @@ -46,14 +49,7 @@ public function shouldSkip(File $file, FullyQualifiedObjectType $fullyQualifiedO $namespace = strtolower((string) $namespace); $shortNameLowered = $fullyQualifiedObjectType->getShortNameLowered(); - $subClassName = $fullyQualifiedObjectType->getClassName() === $fullyQualifiedObjectType->getShortName() - ? '' - : substr( - $fullyQualifiedObjectType->getClassName(), - 0, - -strlen($fullyQualifiedObjectType->getShortName()) - 1 - ); - + $subClassName = $this->namespaceBeforeClassNameResolver->resolve($fullyQualifiedObjectType); $fullyQualifiedObjectTypeNamespace = strtolower($subClassName); foreach ($classLikeNames as $classLikeName) { diff --git a/rules/CodingStyle/ClassNameImport/NamespaceBeforeClassNameResolver.php b/rules/CodingStyle/ClassNameImport/NamespaceBeforeClassNameResolver.php new file mode 100644 index 00000000000..e1969b67d6b --- /dev/null +++ b/rules/CodingStyle/ClassNameImport/NamespaceBeforeClassNameResolver.php @@ -0,0 +1,24 @@ +getClassName(); + $shortName = $fullyQualifiedObjectType->getShortName(); + + return $className === $shortName + ? '' + : substr( + $className, + 0, + -strlen($shortName) - 1 + ); + } +} \ No newline at end of file From 0dc5a1f0f0cacd9c4dfb00fbc857c6b5570fc319 Mon Sep 17 00:00:00 2001 From: GitHub Action Date: Wed, 8 Oct 2025 07:35:26 +0000 Subject: [PATCH 4/9] [ci-review] Rector Rectify --- .../ClassLikeNameClassNameImportSkipVoter.php | 1 - 1 file changed, 1 deletion(-) diff --git a/rules/CodingStyle/ClassNameImport/ClassNameImportSkipVoter/ClassLikeNameClassNameImportSkipVoter.php b/rules/CodingStyle/ClassNameImport/ClassNameImportSkipVoter/ClassLikeNameClassNameImportSkipVoter.php index ba463335658..d7e9fd80045 100644 --- a/rules/CodingStyle/ClassNameImport/ClassNameImportSkipVoter/ClassLikeNameClassNameImportSkipVoter.php +++ b/rules/CodingStyle/ClassNameImport/ClassNameImportSkipVoter/ClassLikeNameClassNameImportSkipVoter.php @@ -6,7 +6,6 @@ use PhpParser\Node; use PHPStan\Analyser\Scope; -use Rector\CodingStyle\ClassNameImport\LastNamespaceResolver; use Rector\CodingStyle\ClassNameImport\NamespaceBeforeClassNameResolver; use Rector\CodingStyle\ClassNameImport\ShortNameResolver; use Rector\CodingStyle\Contract\ClassNameImport\ClassNameImportSkipVoterInterface; From 11e2c3ad6917692484c1098b9e9baaa631b1ffb6 Mon Sep 17 00:00:00 2001 From: Abdul Malik Ikhsan Date: Wed, 8 Oct 2025 14:38:11 +0700 Subject: [PATCH 5/9] add test fixture for shortname import in class name --- .../short_name_import_in_class_name.php.inc | 23 +++++++++++++++++++ 1 file changed, 23 insertions(+) create mode 100644 tests/Issues/AutoImport/Fixture/short_name_import_in_class_name.php.inc diff --git a/tests/Issues/AutoImport/Fixture/short_name_import_in_class_name.php.inc b/tests/Issues/AutoImport/Fixture/short_name_import_in_class_name.php.inc new file mode 100644 index 00000000000..0023a2301d9 --- /dev/null +++ b/tests/Issues/AutoImport/Fixture/short_name_import_in_class_name.php.inc @@ -0,0 +1,23 @@ + +----- + From cf3e2fa36c3d63af9637f65e4ff5dbdbbd2a7e05 Mon Sep 17 00:00:00 2001 From: Abdul Malik Ikhsan Date: Wed, 8 Oct 2025 14:40:03 +0700 Subject: [PATCH 6/9] more test --- .../long_namespace_in_class_name.php.inc | 21 +++++++++++++++++++ 1 file changed, 21 insertions(+) create mode 100644 tests/Issues/AutoImport/Fixture/long_namespace_in_class_name.php.inc diff --git a/tests/Issues/AutoImport/Fixture/long_namespace_in_class_name.php.inc b/tests/Issues/AutoImport/Fixture/long_namespace_in_class_name.php.inc new file mode 100644 index 00000000000..64f4228de8c --- /dev/null +++ b/tests/Issues/AutoImport/Fixture/long_namespace_in_class_name.php.inc @@ -0,0 +1,21 @@ + +----- + From bdc9240f495fa216ca5a279ea0f7c47bfe69691d Mon Sep 17 00:00:00 2001 From: Abdul Malik Ikhsan Date: Wed, 8 Oct 2025 14:47:09 +0700 Subject: [PATCH 7/9] skip --- .../short_name_import_in_class_name.php.inc | 18 ++---------------- 1 file changed, 2 insertions(+), 16 deletions(-) diff --git a/tests/Issues/AutoImport/Fixture/short_name_import_in_class_name.php.inc b/tests/Issues/AutoImport/Fixture/short_name_import_in_class_name.php.inc index 0023a2301d9..92b4a2afb5d 100644 --- a/tests/Issues/AutoImport/Fixture/short_name_import_in_class_name.php.inc +++ b/tests/Issues/AutoImport/Fixture/short_name_import_in_class_name.php.inc @@ -3,21 +3,7 @@ /** * no namespace on purpose to use short name */ -class ShortNameImportInClassName +class SkipShortNameImportInClassName { - public \ShortNameImportInClassName $obj; + public \SkipShortNameImportInClassName $obj; } - -?> ------ - From f3c5734a5a77af06259c9df4bdb4813cd775101c Mon Sep 17 00:00:00 2001 From: Abdul Malik Ikhsan Date: Wed, 8 Oct 2025 14:47:40 +0700 Subject: [PATCH 8/9] eol --- .../ClassNameImport/NamespaceBeforeClassNameResolver.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/rules/CodingStyle/ClassNameImport/NamespaceBeforeClassNameResolver.php b/rules/CodingStyle/ClassNameImport/NamespaceBeforeClassNameResolver.php index e1969b67d6b..aa1ab6e466b 100644 --- a/rules/CodingStyle/ClassNameImport/NamespaceBeforeClassNameResolver.php +++ b/rules/CodingStyle/ClassNameImport/NamespaceBeforeClassNameResolver.php @@ -21,4 +21,4 @@ public function resolve(FullyQualifiedObjectType $fullyQualifiedObjectType): str -strlen($shortName) - 1 ); } -} \ No newline at end of file +} From 08d7aee8b75557d5dc1fb830b1b8a791db0f3f8f Mon Sep 17 00:00:00 2001 From: Abdul Malik Ikhsan Date: Wed, 8 Oct 2025 14:48:38 +0700 Subject: [PATCH 9/9] eol --- .../AutoImport/Fixture/short_name_import_in_class_name.php.inc | 3 --- 1 file changed, 3 deletions(-) diff --git a/tests/Issues/AutoImport/Fixture/short_name_import_in_class_name.php.inc b/tests/Issues/AutoImport/Fixture/short_name_import_in_class_name.php.inc index 92b4a2afb5d..5b0d07b3a1c 100644 --- a/tests/Issues/AutoImport/Fixture/short_name_import_in_class_name.php.inc +++ b/tests/Issues/AutoImport/Fixture/short_name_import_in_class_name.php.inc @@ -1,8 +1,5 @@