From ee802d682e2a8a0b03cc6bcce25ecf7b25749933 Mon Sep 17 00:00:00 2001 From: Manuel Huber Date: Thu, 26 Sep 2024 13:07:35 +0200 Subject: [PATCH] Reflection `getAttributes` returns `list` --- ...GetAttributesMethodReturnTypeExtension.php | 5 +-- stubs/ReflectionClass.stub | 2 +- stubs/ReflectionClassConstant.stub | 2 +- stubs/ReflectionFunctionAbstract.stub | 2 +- stubs/ReflectionParameter.stub | 2 +- stubs/ReflectionProperty.stub | 2 +- .../nsrt/reflectionclass-issue-5511-php8.php | 34 +++++++++---------- 7 files changed, 25 insertions(+), 24 deletions(-) diff --git a/src/Type/Php/ReflectionGetAttributesMethodReturnTypeExtension.php b/src/Type/Php/ReflectionGetAttributesMethodReturnTypeExtension.php index 621831d168e..04454c63b26 100644 --- a/src/Type/Php/ReflectionGetAttributesMethodReturnTypeExtension.php +++ b/src/Type/Php/ReflectionGetAttributesMethodReturnTypeExtension.php @@ -5,10 +5,11 @@ use PhpParser\Node\Expr\MethodCall; use PHPStan\Analyser\Scope; use PHPStan\Reflection\MethodReflection; +use PHPStan\Type\Accessory\AccessoryArrayListType; use PHPStan\Type\ArrayType; use PHPStan\Type\DynamicMethodReturnTypeExtension; use PHPStan\Type\Generic\GenericObjectType; -use PHPStan\Type\MixedType; +use PHPStan\Type\IntegerType; use PHPStan\Type\Type; use ReflectionAttribute; use function count; @@ -42,7 +43,7 @@ public function getTypeFromMethodCall(MethodReflection $methodReflection, Method $argType = $scope->getType($methodCall->getArgs()[0]->value); $classType = $argType->getClassStringObjectType(); - return new ArrayType(new MixedType(), new GenericObjectType(ReflectionAttribute::class, [$classType])); + return AccessoryArrayListType::intersectWith(new ArrayType(new IntegerType(), new GenericObjectType(ReflectionAttribute::class, [$classType]))); } } diff --git a/stubs/ReflectionClass.stub b/stubs/ReflectionClass.stub index f47d5d89a17..65b02ffaacd 100644 --- a/stubs/ReflectionClass.stub +++ b/stubs/ReflectionClass.stub @@ -42,7 +42,7 @@ class ReflectionClass public function newInstanceWithoutConstructor(); /** - * @return array> + * @return list> */ public function getAttributes(?string $name = null, int $flags = 0) { diff --git a/stubs/ReflectionClassConstant.stub b/stubs/ReflectionClassConstant.stub index 669ccbef89b..4396980e060 100644 --- a/stubs/ReflectionClassConstant.stub +++ b/stubs/ReflectionClassConstant.stub @@ -3,7 +3,7 @@ class ReflectionClassConstant { /** - * @return array> + * @return list> */ public function getAttributes(?string $name = null, int $flags = 0) { diff --git a/stubs/ReflectionFunctionAbstract.stub b/stubs/ReflectionFunctionAbstract.stub index 36e48df100c..0154996741e 100644 --- a/stubs/ReflectionFunctionAbstract.stub +++ b/stubs/ReflectionFunctionAbstract.stub @@ -9,7 +9,7 @@ abstract class ReflectionFunctionAbstract public function getFileName () {} /** - * @return array> + * @return list> */ public function getAttributes(?string $name = null, int $flags = 0) { diff --git a/stubs/ReflectionParameter.stub b/stubs/ReflectionParameter.stub index a29fa35e832..e92f0b51f3a 100644 --- a/stubs/ReflectionParameter.stub +++ b/stubs/ReflectionParameter.stub @@ -3,7 +3,7 @@ class ReflectionParameter { /** - * @return array> + * @return list> */ public function getAttributes(?string $name = null, int $flags = 0) { diff --git a/stubs/ReflectionProperty.stub b/stubs/ReflectionProperty.stub index 312688067d7..002daeeeee2 100644 --- a/stubs/ReflectionProperty.stub +++ b/stubs/ReflectionProperty.stub @@ -3,7 +3,7 @@ class ReflectionProperty { /** - * @return array> + * @return list> */ public function getAttributes(?string $name = null, int $flags = 0) { diff --git a/tests/PHPStan/Analyser/nsrt/reflectionclass-issue-5511-php8.php b/tests/PHPStan/Analyser/nsrt/reflectionclass-issue-5511-php8.php index 94b28068504..d0a80299b28 100644 --- a/tests/PHPStan/Analyser/nsrt/reflectionclass-issue-5511-php8.php +++ b/tests/PHPStan/Analyser/nsrt/reflectionclass-issue-5511-php8.php @@ -36,38 +36,38 @@ function testGetAttributes( $classStr = $reflectionClass->getAttributes($str); $classNonsense = $reflectionClass->getAttributes("some random string"); - assertType('array>', $classAll); - assertType('array>', $classAbc1); - assertType('array>', $classAbc2); - assertType('array>', $classGCN); - assertType('array>', $classCN); - assertType('array>', $classStr); - assertType('array>', $classNonsense); + assertType('list>', $classAll); + assertType('list>', $classAbc1); + assertType('list>', $classAbc2); + assertType('list>', $classGCN); + assertType('list>', $classCN); + assertType('list>', $classStr); + assertType('list>', $classNonsense); $methodAll = $reflectionMethod->getAttributes(); $methodAbc = $reflectionMethod->getAttributes(Abc::class); - assertType('array>', $methodAll); - assertType('array>', $methodAbc); + assertType('list>', $methodAll); + assertType('list>', $methodAbc); $paramAll = $reflectionParameter->getAttributes(); $paramAbc = $reflectionParameter->getAttributes(Abc::class); - assertType('array>', $paramAll); - assertType('array>', $paramAbc); + assertType('list>', $paramAll); + assertType('list>', $paramAbc); $propAll = $reflectionProperty->getAttributes(); $propAbc = $reflectionProperty->getAttributes(Abc::class); - assertType('array>', $propAll); - assertType('array>', $propAbc); + assertType('list>', $propAll); + assertType('list>', $propAbc); $constAll = $reflectionClassConstant->getAttributes(); $constAbc = $reflectionClassConstant->getAttributes(Abc::class); - assertType('array>', $constAll); - assertType('array>', $constAbc); + assertType('list>', $constAll); + assertType('list>', $constAbc); $funcAll = $reflectionFunction->getAttributes(); $funcAbc = $reflectionFunction->getAttributes(Abc::class); - assertType('array>', $funcAll); - assertType('array>', $funcAbc); + assertType('list>', $funcAll); + assertType('list>', $funcAbc); } /**