diff --git a/rules-tests/DeadCode/Rector/Closure/RemoveUnusedClosureVariableUseRector/Fixture/fixture.php.inc b/rules-tests/DeadCode/Rector/Closure/RemoveUnusedClosureVariableUseRector/Fixture/fixture.php.inc new file mode 100644 index 00000000000..00127e80452 --- /dev/null +++ b/rules-tests/DeadCode/Rector/Closure/RemoveUnusedClosureVariableUseRector/Fixture/fixture.php.inc @@ -0,0 +1,31 @@ + +----- + diff --git a/rules-tests/DeadCode/Rector/Closure/RemoveUnusedClosureVariableUseRector/Fixture/skip_used_variable.php.inc b/rules-tests/DeadCode/Rector/Closure/RemoveUnusedClosureVariableUseRector/Fixture/skip_used_variable.php.inc new file mode 100644 index 00000000000..d0f80a1abdd --- /dev/null +++ b/rules-tests/DeadCode/Rector/Closure/RemoveUnusedClosureVariableUseRector/Fixture/skip_used_variable.php.inc @@ -0,0 +1,15 @@ +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/Closure/RemoveUnusedClosureVariableUseRector/config/configured_rule.php b/rules-tests/DeadCode/Rector/Closure/RemoveUnusedClosureVariableUseRector/config/configured_rule.php new file mode 100644 index 00000000000..eeadae13ece --- /dev/null +++ b/rules-tests/DeadCode/Rector/Closure/RemoveUnusedClosureVariableUseRector/config/configured_rule.php @@ -0,0 +1,9 @@ +withRules([RemoveUnusedClosureVariableUseRector::class]); diff --git a/rules/DeadCode/Rector/Concat/RemoveUnusedClosureVariableUseRector.php b/rules/DeadCode/Rector/Concat/RemoveUnusedClosureVariableUseRector.php new file mode 100644 index 00000000000..f6322046f11 --- /dev/null +++ b/rules/DeadCode/Rector/Concat/RemoveUnusedClosureVariableUseRector.php @@ -0,0 +1,93 @@ +> + */ + public function getNodeTypes(): array + { + return [Closure::class]; + } + + /** + * @param Closure $node + */ + public function refactor(Node $node): ?Node + { + if ($node->uses === []) { + return null; + } + + $hasChanged = false; + + foreach ($node->uses as $key => $useVariable) { + $useVariableName = $this->getName($useVariable->var); + if (! is_string($useVariableName)) { + continue; + } + + $isUseUsed = (bool) $this->betterNodeFinder->findVariableOfName($node->stmts, $useVariableName); + if ($isUseUsed) { + continue; + } + + unset($node->uses[$key]); + $hasChanged = true; + + } + + if ($hasChanged) { + // reset keys, to keep as expected + $node->uses = array_values($node->uses); + return $node; + } + + return null; + } +} diff --git a/src/Config/Level/DeadCodeLevel.php b/src/Config/Level/DeadCodeLevel.php index b8dfcea0b28..63d26db5b5b 100644 --- a/src/Config/Level/DeadCodeLevel.php +++ b/src/Config/Level/DeadCodeLevel.php @@ -27,6 +27,7 @@ use Rector\DeadCode\Rector\ClassMethod\RemoveUselessReturnExprInConstructRector; use Rector\DeadCode\Rector\ClassMethod\RemoveUselessReturnTagRector; use Rector\DeadCode\Rector\Concat\RemoveConcatAutocastRector; +use Rector\DeadCode\Rector\Concat\RemoveUnusedClosureVariableUseRector; use Rector\DeadCode\Rector\ConstFetch\RemovePhpVersionIdCheckRector; use Rector\DeadCode\Rector\Expression\RemoveDeadStmtRector; use Rector\DeadCode\Rector\Expression\SimplifyMirrorAssignRector; @@ -115,6 +116,7 @@ final class DeadCodeLevel ReduceAlwaysFalseIfOrRector::class, RemoveUnusedPrivateClassConstantRector::class, RemoveUnusedPrivatePropertyRector::class, + RemoveUnusedClosureVariableUseRector::class, RemoveDuplicatedCaseInSwitchRector::class, RemoveDeadInstanceOfRector::class,