From 6a04e90ae197dc9efbefcb9454005ed7f83c9de6 Mon Sep 17 00:00:00 2001 From: Abdul Malik Ikhsan Date: Wed, 19 Nov 2025 10:41:02 +0700 Subject: [PATCH 1/2] [DeadCode] Skip used from property fetch reference on loop on RemoveUnusedVariableAssignRector --- ..._used_from_property_fetch_reference.php.inc | 13 +++++++++++++ .../RemoveUnusedVariableAssignRector.php | 18 ++++++++++++++++++ 2 files changed, 31 insertions(+) create mode 100644 rules-tests/DeadCode/Rector/Assign/RemoveUnusedVariableAssignRector/Fixture/skip_used_from_property_fetch_reference.php.inc diff --git a/rules-tests/DeadCode/Rector/Assign/RemoveUnusedVariableAssignRector/Fixture/skip_used_from_property_fetch_reference.php.inc b/rules-tests/DeadCode/Rector/Assign/RemoveUnusedVariableAssignRector/Fixture/skip_used_from_property_fetch_reference.php.inc new file mode 100644 index 00000000000..0e540013678 --- /dev/null +++ b/rules-tests/DeadCode/Rector/Assign/RemoveUnusedVariableAssignRector/Fixture/skip_used_from_property_fetch_reference.php.inc @@ -0,0 +1,13 @@ +{$key}; + } + $current = $value; +} + +?> diff --git a/rules/DeadCode/Rector/Assign/RemoveUnusedVariableAssignRector.php b/rules/DeadCode/Rector/Assign/RemoveUnusedVariableAssignRector.php index eeed814e41e..266075ef3f5 100644 --- a/rules/DeadCode/Rector/Assign/RemoveUnusedVariableAssignRector.php +++ b/rules/DeadCode/Rector/Assign/RemoveUnusedVariableAssignRector.php @@ -19,6 +19,7 @@ use PhpParser\Node\Stmt\Expression; use PhpParser\Node\Stmt\Function_; use PhpParser\NodeVisitor; +use Rector\Contract\PhpParser\Node\StmtsAwareInterface; use Rector\DeadCode\SideEffect\SideEffectNodeDetector; use Rector\NodeAnalyzer\VariableAnalyzer; use Rector\NodeManipulator\StmtsManipulator; @@ -158,6 +159,22 @@ private function shouldSkip(array $stmts): bool }); } + private function collectAssignRefVariableNames(Stmt $stmt, array &$refVariableNames): void + { + if (! $stmt instanceof StmtsAwareInterface) { + return; + } + + $this->traverseNodesWithCallable( + $stmt, + function (Node $subNode) use (&$refVariableNames): void { + if ($subNode instanceof AssignRef && $subNode->var instanceof Variable) { + $refVariableNames[] = (string) $this->getName($subNode->var); + } + } + ); + } + /** * @param array $stmts * @return array @@ -169,6 +186,7 @@ private function resolvedAssignedVariablesByStmtPosition(array $stmts): array foreach ($stmts as $key => $stmt) { if (! $stmt instanceof Expression) { + $this->collectAssignRefVariableNames($stmt, $refVariableNames); continue; } From a4a28e40f9ba7a71af6f8f5cf59e21b0c586f550 Mon Sep 17 00:00:00 2001 From: Abdul Malik Ikhsan Date: Wed, 19 Nov 2025 10:43:17 +0700 Subject: [PATCH 2/2] fix phpstan --- .../Rector/Assign/RemoveUnusedVariableAssignRector.php | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/rules/DeadCode/Rector/Assign/RemoveUnusedVariableAssignRector.php b/rules/DeadCode/Rector/Assign/RemoveUnusedVariableAssignRector.php index 266075ef3f5..0417e173d4a 100644 --- a/rules/DeadCode/Rector/Assign/RemoveUnusedVariableAssignRector.php +++ b/rules/DeadCode/Rector/Assign/RemoveUnusedVariableAssignRector.php @@ -159,6 +159,9 @@ private function shouldSkip(array $stmts): bool }); } + /** + * @param string[] $refVariableNames + */ private function collectAssignRefVariableNames(Stmt $stmt, array &$refVariableNames): void { if (! $stmt instanceof StmtsAwareInterface) { @@ -167,10 +170,12 @@ private function collectAssignRefVariableNames(Stmt $stmt, array &$refVariableNa $this->traverseNodesWithCallable( $stmt, - function (Node $subNode) use (&$refVariableNames): void { + function (Node $subNode) use (&$refVariableNames): Node { if ($subNode instanceof AssignRef && $subNode->var instanceof Variable) { $refVariableNames[] = (string) $this->getName($subNode->var); } + + return $subNode; } ); }