Skip to content

Commit 48e7d3e

Browse files
authored
Remember function return type extensions (#4644)
1 parent d705d13 commit 48e7d3e

File tree

2 files changed

+22
-7
lines changed

2 files changed

+22
-7
lines changed

src/Analyser/MutatingScope.php

Lines changed: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -2501,16 +2501,13 @@ static function (Node $node, Scope $scope) use ($arrowScope, &$arrowFunctionImpu
25012501

25022502
private function getDynamicFunctionReturnType(FuncCall $normalizedNode, FunctionReflection $functionReflection): ?Type
25032503
{
2504-
foreach ($this->dynamicReturnTypeExtensionRegistry->getDynamicFunctionReturnTypeExtensions() as $dynamicFunctionReturnTypeExtension) {
2505-
if (!$dynamicFunctionReturnTypeExtension->isFunctionSupported($functionReflection)) {
2506-
continue;
2507-
}
2508-
2504+
foreach ($this->dynamicReturnTypeExtensionRegistry->getDynamicFunctionReturnTypeExtensions($functionReflection) as $dynamicFunctionReturnTypeExtension) {
25092505
$resolvedType = $dynamicFunctionReturnTypeExtension->getTypeFromFunctionCall(
25102506
$functionReflection,
25112507
$normalizedNode,
25122508
$this,
25132509
);
2510+
25142511
if ($resolvedType !== null) {
25152512
return $resolvedType;
25162513
}

src/Type/DynamicReturnTypeExtensionRegistry.php

Lines changed: 20 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22

33
namespace PHPStan\Type;
44

5+
use PHPStan\Reflection\FunctionReflection;
56
use PHPStan\Reflection\ReflectionProvider;
67
use function array_merge;
78
use 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

Comments
 (0)