From 8ba16cd65e891547cee9b80f37c7be3208175d9d Mon Sep 17 00:00:00 2001 From: Tomas Votruba Date: Thu, 23 Jul 2026 08:46:05 +0200 Subject: [PATCH] [DeadCode] Add RemoveDoubleSelfAssignRector --- .../Fixture/fixture.php.inc | 15 +++++ .../Fixture/skip_different_variable.php.inc | 5 ++ .../RemoveDoubleSelfAssignRectorTest.php | 28 +++++++++ .../config/configured_rule.php | 9 +++ .../Assign/RemoveDoubleSelfAssignRector.php | 61 +++++++++++++++++++ src/Config/Level/DeadCodeLevel.php | 2 + 6 files changed, 120 insertions(+) create mode 100644 rules-tests/DeadCode/Rector/Assign/RemoveDoubleSelfAssignRector/Fixture/fixture.php.inc create mode 100644 rules-tests/DeadCode/Rector/Assign/RemoveDoubleSelfAssignRector/Fixture/skip_different_variable.php.inc create mode 100644 rules-tests/DeadCode/Rector/Assign/RemoveDoubleSelfAssignRector/RemoveDoubleSelfAssignRectorTest.php create mode 100644 rules-tests/DeadCode/Rector/Assign/RemoveDoubleSelfAssignRector/config/configured_rule.php create mode 100644 rules/DeadCode/Rector/Assign/RemoveDoubleSelfAssignRector.php diff --git a/rules-tests/DeadCode/Rector/Assign/RemoveDoubleSelfAssignRector/Fixture/fixture.php.inc b/rules-tests/DeadCode/Rector/Assign/RemoveDoubleSelfAssignRector/Fixture/fixture.php.inc new file mode 100644 index 00000000000..6c380e8a654 --- /dev/null +++ b/rules-tests/DeadCode/Rector/Assign/RemoveDoubleSelfAssignRector/Fixture/fixture.php.inc @@ -0,0 +1,15 @@ + +----- + diff --git a/rules-tests/DeadCode/Rector/Assign/RemoveDoubleSelfAssignRector/Fixture/skip_different_variable.php.inc b/rules-tests/DeadCode/Rector/Assign/RemoveDoubleSelfAssignRector/Fixture/skip_different_variable.php.inc new file mode 100644 index 00000000000..167ca86a371 --- /dev/null +++ b/rules-tests/DeadCode/Rector/Assign/RemoveDoubleSelfAssignRector/Fixture/skip_different_variable.php.inc @@ -0,0 +1,5 @@ +doTestFile($filePath); + } + + public static function provideData(): Iterator + { + return self::yieldFilesFromDirectory(__DIR__ . '/Fixture'); + } + + public function provideConfigFilePath(): string + { + return __DIR__ . '/config/configured_rule.php'; + } +} diff --git a/rules-tests/DeadCode/Rector/Assign/RemoveDoubleSelfAssignRector/config/configured_rule.php b/rules-tests/DeadCode/Rector/Assign/RemoveDoubleSelfAssignRector/config/configured_rule.php new file mode 100644 index 00000000000..dd0b4a244fc --- /dev/null +++ b/rules-tests/DeadCode/Rector/Assign/RemoveDoubleSelfAssignRector/config/configured_rule.php @@ -0,0 +1,9 @@ +withRules([RemoveDoubleSelfAssignRector::class]); diff --git a/rules/DeadCode/Rector/Assign/RemoveDoubleSelfAssignRector.php b/rules/DeadCode/Rector/Assign/RemoveDoubleSelfAssignRector.php new file mode 100644 index 00000000000..601e72a0297 --- /dev/null +++ b/rules/DeadCode/Rector/Assign/RemoveDoubleSelfAssignRector.php @@ -0,0 +1,61 @@ +> + */ + public function getNodeTypes(): array + { + return [Assign::class]; + } + + /** + * @param Assign $node + */ + public function refactor(Node $node): ?Node + { + if (! $node->var instanceof Variable) { + return null; + } + + if (! $node->expr instanceof Assign) { + return null; + } + + $innerAssign = $node->expr; + if (! $innerAssign->var instanceof Variable) { + return null; + } + + if (! $this->nodeComparator->areNodesEqual($node->var, $innerAssign->var)) { + return null; + } + + return $innerAssign; + } +} diff --git a/src/Config/Level/DeadCodeLevel.php b/src/Config/Level/DeadCodeLevel.php index 7beacae376f..e51ea974fb9 100644 --- a/src/Config/Level/DeadCodeLevel.php +++ b/src/Config/Level/DeadCodeLevel.php @@ -8,6 +8,7 @@ use Rector\Contract\Rector\RectorInterface; use Rector\DeadCode\Rector\Array_\RemoveDuplicatedArrayKeyRector; use Rector\DeadCode\Rector\Assign\RemoveDoubleAssignRector; +use Rector\DeadCode\Rector\Assign\RemoveDoubleSelfAssignRector; use Rector\DeadCode\Rector\Assign\RemoveUnusedVariableAssignRector; use Rector\DeadCode\Rector\Block\ReplaceBlockToItsStmtsRector; use Rector\DeadCode\Rector\BooleanAnd\RemoveAndTrueRector; @@ -109,6 +110,7 @@ final class DeadCodeLevel TernaryToBooleanOrFalseToBooleanAndRector::class, RemoveUselessTernaryRector::class, RemoveDoubleAssignRector::class, + RemoveDoubleSelfAssignRector::class, RemoveUselessAssignFromPropertyPromotionRector::class, RemoveConcatAutocastRector::class, SimplifyIfElseWithSameContentRector::class,