Skip to content

Commit 5796374

Browse files
committed
extract TooWideReturnTypeCheck->checkProperty()
1 parent 27178c3 commit 5796374

11 files changed

+50
-32
lines changed

src/Rules/TooWideTypehints/TooWideArrowFunctionReturnTypehintRule.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ final class TooWideArrowFunctionReturnTypehintRule implements Rule
1717
{
1818

1919
public function __construct(
20-
private TooWideReturnTypeCheck $check,
20+
private TooWideTypeCheck $check,
2121
)
2222
{
2323
}

src/Rules/TooWideTypehints/TooWideClosureReturnTypehintRule.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@ final class TooWideClosureReturnTypehintRule implements Rule
1919
{
2020

2121
public function __construct(
22-
private TooWideReturnTypeCheck $check,
22+
private TooWideTypeCheck $check,
2323
)
2424
{
2525
}

src/Rules/TooWideTypehints/TooWideFunctionReturnTypehintRule.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ final class TooWideFunctionReturnTypehintRule implements Rule
1717
{
1818

1919
public function __construct(
20-
private TooWideReturnTypeCheck $check,
20+
private TooWideTypeCheck $check,
2121
)
2222
{
2323
}

src/Rules/TooWideTypehints/TooWideMethodReturnTypehintRule.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ final class TooWideMethodReturnTypehintRule implements Rule
2020
public function __construct(
2121
#[AutowiredParameter(ref: '%checkTooWideReturnTypesInProtectedAndPublicMethods%')]
2222
private bool $checkProtectedAndPublicMethods,
23-
private TooWideReturnTypeCheck $check,
23+
private TooWideTypeCheck $check,
2424
)
2525
{
2626
}

src/Rules/TooWideTypehints/TooWidePropertyTypeRule.php

Lines changed: 3 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -10,11 +10,8 @@
1010
use PHPStan\Rules\Properties\PropertyReflectionFinder;
1111
use PHPStan\Rules\Properties\ReadWritePropertiesExtensionProvider;
1212
use PHPStan\Rules\Rule;
13-
use PHPStan\Rules\RuleErrorBuilder;
14-
use PHPStan\Type\NullType;
1513
use PHPStan\Type\TypeCombinator;
1614
use PHPStan\Type\UnionType;
17-
use PHPStan\Type\VerbosityLevel;
1815
use function count;
1916
use function sprintf;
2017

@@ -28,6 +25,7 @@ final class TooWidePropertyTypeRule implements Rule
2825
public function __construct(
2926
private ReadWritePropertiesExtensionProvider $extensionProvider,
3027
private PropertyReflectionFinder $propertyReflectionFinder,
28+
private TooWideTypeCheck $check,
3129
)
3230
{
3331
}
@@ -100,27 +98,9 @@ public function processNode(Node $node, Scope $scope): array
10098

10199
$assignedType = TypeCombinator::union(...$assignedTypes);
102100
$propertyDescription = $this->describePropertyByName($propertyReflection, $propertyName);
103-
$verbosityLevel = VerbosityLevel::getRecommendedLevelByType($propertyType, $assignedType);
104-
foreach ($propertyType->getTypes() as $type) {
105-
if (!$type->isSuperTypeOf($assignedType)->no()) {
106-
continue;
107-
}
108-
109-
if ($property->getNativeType() === null && (new NullType())->isSuperTypeOf($type)->yes()) {
110-
continue;
111-
}
112-
113-
$errors[] = RuleErrorBuilder::message(sprintf(
114-
'%s (%s) is never assigned %s so it can be removed from the property type.',
115-
$propertyDescription,
116-
$propertyType->describe($verbosityLevel),
117-
$type->describe($verbosityLevel),
118-
))
119-
->identifier('property.unusedType')
120-
->line($property->getStartLine())
121-
->build();
101+
foreach ($this->check->checkProperty($property, $propertyType, $propertyDescription, $assignedType) as $error) {
102+
$errors[] = $error;
122103
}
123-
124104
}
125105
return $errors;
126106
}

src/Rules/TooWideTypehints/TooWideReturnTypeCheck.php renamed to src/Rules/TooWideTypehints/TooWideTypeCheck.php

Lines changed: 38 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
namespace PHPStan\Rules\TooWideTypehints;
44

55
use PHPStan\DependencyInjection\AutowiredService;
6+
use PHPStan\Node\ClassPropertyNode;
67
use PHPStan\Node\FunctionReturnStatementsNode;
78
use PHPStan\Node\MethodReturnStatementsNode;
89
use PHPStan\Rules\IdentifierRuleError;
@@ -17,12 +18,48 @@
1718
use function sprintf;
1819

1920
#[AutowiredService]
20-
final class TooWideReturnTypeCheck
21+
final class TooWideTypeCheck
2122
{
2223

2324
/**
2425
* @return list<IdentifierRuleError>
2526
*/
27+
public function checkProperty(
28+
ClassPropertyNode $property,
29+
UnionType $propertyType,
30+
string $propertyDescription,
31+
Type $assignedType,
32+
): array
33+
{
34+
$errors = [];
35+
36+
$verbosityLevel = VerbosityLevel::getRecommendedLevelByType($propertyType, $assignedType);
37+
foreach ($propertyType->getTypes() as $type) {
38+
if (!$type->isSuperTypeOf($assignedType)->no()) {
39+
continue;
40+
}
41+
42+
if ($property->getNativeType() === null && $type->isNull()->yes()) {
43+
continue;
44+
}
45+
46+
$errors[] = RuleErrorBuilder::message(sprintf(
47+
'%s (%s) is never assigned %s so it can be removed from the property type.',
48+
$propertyDescription,
49+
$propertyType->describe($verbosityLevel),
50+
$type->describe($verbosityLevel),
51+
))
52+
->identifier('property.unusedType')
53+
->line($property->getStartLine())
54+
->build();
55+
}
56+
57+
return $errors;
58+
}
59+
60+
/**
61+
* @return list<IdentifierRuleError>
62+
*/
2663
public function checkFunction(
2764
MethodReturnStatementsNode|FunctionReturnStatementsNode $node,
2865
Type $functionReturnType,

tests/PHPStan/Rules/TooWideTypehints/TooWideArrowFunctionReturnTypehintRuleTest.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ class TooWideArrowFunctionReturnTypehintRuleTest extends RuleTestCase
1414
protected function getRule(): Rule
1515
{
1616
return new TooWideArrowFunctionReturnTypehintRule(
17-
new TooWideReturnTypeCheck(),
17+
new TooWideTypeCheck(),
1818
);
1919
}
2020

tests/PHPStan/Rules/TooWideTypehints/TooWideClosureReturnTypehintRuleTest.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ class TooWideClosureReturnTypehintRuleTest extends RuleTestCase
1414
protected function getRule(): Rule
1515
{
1616
return new TooWideClosureReturnTypehintRule(
17-
new TooWideReturnTypeCheck(),
17+
new TooWideTypeCheck(),
1818
);
1919
}
2020

tests/PHPStan/Rules/TooWideTypehints/TooWideFunctionReturnTypehintRuleTest.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ class TooWideFunctionReturnTypehintRuleTest extends RuleTestCase
1313

1414
protected function getRule(): Rule
1515
{
16-
return new TooWideFunctionReturnTypehintRule(new TooWideReturnTypeCheck());
16+
return new TooWideFunctionReturnTypehintRule(new TooWideTypeCheck());
1717
}
1818

1919
public function testRule(): void

tests/PHPStan/Rules/TooWideTypehints/TooWideMethodReturnTypehintRuleTest.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ class TooWideMethodReturnTypehintRuleTest extends RuleTestCase
1717

1818
protected function getRule(): Rule
1919
{
20-
return new TooWideMethodReturnTypehintRule($this->checkProtectedAndPublicMethods, new TooWideReturnTypeCheck());
20+
return new TooWideMethodReturnTypehintRule($this->checkProtectedAndPublicMethods, new TooWideTypeCheck());
2121
}
2222

2323
public function testPrivate(): void

0 commit comments

Comments
 (0)