From 72e878d0da400971659595d2d151605e6c05abd0 Mon Sep 17 00:00:00 2001 From: Benjamin Rambaud Date: Fri, 14 Mar 2025 17:07:10 +0100 Subject: [PATCH] fix: call all involved class for MethodTypeSpecifyingExtension and StaticMethodTypeSpecifyingExtension For the moment, we only want to try a modification to see if existing tests passed. The next steps is to implement a test to reproduce the error then we'll re-implement the modification for real. --- src/Analyser/TypeSpecifier.php | 42 ++++++++++++++++++++++++---------- 1 file changed, 30 insertions(+), 12 deletions(-) diff --git a/src/Analyser/TypeSpecifier.php b/src/Analyser/TypeSpecifier.php index c016b2869e..1296a67968 100644 --- a/src/Analyser/TypeSpecifier.php +++ b/src/Analyser/TypeSpecifier.php @@ -519,19 +519,28 @@ public function specifyTypesInCondition( $methodReflection = $scope->getMethodReflection($methodCalledOnType, $expr->name->name); if ($methodReflection !== null) { $referencedClasses = $methodCalledOnType->getObjectClassNames(); - if ( - count($referencedClasses) === 1 - && $this->reflectionProvider->hasClass($referencedClasses[0]) - ) { - $methodClassReflection = $this->reflectionProvider->getClass($referencedClasses[0]); + $specifiedTypes = null; + foreach ($referencedClasses as $referencedClass) { + if (!$this->reflectionProvider->hasClass($referencedClass)) { + continue; + } + + $methodClassReflection = $this->reflectionProvider->getClass($referencedClass); foreach ($this->getMethodTypeSpecifyingExtensionsForClass($methodClassReflection->getName()) as $extension) { if (!$extension->isMethodSupported($methodReflection, $expr, $context)) { continue; } - return $extension->specifyTypes($methodReflection, $expr, $scope, $context); + if ($specifiedTypes !== null) { + $specifiedTypes = $specifiedTypes->unionWith($extension->specifyTypes($methodReflection, $expr, $scope, $context)); + } else { + $specifiedTypes = $extension->specifyTypes($methodReflection, $expr, $scope, $context); + } } } + if ($specifiedTypes !== null) { + return $specifiedTypes; + } // lazy create parametersAcceptor, as creation can be expensive $parametersAcceptor = null; @@ -572,19 +581,28 @@ public function specifyTypesInCondition( $staticMethodReflection = $scope->getMethodReflection($calleeType, $expr->name->name); if ($staticMethodReflection !== null) { $referencedClasses = $calleeType->getObjectClassNames(); - if ( - count($referencedClasses) === 1 - && $this->reflectionProvider->hasClass($referencedClasses[0]) - ) { - $staticMethodClassReflection = $this->reflectionProvider->getClass($referencedClasses[0]); + $specifiedTypes = null; + foreach ($referencedClasses as $referencedClass) { + if (!$this->reflectionProvider->hasClass($referencedClass)) { + continue; + } + + $staticMethodClassReflection = $this->reflectionProvider->getClass($referencedClass); foreach ($this->getStaticMethodTypeSpecifyingExtensionsForClass($staticMethodClassReflection->getName()) as $extension) { if (!$extension->isStaticMethodSupported($staticMethodReflection, $expr, $context)) { continue; } - return $extension->specifyTypes($staticMethodReflection, $expr, $scope, $context); + if ($specifiedTypes !== null) { + $specifiedTypes = $specifiedTypes->unionWith($extension->specifyTypes($staticMethodReflection, $expr, $scope, $context)); + } else { + $specifiedTypes = $extension->specifyTypes($staticMethodReflection, $expr, $scope, $context); + } } } + if ($specifiedTypes !== null) { + return $specifiedTypes; + } // lazy create parametersAcceptor, as creation can be expensive $parametersAcceptor = null;