Skip to content

Commit bc4c558

Browse files
Rework
1 parent 14257a0 commit bc4c558

File tree

5 files changed

+21
-29
lines changed

5 files changed

+21
-29
lines changed

src/Rules/PhpDoc/RequireExtendsCheck.php

Lines changed: 8 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -7,14 +7,13 @@
77
use PHPStan\DependencyInjection\AutowiredParameter;
88
use PHPStan\DependencyInjection\AutowiredService;
99
use PHPStan\PhpDoc\Tag\RequireExtendsTag;
10+
use PHPStan\Reflection\ReflectionProvider;
1011
use PHPStan\Rules\ClassNameCheck;
1112
use PHPStan\Rules\ClassNameNodePair;
1213
use PHPStan\Rules\ClassNameUsageLocation;
1314
use PHPStan\Rules\IdentifierRuleError;
1415
use PHPStan\Rules\RuleErrorBuilder;
1516
use PHPStan\Type\VerbosityLevel;
16-
use function array_column;
17-
use function array_map;
1817
use function array_merge;
1918
use function count;
2019
use function sort;
@@ -26,6 +25,7 @@ final class RequireExtendsCheck
2625
{
2726

2827
public function __construct(
28+
private ReflectionProvider $reflectionProvider,
2929
private ClassNameCheck $classCheck,
3030
#[AutowiredParameter]
3131
private bool $checkClassCaseSensitivity,
@@ -59,12 +59,8 @@ public function checkExtendsTags(Scope $scope, Node $node, array $extendsTags):
5959
continue;
6060
}
6161

62-
sort($classNames);
63-
$referencedClassReflections = array_map(static fn ($reflection) => [$reflection, $reflection->getName()], $type->getObjectClassReflections());
64-
$referencedClassReflectionsMap = array_column($referencedClassReflections, 0, 1);
6562
foreach ($classNames as $class) {
66-
$referencedClassReflection = $referencedClassReflectionsMap[$class] ?? null;
67-
if ($referencedClassReflection === null) {
63+
if (!$this->reflectionProvider->hasClass($class)) {
6864
$errorBuilder = RuleErrorBuilder::message(sprintf('PHPDoc tag @phpstan-require-extends contains unknown class %s.', $class))
6965
->identifier('class.notFound');
7066

@@ -76,16 +72,17 @@ public function checkExtendsTags(Scope $scope, Node $node, array $extendsTags):
7672
continue;
7773
}
7874

79-
if ($referencedClassReflection->isInterface()) {
75+
$reflection = $this->reflectionProvider->getClass($class);
76+
if ($reflection->isInterface()) {
8077
$errors[] = RuleErrorBuilder::message(sprintf('PHPDoc tag @phpstan-require-extends cannot contain an interface %s, expected a class.', $class))
8178
->tip('If you meant an interface, use @phpstan-require-implements instead.')
8279
->identifier('requireExtends.interface')
8380
->build();
84-
} elseif (!$referencedClassReflection->isClass()) {
81+
} elseif (!$reflection->isClass()) {
8582
$errors[] = RuleErrorBuilder::message(sprintf('PHPDoc tag @phpstan-require-extends cannot contain non-class type %s.', $class))
86-
->identifier(sprintf('requireExtends.%s', strtolower($referencedClassReflection->getClassTypeDescription())))
83+
->identifier(sprintf('requireExtends.%s', strtolower($reflection->getClassTypeDescription())))
8784
->build();
88-
} elseif ($referencedClassReflection->isFinal()) {
85+
} elseif ($reflection->isFinal()) {
8986
$errors[] = RuleErrorBuilder::message(sprintf('PHPDoc tag @phpstan-require-extends cannot contain final class %s.', $class))
9087
->identifier('requireExtends.finalClass')
9188
->build();

src/Rules/PhpDoc/RequireImplementsDefinitionTraitRule.php

Lines changed: 4 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -66,11 +66,8 @@ public function processNode(Node $node, Scope $scope): array
6666
continue;
6767
}
6868

69-
$referencedClassReflections = array_map(static fn ($reflection) => [$reflection, $reflection->getName()], $type->getObjectClassReflections());
70-
$referencedClassReflectionsMap = array_column($referencedClassReflections, 0, 1);
7169
foreach ($classNames as $class) {
72-
$referencedClassReflection = $referencedClassReflectionsMap[$class] ?? null;
73-
if ($referencedClassReflection === null) {
70+
if (!$this->reflectionProvider->hasClass($class)) {
7471
$errorBuilder = RuleErrorBuilder::message(sprintf('PHPDoc tag @phpstan-require-implements contains unknown class %s.', $class))
7572
->identifier('class.notFound');
7673

@@ -82,9 +79,10 @@ public function processNode(Node $node, Scope $scope): array
8279
continue;
8380
}
8481

85-
if (!$referencedClassReflection->isInterface()) {
82+
$reflection = $this->reflectionProvider->getClass($class);
83+
if (!$reflection->isInterface()) {
8684
$errors[] = RuleErrorBuilder::message(sprintf('PHPDoc tag @phpstan-require-implements cannot contain non-interface type %s.', $class))
87-
->identifier(sprintf('requireImplements.%s', strtolower($referencedClassReflection->getClassTypeDescription())))
85+
->identifier(sprintf('requireImplements.%s', strtolower($reflection->getClassTypeDescription())))
8886
->build();
8987
} else {
9088
$errors = array_merge(

src/Rules/PhpDoc/SealedDefinitionClassRule.php

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
use PHPStan\DependencyInjection\AutowiredParameter;
88
use PHPStan\DependencyInjection\RegisteredRule;
99
use PHPStan\Node\InClassNode;
10+
use PHPStan\Reflection\ReflectionProvider;
1011
use PHPStan\Rules\ClassNameCheck;
1112
use PHPStan\Rules\ClassNameNodePair;
1213
use PHPStan\Rules\ClassNameUsageLocation;
@@ -27,6 +28,7 @@ final class SealedDefinitionClassRule implements Rule
2728
{
2829

2930
public function __construct(
31+
private ReflectionProvider $reflectionProvider,
3032
private ClassNameCheck $classCheck,
3133
#[AutowiredParameter]
3234
private bool $checkClassCaseSensitivity,
@@ -69,11 +71,8 @@ public function processNode(Node $node, Scope $scope): array
6971
continue;
7072
}
7173

72-
$referencedClassReflections = array_map(static fn ($reflection) => [$reflection, $reflection->getName()], $type->getObjectClassReflections());
73-
$referencedClassReflectionsMap = array_column($referencedClassReflections, 0, 1);
7474
foreach ($classNames as $class) {
75-
$referencedClassReflection = $referencedClassReflectionsMap[$class] ?? null;
76-
if ($referencedClassReflection === null) {
75+
if (!$this->reflectionProvider->hasClass($class)) {
7776
$errorBuilder = RuleErrorBuilder::message(sprintf('PHPDoc tag @phpstan-sealed contains unknown class %s.', $class))
7877
->identifier('class.notFound');
7978

src/Type/UnionType.php

Lines changed: 4 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -162,14 +162,10 @@ public function getObjectClassNames(): array
162162

163163
public function getObjectClassReflections(): array
164164
{
165-
$reflections = [];
166-
foreach ($this->types as $type) {
167-
foreach ($type->getObjectClassReflections() as $reflection) {
168-
$reflections[] = $reflection;
169-
}
170-
}
171-
172-
return $reflections;
165+
return $this->pickFromTypes(
166+
static fn (Type $type) => $type->getObjectClassReflections(),
167+
static fn (Type $type) => $type->isObject()->yes(),
168+
);
173169
}
174170

175171
public function getArrays(): array

tests/PHPStan/Rules/PhpDoc/RequireExtendsDefinitionClassRuleTest.php

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

33
namespace PHPStan\Rules\PhpDoc;
44

5+
use PHPStan\Reflection\ReflectionProvider;
56
use PHPStan\Rules\ClassCaseSensitivityCheck;
67
use PHPStan\Rules\ClassForbiddenNameCheck;
78
use PHPStan\Rules\ClassNameCheck;
@@ -22,6 +23,7 @@ protected function getRule(): Rule
2223
$container = self::getContainer();
2324
return new RequireExtendsDefinitionClassRule(
2425
new RequireExtendsCheck(
26+
$reflectionProvider,
2527
new ClassNameCheck(
2628
new ClassCaseSensitivityCheck($reflectionProvider, true),
2729
new ClassForbiddenNameCheck($container),

0 commit comments

Comments
 (0)