22
33namespace PHPStan \Type ;
44
5+ use PHPStan \Reflection \FunctionReflection ;
56use PHPStan \Reflection \ReflectionProvider ;
67use function array_merge ;
78use function strtolower ;
@@ -15,6 +16,9 @@ final class DynamicReturnTypeExtensionRegistry
1516 /** @var DynamicStaticMethodReturnTypeExtension[][]|null */
1617 private ?array $ dynamicStaticMethodReturnTypeExtensionsByClass = null ;
1718
19+ /** @var array<string, list<DynamicFunctionReturnTypeExtension>> */
20+ private array $ dynamicReturnTypeExtensionsByFunction = [];
21+
1822 /**
1923 * @param DynamicMethodReturnTypeExtension[] $dynamicMethodReturnTypeExtensions
2024 * @param DynamicStaticMethodReturnTypeExtension[] $dynamicStaticMethodReturnTypeExtensions
@@ -88,9 +92,23 @@ private function getDynamicExtensionsForType(array $extensions, string $classNam
8892 /**
8993 * @return DynamicFunctionReturnTypeExtension[]
9094 */
91- public function getDynamicFunctionReturnTypeExtensions (): array
95+ public function getDynamicFunctionReturnTypeExtensions (FunctionReflection $ functionReflection ): array
9296 {
93- return $ this ->dynamicFunctionReturnTypeExtensions ;
97+ $ functionName = $ functionReflection ->getName ();
98+ if (isset ($ this ->dynamicReturnTypeExtensionsByFunction [$ functionName ])) {
99+ return $ this ->dynamicReturnTypeExtensionsByFunction [$ functionName ];
100+ }
101+
102+ $ supportedFunctions = [];
103+ foreach ($ this ->dynamicFunctionReturnTypeExtensions as $ dynamicFunctionReturnTypeExtension ) {
104+ if (!$ dynamicFunctionReturnTypeExtension ->isFunctionSupported ($ functionReflection )) {
105+ continue ;
106+ }
107+
108+ $ supportedFunctions [] = $ dynamicFunctionReturnTypeExtension ;
109+ }
110+
111+ return $ this ->dynamicReturnTypeExtensionsByFunction [$ functionName ] = $ supportedFunctions ;
94112 }
95113
96114}
0 commit comments