From d7c6077a36bd715aaca01d61523c0925adf45552 Mon Sep 17 00:00:00 2001 From: Abdul Malik Ikhsan Date: Thu, 19 Mar 2026 22:24:09 +0700 Subject: [PATCH] [CodeQuality] Skip used by static closure use on ControllerMethodInjectionToConstructorRector --- .../skip_used_by_static_closure_use.php.inc | 22 ++++++++++++ ...llerMethodInjectionToConstructorRector.php | 34 +++++++++++++++++++ 2 files changed, 56 insertions(+) create mode 100644 rules-tests/CodeQuality/Rector/Class_/ControllerMethodInjectionToConstructorRector/Fixture/skip_used_by_static_closure_use.php.inc diff --git a/rules-tests/CodeQuality/Rector/Class_/ControllerMethodInjectionToConstructorRector/Fixture/skip_used_by_static_closure_use.php.inc b/rules-tests/CodeQuality/Rector/Class_/ControllerMethodInjectionToConstructorRector/Fixture/skip_used_by_static_closure_use.php.inc new file mode 100644 index 00000000..a9b66687 --- /dev/null +++ b/rules-tests/CodeQuality/Rector/Class_/ControllerMethodInjectionToConstructorRector/Fixture/skip_used_by_static_closure_use.php.inc @@ -0,0 +1,22 @@ +isUsedInStaticClosureUse($classMethod, $this->getName($param->var))) { + continue; + } + unset($classMethod->params[$key]); $propertyMetadatas[] = new PropertyMetadata($this->getName($param->var), $paramType); } @@ -279,6 +284,35 @@ private function hasConflictedParamName( return false; } + private function isUsedInStaticClosureUse(ClassMethod $classMethod, string $paramName): bool + { + if ($classMethod->stmts === null) { + return false; + } + + $found = false; + $this->traverseNodesWithCallable($classMethod->stmts, function (Node $node) use ($paramName, &$found): ?int { + if (! $node instanceof Closure) { + return null; + } + + if (! $node->static) { + return null; + } + + foreach ($node->uses as $closureUse) { + if ($this->isName($closureUse->var, $paramName)) { + $found = true; + return NodeVisitor::STOP_TRAVERSAL; + } + } + + return null; + }); + + return $found; + } + /** * @param string[] $paramNamesToReplace */