From e64ef14c3914fa6d6d647784524b9e609fb97fc5 Mon Sep 17 00:00:00 2001 From: Tomas Votruba Date: Mon, 26 Jan 2026 17:33:02 +0100 Subject: [PATCH] Is used in closure --- .../multiple_uses_as_no_connection.php | 26 ------------------- .../Fixture/skip_if_use.php.inc | 20 ++++++++++++++ .../BareCreateMockAssignToDirectUseRector.php | 19 ++++++++++++++ 3 files changed, 39 insertions(+), 26 deletions(-) delete mode 100644 rules-tests/CodeQuality/Rector/ClassMethod/BareCreateMockAssignToDirectUseRector/Fixture/multiple_uses_as_no_connection.php create mode 100644 rules-tests/CodeQuality/Rector/ClassMethod/BareCreateMockAssignToDirectUseRector/Fixture/skip_if_use.php.inc diff --git a/rules-tests/CodeQuality/Rector/ClassMethod/BareCreateMockAssignToDirectUseRector/Fixture/multiple_uses_as_no_connection.php b/rules-tests/CodeQuality/Rector/ClassMethod/BareCreateMockAssignToDirectUseRector/Fixture/multiple_uses_as_no_connection.php deleted file mode 100644 index 0279019d..00000000 --- a/rules-tests/CodeQuality/Rector/ClassMethod/BareCreateMockAssignToDirectUseRector/Fixture/multiple_uses_as_no_connection.php +++ /dev/null @@ -1,26 +0,0 @@ -createMock(\Rector\PHPUnit\Tests\CodeQuality\Rector\ClassMethod\BareCreateMockAssignToDirectUseRector\Source\AnotherClass::class); - - $this->useMock($someMock); - $this->useMockAgain($someMock); - } - - private function useMock($someMock) - { - } - - private function useMockAgain($someMock) - { - } -} - -?> diff --git a/rules-tests/CodeQuality/Rector/ClassMethod/BareCreateMockAssignToDirectUseRector/Fixture/skip_if_use.php.inc b/rules-tests/CodeQuality/Rector/ClassMethod/BareCreateMockAssignToDirectUseRector/Fixture/skip_if_use.php.inc new file mode 100644 index 00000000..83a293ce --- /dev/null +++ b/rules-tests/CodeQuality/Rector/ClassMethod/BareCreateMockAssignToDirectUseRector/Fixture/skip_if_use.php.inc @@ -0,0 +1,20 @@ +createMock(AnotherClass::class); + + $someClosure = function() use ($someMock) { + // some logic here + + return $someMock; + }; + } +} diff --git a/rules/CodeQuality/Rector/ClassMethod/BareCreateMockAssignToDirectUseRector.php b/rules/CodeQuality/Rector/ClassMethod/BareCreateMockAssignToDirectUseRector.php index 6fc36009..c9802b12 100644 --- a/rules/CodeQuality/Rector/ClassMethod/BareCreateMockAssignToDirectUseRector.php +++ b/rules/CodeQuality/Rector/ClassMethod/BareCreateMockAssignToDirectUseRector.php @@ -6,6 +6,7 @@ use PhpParser\Node; use PhpParser\Node\Arg; +use PhpParser\Node\ClosureUse; use PhpParser\Node\Expr\Assign; use PhpParser\Node\Expr\CallLike; use PhpParser\Node\Expr\MethodCall; @@ -120,6 +121,10 @@ public function refactor(Node $node): ?Node continue; } + if ($this->isUsedInClosure($node, $variableName)) { + continue; + } + // 1. remove initial assign $variablesToMethodCalls = []; @@ -232,4 +237,18 @@ private function findCallLikes(ClassMethod|Foreach_|Stmt $node): array return array_filter($callLikes, fn (CallLike $callLike): bool => ! $callLike->isFirstClassCallable()); } + + private function isUsedInClosure(ClassMethod|Foreach_ $stmtsAware, string $variableName): bool + { + /** @var Node\ClosureUse[] $uses */ + $uses = $this->betterNodeFinder->findInstancesOf([$stmtsAware], [ClosureUse::class]); + + foreach ($uses as $use) { + if ($this->isName($use->var, $variableName)) { + return true; + } + } + + return false; + } }