Skip to content

Commit 9ff2ba1

Browse files
Access Union::getObjectClassReflections
1 parent 19bb299 commit 9ff2ba1

File tree

5 files changed

+46
-3
lines changed

5 files changed

+46
-3
lines changed

src/Rules/PhpDoc/RequireExtendsCheck.php

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@
1212
use PHPStan\Rules\ClassNameUsageLocation;
1313
use PHPStan\Rules\IdentifierRuleError;
1414
use PHPStan\Rules\RuleErrorBuilder;
15+
use PHPStan\Type\UnionType;
1516
use PHPStan\Type\VerbosityLevel;
1617
use function array_column;
1718
use function array_map;
@@ -59,8 +60,18 @@ public function checkExtendsTags(Scope $scope, Node $node, array $extendsTags):
5960
continue;
6061
}
6162

63+
if ($type instanceof UnionType) {
64+
$classReflections = [];
65+
foreach ($type->getTypes() as $subType) {
66+
$classReflections[] = $subType->getObjectClassReflections();
67+
}
68+
$classReflections = array_merge(...$classReflections);
69+
} else {
70+
$classReflections = $type->getObjectClassReflections();
71+
}
72+
6273
sort($classNames);
63-
$referencedClassReflections = array_map(static fn ($reflection) => [$reflection, $reflection->getName()], $type->getObjectClassReflections());
74+
$referencedClassReflections = array_map(static fn ($reflection) => [$reflection, $reflection->getName()], $classReflections);
6475
$referencedClassReflectionsMap = array_column($referencedClassReflections, 0, 1);
6576
foreach ($classNames as $class) {
6677
$referencedClassReflection = $referencedClassReflectionsMap[$class] ?? null;

src/Rules/PhpDoc/RequireImplementsDefinitionTraitRule.php

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@
1212
use PHPStan\Rules\ClassNameUsageLocation;
1313
use PHPStan\Rules\Rule;
1414
use PHPStan\Rules\RuleErrorBuilder;
15+
use PHPStan\Type\UnionType;
1516
use PHPStan\Type\VerbosityLevel;
1617
use function array_column;
1718
use function array_map;
@@ -66,7 +67,17 @@ public function processNode(Node $node, Scope $scope): array
6667
continue;
6768
}
6869

69-
$referencedClassReflections = array_map(static fn ($reflection) => [$reflection, $reflection->getName()], $type->getObjectClassReflections());
70+
if ($type instanceof UnionType) {
71+
$classReflections = [];
72+
foreach ($type->getTypes() as $subType) {
73+
$classReflections[] = $subType->getObjectClassReflections();
74+
}
75+
$classReflections = array_merge(...$classReflections);
76+
} else {
77+
$classReflections = $type->getObjectClassReflections();
78+
}
79+
80+
$referencedClassReflections = array_map(static fn ($reflection) => [$reflection, $reflection->getName()], $classReflections);
7081
$referencedClassReflectionsMap = array_column($referencedClassReflections, 0, 1);
7182
foreach ($classNames as $class) {
7283
$referencedClassReflection = $referencedClassReflectionsMap[$class] ?? null;

src/Rules/PhpDoc/SealedDefinitionClassRule.php

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@
1212
use PHPStan\Rules\ClassNameUsageLocation;
1313
use PHPStan\Rules\Rule;
1414
use PHPStan\Rules\RuleErrorBuilder;
15+
use PHPStan\Type\UnionType;
1516
use PHPStan\Type\VerbosityLevel;
1617
use function array_column;
1718
use function array_map;
@@ -69,7 +70,17 @@ public function processNode(Node $node, Scope $scope): array
6970
continue;
7071
}
7172

72-
$referencedClassReflections = array_map(static fn ($reflection) => [$reflection, $reflection->getName()], $type->getObjectClassReflections());
73+
if ($type instanceof UnionType) {
74+
$classReflections = [];
75+
foreach ($type->getTypes() as $subType) {
76+
$classReflections[] = $subType->getObjectClassReflections();
77+
}
78+
$classReflections = array_merge(...$classReflections);
79+
} else {
80+
$classReflections = $type->getObjectClassReflections();
81+
}
82+
83+
$referencedClassReflections = array_map(static fn ($reflection) => [$reflection, $reflection->getName()], $classReflections);
7384
$referencedClassReflectionsMap = array_column($referencedClassReflections, 0, 1);
7485
foreach ($classNames as $class) {
7586
$referencedClassReflection = $referencedClassReflectionsMap[$class] ?? null;

tests/PHPStan/Rules/PhpDoc/SealedDefinitionClassRuleTest.php

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,11 @@ public function testRule(): void
4949
26,
5050
'Learn more at https://phpstan.org/user-guide/discovering-symbols',
5151
],
52+
[
53+
'PHPDoc tag @phpstan-sealed contains unknown class IncompatibleSealed\UnknownClass.',
54+
46,
55+
'Learn more at https://phpstan.org/user-guide/discovering-symbols',
56+
],
5257
]);
5358
}
5459

tests/PHPStan/Rules/PhpDoc/data/incompatible-sealed.php

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -39,3 +39,8 @@ interface ValidInterface {}
3939
* @phpstan-sealed SomeInterface
4040
*/
4141
interface ValidInterface2 {}
42+
43+
/**
44+
* @phpstan-sealed UnknownClass|SomeClass
45+
*/
46+
class InvalidClassWithUnion {}

0 commit comments

Comments
 (0)