diff --git a/src/Reflection/ReflectionProvider/MemoizingReflectionProvider.php b/src/Reflection/ReflectionProvider/MemoizingReflectionProvider.php index 800fc114d0..3250b024f0 100644 --- a/src/Reflection/ReflectionProvider/MemoizingReflectionProvider.php +++ b/src/Reflection/ReflectionProvider/MemoizingReflectionProvider.php @@ -29,32 +29,17 @@ public function __construct(private ReflectionProvider $provider) public function hasClass(string $className): bool { - $lowerClassName = strtolower($className); - if (isset($this->hasClasses[$lowerClassName])) { - return $this->hasClasses[$lowerClassName]; - } - - return $this->hasClasses[$lowerClassName] = $this->provider->hasClass($className); + return $this->hasClasses[strtolower($className)] ??= $this->provider->hasClass($className); } public function getClass(string $className): ClassReflection { - $lowerClassName = strtolower($className); - if (isset($this->classes[$lowerClassName])) { - return $this->classes[$lowerClassName]; - } - - return $this->classes[$lowerClassName] = $this->provider->getClass($className); + return $this->classes[strtolower($className)] ??= $this->provider->getClass($className); } public function getClassName(string $className): string { - $lowerClassName = strtolower($className); - if (isset($this->classNames[$lowerClassName])) { - return $this->classNames[$lowerClassName]; - } - - return $this->classNames[$lowerClassName] = $this->provider->getClassName($className); + return $this->classNames[strtolower($className)] ??= $this->provider->getClassName($className); } public function getAnonymousClassReflection(Node\Stmt\Class_ $classNode, Scope $scope): ClassReflection diff --git a/src/Rules/Api/ApiInstanceofTypeRule.php b/src/Rules/Api/ApiInstanceofTypeRule.php index c88c5114bf..d8028a6ab6 100644 --- a/src/Rules/Api/ApiInstanceofTypeRule.php +++ b/src/Rules/Api/ApiInstanceofTypeRule.php @@ -96,10 +96,18 @@ final class ApiInstanceofTypeRule implements Rule AccessoryType::class => 'methods on PHPStan\\Type\\Type', ]; + /** @var array */ + private readonly array $lowerMap; + public function __construct( private ReflectionProvider $reflectionProvider, ) { + $lowerMap = []; + foreach (self::MAP as $className => $method) { + $lowerMap[strtolower($className)] = $method; + } + $this->lowerMap = $lowerMap; } public function getNodeType(): string @@ -117,14 +125,9 @@ public function processNode(Node $node, Scope $scope): array return []; } - $lowerMap = []; - foreach (self::MAP as $className => $method) { - $lowerMap[strtolower($className)] = $method; - } - $className = $scope->resolveName($node->class); $lowerClassName = strtolower($className); - if (!array_key_exists($lowerClassName, $lowerMap)) { + if (!array_key_exists($lowerClassName, $this->lowerMap)) { return []; } @@ -138,7 +141,7 @@ public function processNode(Node $node, Scope $scope): array } $tip = 'Learn more: https://phpstan.org/blog/why-is-instanceof-type-wrong-and-getting-deprecated'; - if ($lowerMap[$lowerClassName] === null) { + if ($this->lowerMap[$lowerClassName] === null) { return [ RuleErrorBuilder::message(sprintf( 'Doing instanceof %s is error-prone and deprecated.', @@ -151,7 +154,7 @@ public function processNode(Node $node, Scope $scope): array RuleErrorBuilder::message(sprintf( 'Doing instanceof %s is error-prone and deprecated. Use %s instead.', $className, - $lowerMap[$lowerClassName], + $this->lowerMap[$lowerClassName], ))->identifier('phpstanApi.instanceofType')->tip($tip)->build(), ]; }