Skip to content

Commit 0694bf9

Browse files
committed
move cache into DynamicReturnTypeExtensionRegistry
1 parent 4d571d6 commit 0694bf9

File tree

2 files changed

+21
-22
lines changed

2 files changed

+21
-22
lines changed

src/Analyser/MutatingScope.php

Lines changed: 1 addition & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -98,7 +98,6 @@
9898
use PHPStan\Type\Constant\ConstantIntegerType;
9999
use PHPStan\Type\Constant\ConstantStringType;
100100
use PHPStan\Type\ConstantTypeHelper;
101-
use PHPStan\Type\DynamicFunctionReturnTypeExtension;
102101
use PHPStan\Type\DynamicReturnTypeExtensionRegistry;
103102
use PHPStan\Type\ErrorType;
104103
use PHPStan\Type\ExpressionTypeResolverExtensionRegistry;
@@ -193,9 +192,6 @@ class MutatingScope implements Scope, NodeCallbackInvoker
193192

194193
private static int $resolveClosureTypeDepth = 0;
195194

196-
/** @var array<string, list<DynamicFunctionReturnTypeExtension>> */
197-
private static array $functionReturnTypeExtensions = [];
198-
199195
/**
200196
* @param int|array{min: int, max: int}|null $configPhpVersion
201197
* @param callable(Node $node, Scope $scope): void|null $nodeCallback
@@ -2504,33 +2500,18 @@ static function (Node $node, Scope $scope) use ($arrowScope, &$arrowFunctionImpu
25042500

25052501
private function getDynamicFunctionReturnType(FuncCall $normalizedNode, FunctionReflection $functionReflection): ?Type
25062502
{
2507-
$functionName = $functionReflection->getName();
2508-
if (isset(self::$functionReturnTypeExtensions[$functionName])) {
2509-
$extensions = self::$functionReturnTypeExtensions[$functionName];
2510-
} else {
2511-
$extensions = $this->dynamicReturnTypeExtensionRegistry->getDynamicFunctionReturnTypeExtensions();
2512-
}
2513-
2514-
$supportedFunctions = [];
2515-
foreach ($extensions as $dynamicFunctionReturnTypeExtension) {
2516-
if (!$dynamicFunctionReturnTypeExtension->isFunctionSupported($functionReflection)) {
2517-
continue;
2518-
}
2519-
2503+
foreach ($this->dynamicReturnTypeExtensionRegistry->getDynamicFunctionReturnTypeExtensions($functionReflection) as $dynamicFunctionReturnTypeExtension) {
25202504
$resolvedType = $dynamicFunctionReturnTypeExtension->getTypeFromFunctionCall(
25212505
$functionReflection,
25222506
$normalizedNode,
25232507
$this,
25242508
);
25252509

2526-
$supportedFunctions[] = $dynamicFunctionReturnTypeExtension;
25272510
if ($resolvedType !== null) {
2528-
self::$functionReturnTypeExtensions[$functionName] ??= $supportedFunctions;
25292511
return $resolvedType;
25302512
}
25312513
}
25322514

2533-
self::$functionReturnTypeExtensions[$functionName] ??= $supportedFunctions;
25342515
return null;
25352516
}
25362517

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)