From cfbadfdf1e2e855dbbdfd309adbd565d39269220 Mon Sep 17 00:00:00 2001 From: Ondrej Mirtes Date: Tue, 8 Oct 2024 12:14:34 +0200 Subject: [PATCH] Another optimization --- src/Parser/VariadicFunctionsVisitor.php | 6 ++++++ src/Parser/VariadicMethodsVisitor.php | 8 ++++++++ src/Reflection/Php/PhpFunctionReflection.php | 4 ++++ src/Reflection/Php/PhpMethodReflection.php | 17 ++++++++++++----- 4 files changed, 30 insertions(+), 5 deletions(-) diff --git a/src/Parser/VariadicFunctionsVisitor.php b/src/Parser/VariadicFunctionsVisitor.php index f4a34415e8..5276d0eb47 100644 --- a/src/Parser/VariadicFunctionsVisitor.php +++ b/src/Parser/VariadicFunctionsVisitor.php @@ -19,6 +19,9 @@ final class VariadicFunctionsVisitor extends NodeVisitorAbstract private ?string $inFunction = null; + /** @var array */ + public static array $cache = []; + /** @var array */ private array $variadicFunctions = []; @@ -78,6 +81,9 @@ public function leaveNode(Node $node): ?Node public function afterTraverse(array $nodes): ?array { if ($this->topNode !== null && $this->variadicFunctions !== []) { + foreach ($this->variadicFunctions as $name => $variadic) { + self::$cache[$name] = $variadic; + } $functions = array_filter($this->variadicFunctions, static fn (bool $variadic) => $variadic); $this->topNode->setAttribute(self::ATTRIBUTE_NAME, $functions); } diff --git a/src/Parser/VariadicMethodsVisitor.php b/src/Parser/VariadicMethodsVisitor.php index 59be3e2011..50882efc54 100644 --- a/src/Parser/VariadicMethodsVisitor.php +++ b/src/Parser/VariadicMethodsVisitor.php @@ -29,6 +29,9 @@ final class VariadicMethodsVisitor extends NodeVisitorAbstract private ?string $inMethod = null; + /** @var array> */ + public static array $cache = []; + /** @var array> */ private array $variadicMethods = []; @@ -108,6 +111,11 @@ public function leaveNode(Node $node): ?Node public function afterTraverse(array $nodes): ?array { if ($this->topNode !== null && $this->variadicMethods !== []) { + foreach ($this->variadicMethods as $class => $methods) { + foreach ($methods as $name => $variadic) { + self::$cache[$class][$name] = $variadic; + } + } $this->topNode->setAttribute(self::ATTRIBUTE_NAME, $this->variadicMethods); } diff --git a/src/Reflection/Php/PhpFunctionReflection.php b/src/Reflection/Php/PhpFunctionReflection.php index 7b8cc5b092..e8fbc2e824 100644 --- a/src/Reflection/Php/PhpFunctionReflection.php +++ b/src/Reflection/Php/PhpFunctionReflection.php @@ -140,6 +140,10 @@ private function isVariadic(): bool return $this->containsVariadicCalls; } + if (array_key_exists($this->reflection->getName(), VariadicFunctionsVisitor::$cache)) { + return $this->containsVariadicCalls = VariadicFunctionsVisitor::$cache[$this->reflection->getName()]; + } + $nodes = $this->parser->parseFile($filename); if (count($nodes) > 0) { $variadicFunctions = $nodes[0]->getAttribute(VariadicFunctionsVisitor::ATTRIBUTE_NAME); diff --git a/src/Reflection/Php/PhpMethodReflection.php b/src/Reflection/Php/PhpMethodReflection.php index 4b36c2de26..53f5d80054 100644 --- a/src/Reflection/Php/PhpMethodReflection.php +++ b/src/Reflection/Php/PhpMethodReflection.php @@ -250,15 +250,22 @@ private function isVariadic(): bool return $this->containsVariadicCalls; } + $className = $declaringClass->getName(); + if ($declaringClass->isAnonymous()) { + $className = sprintf('%s:%s:%s', VariadicMethodsVisitor::ANONYMOUS_CLASS_PREFIX, $declaringClass->getNativeReflection()->getStartLine(), $declaringClass->getNativeReflection()->getEndLine()); + } + if (array_key_exists($className, VariadicMethodsVisitor::$cache)) { + if (array_key_exists($this->reflection->getName(), VariadicMethodsVisitor::$cache[$className])) { + return $this->containsVariadicCalls = VariadicMethodsVisitor::$cache[$className][$this->reflection->getName()]; + } + + return $this->containsVariadicCalls = false; + } + $nodes = $this->parser->parseFile($filename); if (count($nodes) > 0) { $variadicMethods = $nodes[0]->getAttribute(VariadicMethodsVisitor::ATTRIBUTE_NAME); - $className = $declaringClass->getName(); - if ($declaringClass->isAnonymous()) { - $className = sprintf('%s:%s:%s', VariadicMethodsVisitor::ANONYMOUS_CLASS_PREFIX, $declaringClass->getNativeReflection()->getStartLine(), $declaringClass->getNativeReflection()->getEndLine()); - } - if ( is_array($variadicMethods) && array_key_exists($className, $variadicMethods)