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; + } }