diff --git a/rules-tests/DeadCode/Rector/Assign/RemoveUnusedVariableAssignRector/Fixture/skip_used_by_use_by_ref_closure.php.inc b/rules-tests/DeadCode/Rector/Assign/RemoveUnusedVariableAssignRector/Fixture/skip_used_by_use_by_ref_closure.php.inc new file mode 100644 index 00000000000..4a1a406a771 --- /dev/null +++ b/rules-tests/DeadCode/Rector/Assign/RemoveUnusedVariableAssignRector/Fixture/skip_used_by_use_by_ref_closure.php.inc @@ -0,0 +1,16 @@ + diff --git a/rules/DeadCode/Rector/Assign/RemoveUnusedVariableAssignRector.php b/rules/DeadCode/Rector/Assign/RemoveUnusedVariableAssignRector.php index 04e8d36e32a..281485e2260 100644 --- a/rules/DeadCode/Rector/Assign/RemoveUnusedVariableAssignRector.php +++ b/rules/DeadCode/Rector/Assign/RemoveUnusedVariableAssignRector.php @@ -9,13 +9,16 @@ use PhpParser\Node\Expr\Assign; use PhpParser\Node\Expr\AssignRef; use PhpParser\Node\Expr\Cast; +use PhpParser\Node\Expr\Closure; use PhpParser\Node\Expr\FuncCall; use PhpParser\Node\Expr\Include_; use PhpParser\Node\Expr\Variable; use PhpParser\Node\Stmt; +use PhpParser\Node\Stmt\Class_; use PhpParser\Node\Stmt\ClassMethod; use PhpParser\Node\Stmt\Expression; use PhpParser\Node\Stmt\Function_; +use PhpParser\NodeVisitor; use Rector\DeadCode\SideEffect\SideEffectNodeDetector; use Rector\NodeAnalyzer\VariableAnalyzer; use Rector\NodeManipulator\StmtsManipulator; @@ -180,6 +183,31 @@ private function resolvedAssignedVariablesByStmtPosition(array $stmts): array continue; } + $this->traverseNodesWithCallable( + $stmt->expr->expr, + function (Node $subNode) use (&$refVariableNames) { + if ($subNode instanceof Class_ || $subNode instanceof Function_) { + return NodeVisitor::DONT_TRAVERSE_CURRENT_AND_CHILDREN; + } + + if (! $subNode instanceof Closure) { + return null; + } + + foreach ($subNode->uses as $closureUse) { + if (! $closureUse->var instanceof Variable) { + continue; + } + + if (! $closureUse->byRef) { + continue; + } + + $refVariableNames[] = (string) $this->getName($closureUse->var); + } + } + ); + $assign = $stmt->expr; if (! $assign->var instanceof Variable) { continue;