From 20d2bc86e22de04c51529c80eababbecbeb0908a Mon Sep 17 00:00:00 2001 From: Tomas Votruba Date: Mon, 26 Jan 2026 18:07:42 +0100 Subject: [PATCH 1/2] add assert fixture --- .../Fixture/skip_if_assert.php.inc | 18 ++++++++++++++++++ .../Source/AnotherClass.php | 7 ++++++- 2 files changed, 24 insertions(+), 1 deletion(-) create mode 100644 rules-tests/CodeQuality/Rector/ClassMethod/BareCreateMockAssignToDirectUseRector/Fixture/skip_if_assert.php.inc diff --git a/rules-tests/CodeQuality/Rector/ClassMethod/BareCreateMockAssignToDirectUseRector/Fixture/skip_if_assert.php.inc b/rules-tests/CodeQuality/Rector/ClassMethod/BareCreateMockAssignToDirectUseRector/Fixture/skip_if_assert.php.inc new file mode 100644 index 00000000..03240692 --- /dev/null +++ b/rules-tests/CodeQuality/Rector/ClassMethod/BareCreateMockAssignToDirectUseRector/Fixture/skip_if_assert.php.inc @@ -0,0 +1,18 @@ +createMock(AnotherClass::class); + + $anotherClass = new AnotherClass(1, 2, 3, $someMock); + + $this->assertSame($someMock, $anotherClass->getSomeMock()); + } +} diff --git a/rules-tests/CodeQuality/Rector/ClassMethod/BareCreateMockAssignToDirectUseRector/Source/AnotherClass.php b/rules-tests/CodeQuality/Rector/ClassMethod/BareCreateMockAssignToDirectUseRector/Source/AnotherClass.php index c62553d7..79ff61bc 100644 --- a/rules-tests/CodeQuality/Rector/ClassMethod/BareCreateMockAssignToDirectUseRector/Source/AnotherClass.php +++ b/rules-tests/CodeQuality/Rector/ClassMethod/BareCreateMockAssignToDirectUseRector/Source/AnotherClass.php @@ -6,8 +6,13 @@ final class AnotherClass { - public function __construct(...$various) + public function __construct($one, $two, $three, private $someMock) { } + + public function getSomeMock() + { + return $this->someMock; + } } From c6d8ec8704daea01c4ba52a2ea40b16f416ffb83 Mon Sep 17 00:00:00 2001 From: Tomas Votruba Date: Mon, 26 Jan 2026 18:10:25 +0100 Subject: [PATCH 2/2] skip if used in assert call --- .../BareCreateMockAssignToDirectUseRector.php | 36 +++++++++++++++++++ 1 file changed, 36 insertions(+) diff --git a/rules/CodeQuality/Rector/ClassMethod/BareCreateMockAssignToDirectUseRector.php b/rules/CodeQuality/Rector/ClassMethod/BareCreateMockAssignToDirectUseRector.php index c9802b12..e19862b1 100644 --- a/rules/CodeQuality/Rector/ClassMethod/BareCreateMockAssignToDirectUseRector.php +++ b/rules/CodeQuality/Rector/ClassMethod/BareCreateMockAssignToDirectUseRector.php @@ -18,6 +18,7 @@ use PhpParser\Node\Stmt\Expression; use PhpParser\Node\Stmt\Foreach_; use Rector\PhpParser\Node\BetterNodeFinder; +use Rector\PHPUnit\CodeQuality\NodeAnalyser\AssertMethodAnalyzer; use Rector\PHPUnit\CodeQuality\NodeAnalyser\AssignedMocksCollector; use Rector\PHPUnit\CodeQuality\NodeFinder\VariableFinder; use Rector\PHPUnit\NodeAnalyzer\TestsNodeAnalyzer; @@ -35,6 +36,7 @@ public function __construct( private readonly AssignedMocksCollector $assignedMocksCollector, private readonly BetterNodeFinder $betterNodeFinder, private readonly VariableFinder $variableFinder, + private readonly AssertMethodAnalyzer $assertMethodAnalyzer, ) { } @@ -125,6 +127,10 @@ public function refactor(Node $node): ?Node continue; } + if ($this->isUsedInAssertCall($node, $variableName)) { + continue; + } + // 1. remove initial assign $variablesToMethodCalls = []; @@ -251,4 +257,34 @@ private function isUsedInClosure(ClassMethod|Foreach_ $stmtsAware, string $varia return false; } + + private function isUsedInAssertCall(ClassMethod|Foreach_ $stmtsAware, string $variableName): bool + { + /** @var StaticCall[]|MethodCall[] $calls */ + $calls = $this->betterNodeFinder->findInstancesOfScoped([$stmtsAware], [MethodCall::class, StaticCall::class]); + + $assertCalls = []; + foreach ($calls as $call) { + if (! $this->assertMethodAnalyzer->detectTestCaseCall($call)) { + continue; + } + + $assertCalls[] = $call; + } + + foreach ($assertCalls as $assertCall) { + foreach ($assertCall->getArgs() as $assertCallArg) { + if (! $assertCallArg->value instanceof Variable) { + continue; + } + + if ($this->isName($assertCallArg->value, $variableName)) { + return true; + } + + } + } + + return false; + } }