Skip to content

Commit 48a6d33

Browse files
committed
[NodeVisitor] Avoid reflection lookup when there is no Closure/ArrowFunction in Arg value
1 parent 2e1e9cc commit 48a6d33

1 file changed

Lines changed: 15 additions & 8 deletions

File tree

src/PhpParser/NodeVisitor/ClosureWithVariadicParametersNodeVisitor.php

Lines changed: 15 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44

55
namespace Rector\PhpParser\NodeVisitor;
66

7+
use PhpParser\Node\Arg;
78
use PhpParser\Node;
89
use PhpParser\Node\Expr\ArrowFunction;
910
use PhpParser\Node\Expr\CallLike;
@@ -37,32 +38,38 @@ public function enterNode(Node $node): ?Node
3738
return null;
3839
}
3940

40-
if ($node->getArgs() === []) {
41+
$args = $node->getArgs();
42+
if ($args === []) {
4143
return null;
4244
}
4345

44-
$methodReflection = $this->reflectionResolver->resolveFunctionLikeReflectionFromCall($node);
46+
$filteredArgs = array_filter(
47+
$args,
48+
fn (Arg $arg): bool => $arg->value instanceof Closure || $arg->value instanceof ArrowFunction
49+
);
4550

46-
foreach ($node->getArgs() as $arg) {
47-
if (! $arg->value instanceof Closure && ! $arg->value instanceof ArrowFunction) {
48-
continue;
49-
}
51+
if ($filteredArgs === []) {
52+
return null;
53+
}
54+
55+
$methodReflection = $this->reflectionResolver->resolveFunctionLikeReflectionFromCall($node);
5056

57+
foreach ($filteredArgs as $filteredArg) {
5158
if ($methodReflection instanceof NativeFunctionReflection) {
5259
$parametersAcceptors = ParametersAcceptorSelector::combineAcceptors(
5360
$methodReflection->getVariants()
5461
);
5562

5663
foreach ($parametersAcceptors->getParameters() as $extendedParameterReflection) {
5764
if ($extendedParameterReflection->getType() instanceof CallableType && $extendedParameterReflection->getType() ->isVariadic()) {
58-
$arg->value->setAttribute(AttributeKey::HAS_CLOSURE_WITH_VARIADIC_ARGS, true);
65+
$filteredArg->value->setAttribute(AttributeKey::HAS_CLOSURE_WITH_VARIADIC_ARGS, true);
5966
}
6067
}
6168

6269
return null;
6370
}
6471

65-
$arg->value->setAttribute(AttributeKey::HAS_CLOSURE_WITH_VARIADIC_ARGS, true);
72+
$filteredArg->value->setAttribute(AttributeKey::HAS_CLOSURE_WITH_VARIADIC_ARGS, true);
6673
}
6774

6875
return null;

0 commit comments

Comments
 (0)