Skip to content

Commit

Permalink
Another optimization
Browse files Browse the repository at this point in the history
  • Loading branch information
ondrejmirtes committed Oct 8, 2024
1 parent d1a8cbd commit cfbadfd
Show file tree
Hide file tree
Showing 4 changed files with 30 additions and 5 deletions.
6 changes: 6 additions & 0 deletions src/Parser/VariadicFunctionsVisitor.php
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,9 @@ final class VariadicFunctionsVisitor extends NodeVisitorAbstract

private ?string $inFunction = null;

/** @var array<string, bool> */
public static array $cache = [];

/** @var array<string, bool> */
private array $variadicFunctions = [];

Expand Down Expand Up @@ -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);
}
Expand Down
8 changes: 8 additions & 0 deletions src/Parser/VariadicMethodsVisitor.php
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,9 @@ final class VariadicMethodsVisitor extends NodeVisitorAbstract

private ?string $inMethod = null;

/** @var array<string, array<string, true>> */
public static array $cache = [];

/** @var array<string, array<string, true>> */
private array $variadicMethods = [];

Expand Down Expand Up @@ -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);
}

Expand Down
4 changes: 4 additions & 0 deletions src/Reflection/Php/PhpFunctionReflection.php
Original file line number Diff line number Diff line change
Expand Up @@ -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);
Expand Down
17 changes: 12 additions & 5 deletions src/Reflection/Php/PhpMethodReflection.php
Original file line number Diff line number Diff line change
Expand Up @@ -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)
Expand Down

0 comments on commit cfbadfd

Please sign in to comment.