diff --git a/rules/TypeDeclaration/NodeAnalyzer/CallTypesResolver.php b/rules/TypeDeclaration/NodeAnalyzer/CallTypesResolver.php index dcbe34c8101..cf41d797cf6 100644 --- a/rules/TypeDeclaration/NodeAnalyzer/CallTypesResolver.php +++ b/rules/TypeDeclaration/NodeAnalyzer/CallTypesResolver.php @@ -17,6 +17,7 @@ use PHPStan\Type\UnionType; use Rector\NodeCollector\ValueObject\ArrayCallable; use Rector\NodeTypeResolver\NodeTypeResolver; use Rector\NodeTypeResolver\PHPStan\Type\TypeFactory; +use Rector\NodeTypeResolver\TypeComparator\TypeComparator; final class CallTypesResolver { /** @@ -34,11 +35,17 @@ final class CallTypesResolver * @var \PHPStan\Reflection\ReflectionProvider */ private $reflectionProvider; - public function __construct(NodeTypeResolver $nodeTypeResolver, TypeFactory $typeFactory, ReflectionProvider $reflectionProvider) + /** + * @readonly + * @var \Rector\NodeTypeResolver\TypeComparator\TypeComparator + */ + private $typeComparator; + public function __construct(NodeTypeResolver $nodeTypeResolver, TypeFactory $typeFactory, ReflectionProvider $reflectionProvider, TypeComparator $typeComparator) { $this->nodeTypeResolver = $nodeTypeResolver; $this->typeFactory = $typeFactory; $this->reflectionProvider = $reflectionProvider; + $this->typeComparator = $typeComparator; } /** * @param MethodCall[]|StaticCall[]|ArrayCallable[] $calls @@ -76,6 +83,10 @@ final class CallTypesResolver if (!$this->reflectionProvider->hasClass($argValueType->getClassName())) { return new MixedType(); } + $type = $this->nodeTypeResolver->getType($arg->value); + if (!$type->equals($argValueType) && $this->typeComparator->isSubtype($type, $argValueType)) { + return $type; + } return $argValueType; } private function correctSelfType(Type $argValueType) : Type diff --git a/src/Application/VersionResolver.php b/src/Application/VersionResolver.php index 5bf9be6918c..3a200f4ebbc 100644 --- a/src/Application/VersionResolver.php +++ b/src/Application/VersionResolver.php @@ -19,12 +19,12 @@ final class VersionResolver * @api * @var string */ - public const PACKAGE_VERSION = 'ef84a1a722c39839de1bcd79e0d3558b3e7d935d'; + public const PACKAGE_VERSION = '558f44d5939be4314d76f4850a34be3590e65bfd'; /** * @api * @var string */ - public const RELEASE_DATE = '2024-05-09 08:08:22'; + public const RELEASE_DATE = '2024-05-10 10:10:29'; /** * @var int */