Skip to content

Commit 7ccb174

Browse files
Different logic: verify equal before substr on ClassLikeNameClassNameImportSkipVoter (#7450)
* verify string equal first before substr with negative -1 * fix * move logic to separate service * [ci-review] Rector Rectify * add test fixture for shortname import in class name * more test * skip * eol * eol --------- Co-authored-by: GitHub Action <actions@github.com>
1 parent 9a95b6b commit 7ccb174

File tree

5 files changed

+55
-14
lines changed

5 files changed

+55
-14
lines changed

rector.php

Lines changed: 0 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,6 @@
44

55
use Rector\CodingStyle\Rector\String_\UseClassKeywordForClassNameResolutionRector;
66
use Rector\Config\RectorConfig;
7-
use Rector\DeadCode\Rector\Cast\RecastingRemovalRector;
87
use Rector\DeadCode\Rector\ConstFetch\RemovePhpVersionIdCheckRector;
98
use Rector\Php55\Rector\String_\StringClassNameToClassConstantRector;
109

@@ -53,9 +52,4 @@
5352
__DIR__ . '/src/Configuration/RectorConfigBuilder.php',
5453
__DIR__ . '/src/Console/Notifier.php',
5554
],
56-
57-
// on php 7.x, substr() result can return false, so force (string) is needed
58-
RecastingRemovalRector::class => [
59-
__DIR__ . '/rules/CodingStyle/ClassNameImport/ClassNameImportSkipVoter/ClassLikeNameClassNameImportSkipVoter.php',
60-
],
6155
]);

rules/CodingStyle/ClassNameImport/ClassNameImportSkipVoter/ClassLikeNameClassNameImportSkipVoter.php

Lines changed: 4 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66

77
use PhpParser\Node;
88
use PHPStan\Analyser\Scope;
9+
use Rector\CodingStyle\ClassNameImport\NamespaceBeforeClassNameResolver;
910
use Rector\CodingStyle\ClassNameImport\ShortNameResolver;
1011
use Rector\CodingStyle\Contract\ClassNameImport\ClassNameImportSkipVoterInterface;
1112
use Rector\NodeTypeResolver\Node\AttributeKey;
@@ -24,7 +25,8 @@
2425
final readonly class ClassLikeNameClassNameImportSkipVoter implements ClassNameImportSkipVoterInterface
2526
{
2627
public function __construct(
27-
private ShortNameResolver $shortNameResolver
28+
private ShortNameResolver $shortNameResolver,
29+
private NamespaceBeforeClassNameResolver $namespaceBeforeClassNameResolver
2830
) {
2931
}
3032

@@ -46,13 +48,7 @@ public function shouldSkip(File $file, FullyQualifiedObjectType $fullyQualifiedO
4648
$namespace = strtolower((string) $namespace);
4749

4850
$shortNameLowered = $fullyQualifiedObjectType->getShortNameLowered();
49-
50-
$subClassName = substr(
51-
$fullyQualifiedObjectType->getClassName(),
52-
0,
53-
-strlen($fullyQualifiedObjectType->getShortName()) - 1
54-
);
55-
51+
$subClassName = $this->namespaceBeforeClassNameResolver->resolve($fullyQualifiedObjectType);
5652
$fullyQualifiedObjectTypeNamespace = strtolower($subClassName);
5753

5854
foreach ($classLikeNames as $classLikeName) {
Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
<?php
2+
3+
declare(strict_types=1);
4+
5+
namespace Rector\CodingStyle\ClassNameImport;
6+
7+
use Rector\StaticTypeMapper\ValueObject\Type\FullyQualifiedObjectType;
8+
9+
final class NamespaceBeforeClassNameResolver
10+
{
11+
public function resolve(FullyQualifiedObjectType $fullyQualifiedObjectType): string
12+
{
13+
$className = $fullyQualifiedObjectType->getClassName();
14+
$shortName = $fullyQualifiedObjectType->getShortName();
15+
16+
return $className === $shortName
17+
? ''
18+
: substr(
19+
$className,
20+
0,
21+
-strlen($shortName) - 1
22+
);
23+
}
24+
}
Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
<?php
2+
3+
namespace App\Foo\Bar\Baz\Bat;
4+
5+
class LongNamespaceInClassName
6+
{
7+
public \App\Foo\Bar\Baz\Bat\LongNamespaceInClassName $obj;
8+
}
9+
10+
?>
11+
-----
12+
<?php
13+
14+
namespace App\Foo\Bar\Baz\Bat;
15+
16+
class LongNamespaceInClassName
17+
{
18+
public LongNamespaceInClassName $obj;
19+
}
20+
21+
?>
Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
<?php
2+
3+
class SkipShortNameImportInClassName
4+
{
5+
public \SkipShortNameImportInClassName $obj;
6+
}

0 commit comments

Comments
 (0)