Skip to content

Commit 4cf0bdc

Browse files
[TypeDeclaration] Prefer same-namespace classes over global PHPDoc types (#8869)
1 parent ca08575 commit 4cf0bdc

3 files changed

Lines changed: 55 additions & 3 deletions

File tree

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
<?php
2+
3+
namespace Rector\Tests\Renaming\Rector\Name\RenameClassRector\Fixture;
4+
5+
final class SkipDocblockSameNamespaceClass
6+
{
7+
/**
8+
* @param Countable $countable
9+
* @param \Countable $global
10+
* @return array<Countable>
11+
*/
12+
public function run($countable, $global)
13+
{
14+
}
15+
}
16+
17+
?>
18+
-----
19+
<?php
20+
21+
namespace Rector\Tests\Renaming\Rector\Name\RenameClassRector\Fixture;
22+
23+
final class SkipDocblockSameNamespaceClass
24+
{
25+
/**
26+
* @param Countable $countable
27+
* @param \stdClass $global
28+
* @return array<Countable>
29+
*/
30+
public function run($countable, $global)
31+
{
32+
}
33+
}
34+
35+
?>
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
<?php
2+
3+
declare(strict_types=1);
4+
5+
namespace Rector\Tests\Renaming\Rector\Name\RenameClassRector\Fixture;
6+
7+
final class Countable
8+
{
9+
}

‎rules/TypeDeclaration/PHPStan/ObjectTypeSpecifier.php‎

Lines changed: 11 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -64,6 +64,16 @@ public function narrowToFullyQualifiedOrAliasedObjectType(
6464
}
6565
}
6666

67+
// a class in the current namespace wins over a global class with the same short name
68+
$namespaceName = $scope?->getNamespace();
69+
$isUnqualified = ! $withPreslash && ! str_contains($className, '\\');
70+
if ($namespaceName !== null && $isUnqualified) {
71+
$namespacedClassName = $namespaceName . '\\' . $className;
72+
if ($this->reflectionProvider->hasClass($namespacedClassName)) {
73+
return new FullyQualifiedObjectType($namespacedClassName);
74+
}
75+
}
76+
6777
if ($this->reflectionProvider->hasClass($className)) {
6878
// keep the scope class reflection of the current class, as it is refreshed on class change,
6979
// while the reflection provider one still reads the original file
@@ -76,10 +86,8 @@ public function narrowToFullyQualifiedOrAliasedObjectType(
7686
}
7787

7888
// probably in same namespace
79-
$namespaceName = null;
8089
if ($scope instanceof Scope) {
81-
$namespaceName = $scope->getNamespace();
82-
if ($namespaceName !== null) {
90+
if ($namespaceName !== null && ! $isUnqualified) {
8391
$newClassName = $namespaceName . '\\' . $className;
8492
if ($this->reflectionProvider->hasClass($newClassName)) {
8593
return new FullyQualifiedObjectType($newClassName);

0 commit comments

Comments
 (0)