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', - ], ]); diff --git a/rules/CodingStyle/ClassNameImport/ClassNameImportSkipVoter/ClassLikeNameClassNameImportSkipVoter.php b/rules/CodingStyle/ClassNameImport/ClassNameImportSkipVoter/ClassLikeNameClassNameImportSkipVoter.php index 3030cdb8275..d7e9fd80045 100644 --- a/rules/CodingStyle/ClassNameImport/ClassNameImportSkipVoter/ClassLikeNameClassNameImportSkipVoter.php +++ b/rules/CodingStyle/ClassNameImport/ClassNameImportSkipVoter/ClassLikeNameClassNameImportSkipVoter.php @@ -6,6 +6,7 @@ use PhpParser\Node; use PHPStan\Analyser\Scope; +use Rector\CodingStyle\ClassNameImport\NamespaceBeforeClassNameResolver; use Rector\CodingStyle\ClassNameImport\ShortNameResolver; use Rector\CodingStyle\Contract\ClassNameImport\ClassNameImportSkipVoterInterface; use Rector\NodeTypeResolver\Node\AttributeKey; @@ -24,7 +25,8 @@ final readonly class ClassLikeNameClassNameImportSkipVoter implements ClassNameImportSkipVoterInterface { public function __construct( - private ShortNameResolver $shortNameResolver + private ShortNameResolver $shortNameResolver, + private NamespaceBeforeClassNameResolver $namespaceBeforeClassNameResolver ) { } @@ -46,13 +48,7 @@ public function shouldSkip(File $file, FullyQualifiedObjectType $fullyQualifiedO $namespace = strtolower((string) $namespace); $shortNameLowered = $fullyQualifiedObjectType->getShortNameLowered(); - - $subClassName = 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..aa1ab6e466b --- /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 + ); + } +} 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 @@ + +----- + 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..5b0d07b3a1c --- /dev/null +++ b/tests/Issues/AutoImport/Fixture/short_name_import_in_class_name.php.inc @@ -0,0 +1,6 @@ +