Skip to content

Commit 9ce9eb4

Browse files
Rework
1 parent 7e2ab56 commit 9ce9eb4

File tree

3 files changed

+56
-37
lines changed

3 files changed

+56
-37
lines changed
Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
<?php declare(strict_types = 1);
2+
3+
namespace PHPStan\Reflection\Php;
4+
5+
use PHPStan\DependencyInjection\AutowiredService;
6+
use PHPStan\Reflection\AllowedSubTypesClassReflectionExtension;
7+
use PHPStan\Reflection\ClassReflection;
8+
use PHPStan\Type\Enum\EnumCaseObjectType;
9+
use PHPStan\Type\UnionType;
10+
11+
use function array_keys;
12+
13+
#[AutowiredService]
14+
final class SealedAllowedSubTypesClassReflectionExtension implements AllowedSubTypesClassReflectionExtension
15+
{
16+
17+
public function supports(ClassReflection $classReflection): bool
18+
{
19+
return count($classReflection->getSealedTags()) > 0;
20+
}
21+
22+
public function getAllowedSubTypes(ClassReflection $classReflection): array
23+
{
24+
$types = [];
25+
26+
foreach ($classReflection->getSealedTags() as $sealedTag) {
27+
$type = $sealedTag->getType();
28+
if ($type instanceof UnionType) {
29+
$types = $type->getTypes();
30+
} else {
31+
$types = [$type];
32+
}
33+
}
34+
35+
return $types;
36+
}
37+
38+
}

tests/PHPStan/Rules/Classes/AllowedSubTypesRuleTest.php

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,24 @@ public function testRule(): void
2626
]);
2727
}
2828

29+
public function testSealed(): void
30+
{
31+
$this->analyse([__DIR__ . '/data/sealed.php'], [
32+
[
33+
'Class Sealed\BaseClass is sealed and only permits Sealed\BarClass|Sealed\FooClass as subtypes, Sealed\BazClass given.',
34+
11,
35+
],
36+
[
37+
'Interface Sealed\BaseInterface is sealed and only permits Sealed\BarClass2|Sealed\FooClass2 as subtypes, Sealed\BazClass2 given.',
38+
19,
39+
],
40+
[
41+
'Interface Sealed\BaseInterface2 is sealed and only permits Sealed\BarInterface|Sealed\FooInterface as subtypes, Sealed\BazInterface given.',
42+
27,
43+
],
44+
]);
45+
}
46+
2947
public static function getAdditionalConfigFiles(): array
3048
{
3149
return [

tests/PHPStan/Rules/Classes/SealedRuleTest.php

Lines changed: 0 additions & 37 deletions
This file was deleted.

0 commit comments

Comments
 (0)