diff --git a/src/Reflection/Php/SealedAllowedSubTypesClassReflectionExtension.php b/src/Reflection/Php/SealedAllowedSubTypesClassReflectionExtension.php index a40ac80997..85234c41cf 100644 --- a/src/Reflection/Php/SealedAllowedSubTypesClassReflectionExtension.php +++ b/src/Reflection/Php/SealedAllowedSubTypesClassReflectionExtension.php @@ -5,6 +5,7 @@ use PHPStan\DependencyInjection\AutowiredService; use PHPStan\Reflection\AllowedSubTypesClassReflectionExtension; use PHPStan\Reflection\ClassReflection; +use PHPStan\Type\ObjectType; use PHPStan\Type\UnionType; use function count; @@ -30,6 +31,10 @@ public function getAllowedSubTypes(ClassReflection $classReflection): array } } + if ($classReflection->isClass() && !$classReflection->isAbstract()) { + $types[] = new ObjectType($classReflection->getName()); + } + return $types; } diff --git a/tests/PHPStan/Rules/Classes/AllowedSubTypesRuleTest.php b/tests/PHPStan/Rules/Classes/AllowedSubTypesRuleTest.php index 21852d48fa..d5d069c5aa 100644 --- a/tests/PHPStan/Rules/Classes/AllowedSubTypesRuleTest.php +++ b/tests/PHPStan/Rules/Classes/AllowedSubTypesRuleTest.php @@ -44,6 +44,11 @@ public function testSealed(): void ]); } + public function testSealedOnConcreteClass(): void + { + $this->analyse([__DIR__ . '/data/sealed_concrete.php'], []); + } + public static function getAdditionalConfigFiles(): array { return [ diff --git a/tests/PHPStan/Rules/Classes/data/sealed_concrete.php b/tests/PHPStan/Rules/Classes/data/sealed_concrete.php new file mode 100644 index 0000000000..50b258eef9 --- /dev/null +++ b/tests/PHPStan/Rules/Classes/data/sealed_concrete.php @@ -0,0 +1,35 @@ +