From 0bf535521e2937358674adfca5d374ae0817e7b5 Mon Sep 17 00:00:00 2001 From: John Shaffer Date: Tue, 21 Oct 2025 13:13:12 -0500 Subject: [PATCH 1/7] [DeadCode] Add RemoveDeadIfBlocksRector Removes ifs, elseifs, and elses with no body. Combines them with others when appropriate. ```diff class RemoveDeadIfBlock { public function run($condition) { - if ($value) { - } elseif ($differentValue) { - if ($differentValue) { - } else { - } - if ($differentValue) { echo 'different'; - } elseif ($value) { - } else { } - if ($differentValue) { - } elseif ($value) { + if (!$differentValue && $value) { echo 'value'; } else { } return $differentValue; } } ``` We avoid merging `if`` into following conditions when the `if` itself has a comment, because we can't tell if the comment will still be correct for the negated condition. At first, I tried adding logic to RemoveDeadIfForeachForRector to remove elseifs and elses. That worked, but as I added code it was clunky to have so much unrelated `if` logic in `for` and `foreach` rector. So I moved it to a brand new rector with a simpler implementation. I borrowed significant code from RemoveAlwaysTrueIfConditionRector as well. This can serve as support for smarter rectors like "RemoveAlwaysTrueIf" and my WIP "RemoveAlwaysFalseIf". Properly modifying `if`s requires a lot of extra logic that complicates the implementation of those rectors. In the future, they can do something simpler like removing the body statements but leaving the if structure in place. Then this rector can perform the restructuring of the if. --- .../Fixture/fixture.php.inc | 52 +++++ .../Fixture/if_else_no_stmt.php.inc | 32 ++++ .../Fixture/if_elseif_no_stmt.php.inc | 36 ++++ .../Fixture/if_no_stmt_with_else.php.inc | 32 ++++ .../if_no_stmt_with_else_no_stmt.php.inc | 28 +++ .../Fixture/side_effect_checks.php.inc | 33 ++++ .../Fixture/skip_if_comment.php.inc | 19 ++ .../Fixture/skip_used_in_next_stmt.php.inc | 19 ++ .../Fixture/skip_used_in_next_stmt2.php.inc | 19 ++ .../RemoveDeadIfBlocksRectorTest.php | 28 +++ .../config/configured_rule.php | 9 + .../Rector/If_/RemoveDeadIfBlocksRector.php | 180 ++++++++++++++++++ 12 files changed, 487 insertions(+) create mode 100644 rules-tests/DeadCode/Rector/If_/RemoveDeadIfBlocksRector/Fixture/fixture.php.inc create mode 100644 rules-tests/DeadCode/Rector/If_/RemoveDeadIfBlocksRector/Fixture/if_else_no_stmt.php.inc create mode 100644 rules-tests/DeadCode/Rector/If_/RemoveDeadIfBlocksRector/Fixture/if_elseif_no_stmt.php.inc create mode 100644 rules-tests/DeadCode/Rector/If_/RemoveDeadIfBlocksRector/Fixture/if_no_stmt_with_else.php.inc create mode 100644 rules-tests/DeadCode/Rector/If_/RemoveDeadIfBlocksRector/Fixture/if_no_stmt_with_else_no_stmt.php.inc create mode 100644 rules-tests/DeadCode/Rector/If_/RemoveDeadIfBlocksRector/Fixture/side_effect_checks.php.inc create mode 100644 rules-tests/DeadCode/Rector/If_/RemoveDeadIfBlocksRector/Fixture/skip_if_comment.php.inc create mode 100644 rules-tests/DeadCode/Rector/If_/RemoveDeadIfBlocksRector/Fixture/skip_used_in_next_stmt.php.inc create mode 100644 rules-tests/DeadCode/Rector/If_/RemoveDeadIfBlocksRector/Fixture/skip_used_in_next_stmt2.php.inc create mode 100644 rules-tests/DeadCode/Rector/If_/RemoveDeadIfBlocksRector/RemoveDeadIfBlocksRectorTest.php create mode 100644 rules-tests/DeadCode/Rector/If_/RemoveDeadIfBlocksRector/config/configured_rule.php create mode 100644 rules/DeadCode/Rector/If_/RemoveDeadIfBlocksRector.php diff --git a/rules-tests/DeadCode/Rector/If_/RemoveDeadIfBlocksRector/Fixture/fixture.php.inc b/rules-tests/DeadCode/Rector/If_/RemoveDeadIfBlocksRector/Fixture/fixture.php.inc new file mode 100644 index 00000000000..cd1d128d86d --- /dev/null +++ b/rules-tests/DeadCode/Rector/If_/RemoveDeadIfBlocksRector/Fixture/fixture.php.inc @@ -0,0 +1,52 @@ + +----- + diff --git a/rules-tests/DeadCode/Rector/If_/RemoveDeadIfBlocksRector/Fixture/if_else_no_stmt.php.inc b/rules-tests/DeadCode/Rector/If_/RemoveDeadIfBlocksRector/Fixture/if_else_no_stmt.php.inc new file mode 100644 index 00000000000..f4d7369ec63 --- /dev/null +++ b/rules-tests/DeadCode/Rector/If_/RemoveDeadIfBlocksRector/Fixture/if_else_no_stmt.php.inc @@ -0,0 +1,32 @@ + +----- + diff --git a/rules-tests/DeadCode/Rector/If_/RemoveDeadIfBlocksRector/Fixture/if_elseif_no_stmt.php.inc b/rules-tests/DeadCode/Rector/If_/RemoveDeadIfBlocksRector/Fixture/if_elseif_no_stmt.php.inc new file mode 100644 index 00000000000..c83b10a3c7a --- /dev/null +++ b/rules-tests/DeadCode/Rector/If_/RemoveDeadIfBlocksRector/Fixture/if_elseif_no_stmt.php.inc @@ -0,0 +1,36 @@ + +----- + diff --git a/rules-tests/DeadCode/Rector/If_/RemoveDeadIfBlocksRector/Fixture/if_no_stmt_with_else.php.inc b/rules-tests/DeadCode/Rector/If_/RemoveDeadIfBlocksRector/Fixture/if_no_stmt_with_else.php.inc new file mode 100644 index 00000000000..b3ff88692ba --- /dev/null +++ b/rules-tests/DeadCode/Rector/If_/RemoveDeadIfBlocksRector/Fixture/if_no_stmt_with_else.php.inc @@ -0,0 +1,32 @@ + +----- + diff --git a/rules-tests/DeadCode/Rector/If_/RemoveDeadIfBlocksRector/Fixture/if_no_stmt_with_else_no_stmt.php.inc b/rules-tests/DeadCode/Rector/If_/RemoveDeadIfBlocksRector/Fixture/if_no_stmt_with_else_no_stmt.php.inc new file mode 100644 index 00000000000..b3a7dd34328 --- /dev/null +++ b/rules-tests/DeadCode/Rector/If_/RemoveDeadIfBlocksRector/Fixture/if_no_stmt_with_else_no_stmt.php.inc @@ -0,0 +1,28 @@ + +----- + diff --git a/rules-tests/DeadCode/Rector/If_/RemoveDeadIfBlocksRector/Fixture/side_effect_checks.php.inc b/rules-tests/DeadCode/Rector/If_/RemoveDeadIfBlocksRector/Fixture/side_effect_checks.php.inc new file mode 100644 index 00000000000..abd393a3b6b --- /dev/null +++ b/rules-tests/DeadCode/Rector/If_/RemoveDeadIfBlocksRector/Fixture/side_effect_checks.php.inc @@ -0,0 +1,33 @@ + +----- + diff --git a/rules-tests/DeadCode/Rector/If_/RemoveDeadIfBlocksRector/Fixture/skip_if_comment.php.inc b/rules-tests/DeadCode/Rector/If_/RemoveDeadIfBlocksRector/Fixture/skip_if_comment.php.inc new file mode 100644 index 00000000000..4f2dd6b6562 --- /dev/null +++ b/rules-tests/DeadCode/Rector/If_/RemoveDeadIfBlocksRector/Fixture/skip_if_comment.php.inc @@ -0,0 +1,19 @@ + diff --git a/rules-tests/DeadCode/Rector/If_/RemoveDeadIfBlocksRector/Fixture/skip_used_in_next_stmt.php.inc b/rules-tests/DeadCode/Rector/If_/RemoveDeadIfBlocksRector/Fixture/skip_used_in_next_stmt.php.inc new file mode 100644 index 00000000000..d7b48bec3e5 --- /dev/null +++ b/rules-tests/DeadCode/Rector/If_/RemoveDeadIfBlocksRector/Fixture/skip_used_in_next_stmt.php.inc @@ -0,0 +1,19 @@ += 0 && $result[$i] === '0'; $i--) { + ; + } + + if ($i >= 0 && $result[$i] === $decimalSep) { + $i--; + } + + $result = substr($result, 0, $i + 1); + } +} diff --git a/rules-tests/DeadCode/Rector/If_/RemoveDeadIfBlocksRector/Fixture/skip_used_in_next_stmt2.php.inc b/rules-tests/DeadCode/Rector/If_/RemoveDeadIfBlocksRector/Fixture/skip_used_in_next_stmt2.php.inc new file mode 100644 index 00000000000..cf4814d6051 --- /dev/null +++ b/rules-tests/DeadCode/Rector/If_/RemoveDeadIfBlocksRector/Fixture/skip_used_in_next_stmt2.php.inc @@ -0,0 +1,19 @@ + $value) { + ; + } + + if ($i >= 0 && $result[$i] === $decimalSep) { + $i--; + } + + $result = substr($result, 0, $i + 1); + } +} diff --git a/rules-tests/DeadCode/Rector/If_/RemoveDeadIfBlocksRector/RemoveDeadIfBlocksRectorTest.php b/rules-tests/DeadCode/Rector/If_/RemoveDeadIfBlocksRector/RemoveDeadIfBlocksRectorTest.php new file mode 100644 index 00000000000..cf83d539e4e --- /dev/null +++ b/rules-tests/DeadCode/Rector/If_/RemoveDeadIfBlocksRector/RemoveDeadIfBlocksRectorTest.php @@ -0,0 +1,28 @@ +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/If_/RemoveDeadIfBlocksRector/config/configured_rule.php b/rules-tests/DeadCode/Rector/If_/RemoveDeadIfBlocksRector/config/configured_rule.php new file mode 100644 index 00000000000..e3defc172c3 --- /dev/null +++ b/rules-tests/DeadCode/Rector/If_/RemoveDeadIfBlocksRector/config/configured_rule.php @@ -0,0 +1,9 @@ +withRules([RemoveDeadIfBlocksRector::class]); diff --git a/rules/DeadCode/Rector/If_/RemoveDeadIfBlocksRector.php b/rules/DeadCode/Rector/If_/RemoveDeadIfBlocksRector.php new file mode 100644 index 00000000000..a762ef6f7fa --- /dev/null +++ b/rules/DeadCode/Rector/If_/RemoveDeadIfBlocksRector.php @@ -0,0 +1,180 @@ +> + */ + public function getNodeTypes(): array + { + return [If_::class]; + } + + /** + * @param If_ $node + * @return NodeVisitor::REMOVE_NODE|null|If_ + */ + public function refactor(Node $node): int|null|If_ + { + if ($node->else instanceof Else_ && $node->else->stmts === []) { + $node->else = null; + return $this->refactor($node) ?? $node; + } + + if ($node->elseifs !== []) { + foreach ($node->elseifs as $elseif) { + $keep_elseifs = array_filter( + $node->elseifs, + fn ($elseif) => $elseif->stmts !== [] && ! $this->shouldSkipExpr($elseif->cond) + ); + if (count($node->elseifs) !== count($keep_elseifs)) { + $node->elseifs = $keep_elseifs; + return $this->refactor($node) ?? $node; + } + } + } + + if ($node->stmts !== []) { + return null; + } + + // Skip commented blocks because we can't know + // if the comment will make sense after merging. + if ($node->getComments() !== []) { + return null; + } + + if ($this->shouldSkipExpr($node->cond)) { + return null; + } + + // When the if body is blank but it has an elseif, + // merge the negated if condition with the elseif condition + if ($node->elseifs !== []) { + $firstElseIf = $node->elseifs[0]; + $cond = new BooleanAnd( + $this->conditionInverter->createInvertedCondition($node->cond), + $firstElseIf->cond + ); + $if = new If_($cond, [ + 'stmts' => $firstElseIf->stmts, + ]); + if (count($node->elseifs) > 1) { + $if->elseifs = \array_slice($node->elseifs, 1); + } + return $this->refactor($if) ?? $if; + } + + if ($node->else instanceof Else_) { + $node->cond = $this->conditionInverter->createInvertedCondition($node->cond); + $node->stmts = $node->else->stmts; + $node->else = null; + return $node; + } + + return NodeVisitor::REMOVE_NODE; + } + + private function shouldSkipExpr(Expr $expr): bool + { + return (bool) $this->betterNodeFinder->findInstancesOf( + $expr, + [ + Assign::class, + ArrayDimFetch::class, + CallLike::class, + MethodCall::class, + PropertyFetch::class, + StaticCall::class, + StaticPropertyFetch::class, + ] + ); + } +} From 6ce2fcb0955996eb93ef8f333160c1df82733946 Mon Sep 17 00:00:00 2001 From: John Shaffer Date: Tue, 21 Oct 2025 13:41:03 -0500 Subject: [PATCH 2/7] [DeadCode] Add RemoveDeadIfBlocksRector to levels --- src/Config/Level/DeadCodeLevel.php | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/Config/Level/DeadCodeLevel.php b/src/Config/Level/DeadCodeLevel.php index 70a2ab4d44e..a3157e7847e 100644 --- a/src/Config/Level/DeadCodeLevel.php +++ b/src/Config/Level/DeadCodeLevel.php @@ -41,6 +41,7 @@ use Rector\DeadCode\Rector\FunctionLike\RemoveDeadReturnRector; use Rector\DeadCode\Rector\If_\ReduceAlwaysFalseIfOrRector; use Rector\DeadCode\Rector\If_\RemoveAlwaysTrueIfConditionRector; +use Rector\DeadCode\Rector\If_\RemoveDeadIfBlocksRector; use Rector\DeadCode\Rector\If_\RemoveDeadInstanceOfRector; use Rector\DeadCode\Rector\If_\RemoveTypedPropertyDeadInstanceOfRector; use Rector\DeadCode\Rector\If_\RemoveUnusedNonEmptyArrayBeforeForeachRector; @@ -129,6 +130,7 @@ final class DeadCodeLevel RemoveDeadCatchRector::class, RemoveDeadTryCatchRector::class, + RemoveDeadIfBlocksRector::class, RemoveDeadIfForeachForRector::class, RemoveConditionExactReturnRector::class, RemoveDeadStmtRector::class, From 02d3dcabad989ce5ce2b6d0befd3b3bd00419fc2 Mon Sep 17 00:00:00 2001 From: John Shaffer Date: Tue, 21 Oct 2025 14:05:53 -0500 Subject: [PATCH 3/7] Fix removing elseifs that should be skipped I accidentally put an && ! condition rather than an ||, causing elseifs with skippable exprs to get removed rather than being skipped. - Fix the conditional - Add a test for skippable exprs in elseif condition. --- .../Fixture/skip_property_fetch.php.inc | 17 +++++++++++++++++ .../Rector/If_/RemoveDeadIfBlocksRector.php | 2 +- 2 files changed, 18 insertions(+), 1 deletion(-) create mode 100644 rules-tests/DeadCode/Rector/If_/RemoveDeadIfBlocksRector/Fixture/skip_property_fetch.php.inc diff --git a/rules-tests/DeadCode/Rector/If_/RemoveDeadIfBlocksRector/Fixture/skip_property_fetch.php.inc b/rules-tests/DeadCode/Rector/If_/RemoveDeadIfBlocksRector/Fixture/skip_property_fetch.php.inc new file mode 100644 index 00000000000..a9c7c84c0cf --- /dev/null +++ b/rules-tests/DeadCode/Rector/If_/RemoveDeadIfBlocksRector/Fixture/skip_property_fetch.php.inc @@ -0,0 +1,17 @@ +v) { + echo '2'; + } + } +} + +?> diff --git a/rules/DeadCode/Rector/If_/RemoveDeadIfBlocksRector.php b/rules/DeadCode/Rector/If_/RemoveDeadIfBlocksRector.php index a762ef6f7fa..c966b956dfe 100644 --- a/rules/DeadCode/Rector/If_/RemoveDeadIfBlocksRector.php +++ b/rules/DeadCode/Rector/If_/RemoveDeadIfBlocksRector.php @@ -112,7 +112,7 @@ public function refactor(Node $node): int|null|If_ foreach ($node->elseifs as $elseif) { $keep_elseifs = array_filter( $node->elseifs, - fn ($elseif) => $elseif->stmts !== [] && ! $this->shouldSkipExpr($elseif->cond) + fn ($elseif) => $elseif->stmts !== [] || $this->shouldSkipExpr($elseif->cond) ); if (count($node->elseifs) !== count($keep_elseifs)) { $node->elseifs = $keep_elseifs; From 36b3d4f10960cd4c7ae357f5e39a3ae5c6df52b2 Mon Sep 17 00:00:00 2001 From: John Shaffer Date: Fri, 24 Oct 2025 13:15:38 -0500 Subject: [PATCH 4/7] Use SideEffectNodeDetector --- .../Rector/If_/RemoveDeadIfBlocksRector.php | 32 +++---------------- 1 file changed, 4 insertions(+), 28 deletions(-) diff --git a/rules/DeadCode/Rector/If_/RemoveDeadIfBlocksRector.php b/rules/DeadCode/Rector/If_/RemoveDeadIfBlocksRector.php index c966b956dfe..c0b5e4e55e0 100644 --- a/rules/DeadCode/Rector/If_/RemoveDeadIfBlocksRector.php +++ b/rules/DeadCode/Rector/If_/RemoveDeadIfBlocksRector.php @@ -5,20 +5,12 @@ namespace Rector\DeadCode\Rector\If_; use PhpParser\Node; -use PhpParser\Node\Expr; -use PhpParser\Node\Expr\ArrayDimFetch; -use PhpParser\Node\Expr\Assign; use PhpParser\Node\Expr\BinaryOp\BooleanAnd; -use PhpParser\Node\Expr\CallLike; -use PhpParser\Node\Expr\MethodCall; -use PhpParser\Node\Expr\PropertyFetch; -use PhpParser\Node\Expr\StaticCall; -use PhpParser\Node\Expr\StaticPropertyFetch; use PhpParser\Node\Stmt\Else_; use PhpParser\Node\Stmt\If_; use PhpParser\NodeVisitor; +use Rector\DeadCode\SideEffect\SideEffectNodeDetector; use Rector\EarlyReturn\NodeTransformer\ConditionInverter; -use Rector\PhpParser\Node\BetterNodeFinder; use Rector\Rector\AbstractRector; use Symplify\RuleDocGenerator\ValueObject\CodeSample\CodeSample; use Symplify\RuleDocGenerator\ValueObject\RuleDefinition; @@ -30,7 +22,7 @@ final class RemoveDeadIfBlocksRector extends AbstractRector { public function __construct( private readonly ConditionInverter $conditionInverter, - private readonly BetterNodeFinder $betterNodeFinder, + private readonly SideEffectNodeDetector $sideEffectNodeDetector, ) { } @@ -112,7 +104,7 @@ public function refactor(Node $node): int|null|If_ foreach ($node->elseifs as $elseif) { $keep_elseifs = array_filter( $node->elseifs, - fn ($elseif) => $elseif->stmts !== [] || $this->shouldSkipExpr($elseif->cond) + fn ($elseif) => $elseif->stmts !== [] || $this->sideEffectNodeDetector->detect($elseif->cond) ); if (count($node->elseifs) !== count($keep_elseifs)) { $node->elseifs = $keep_elseifs; @@ -131,7 +123,7 @@ public function refactor(Node $node): int|null|If_ return null; } - if ($this->shouldSkipExpr($node->cond)) { + if ($this->sideEffectNodeDetector->detect($node->cond)) { return null; } @@ -161,20 +153,4 @@ public function refactor(Node $node): int|null|If_ return NodeVisitor::REMOVE_NODE; } - - private function shouldSkipExpr(Expr $expr): bool - { - return (bool) $this->betterNodeFinder->findInstancesOf( - $expr, - [ - Assign::class, - ArrayDimFetch::class, - CallLike::class, - MethodCall::class, - PropertyFetch::class, - StaticCall::class, - StaticPropertyFetch::class, - ] - ); - } } From ea69bfb831a8426b8bf226e04a9d811d8a4a67e3 Mon Sep 17 00:00:00 2001 From: John Shaffer Date: Fri, 24 Oct 2025 15:04:03 -0500 Subject: [PATCH 5/7] Rename to singular to match other class names --- .../Fixture/fixture.php.inc | 4 ++-- .../Fixture/if_else_no_stmt.php.inc | 4 ++-- .../Fixture/if_elseif_no_stmt.php.inc | 4 ++-- .../Fixture/if_no_stmt_with_else.php.inc | 4 ++-- .../Fixture/if_no_stmt_with_else_no_stmt.php.inc | 4 ++-- .../Fixture/side_effect_checks.php.inc | 4 ++-- .../Fixture/skip_if_comment.php.inc | 2 +- .../Fixture/skip_property_fetch.php.inc | 2 +- .../Fixture/skip_used_in_next_stmt.php.inc | 2 +- .../Fixture/skip_used_in_next_stmt2.php.inc | 2 +- .../RemoveDeadIfBlockRectorTest.php} | 4 ++-- .../RemoveDeadIfBlockRector/config/configured_rule.php | 9 +++++++++ .../RemoveDeadIfBlocksRector/config/configured_rule.php | 9 --------- ...eadIfBlocksRector.php => RemoveDeadIfBlockRector.php} | 4 ++-- src/Config/Level/DeadCodeLevel.php | 4 ++-- 15 files changed, 31 insertions(+), 31 deletions(-) rename rules-tests/DeadCode/Rector/If_/{RemoveDeadIfBlocksRector => RemoveDeadIfBlockRector}/Fixture/fixture.php.inc (82%) rename rules-tests/DeadCode/Rector/If_/{RemoveDeadIfBlocksRector => RemoveDeadIfBlockRector}/Fixture/if_else_no_stmt.php.inc (67%) rename rules-tests/DeadCode/Rector/If_/{RemoveDeadIfBlocksRector => RemoveDeadIfBlockRector}/Fixture/if_elseif_no_stmt.php.inc (74%) rename rules-tests/DeadCode/Rector/If_/{RemoveDeadIfBlocksRector => RemoveDeadIfBlockRector}/Fixture/if_no_stmt_with_else.php.inc (68%) rename rules-tests/DeadCode/Rector/If_/{RemoveDeadIfBlocksRector => RemoveDeadIfBlockRector}/Fixture/if_no_stmt_with_else_no_stmt.php.inc (61%) rename rules-tests/DeadCode/Rector/If_/{RemoveDeadIfBlocksRector => RemoveDeadIfBlockRector}/Fixture/side_effect_checks.php.inc (62%) rename rules-tests/DeadCode/Rector/If_/{RemoveDeadIfBlocksRector => RemoveDeadIfBlockRector}/Fixture/skip_if_comment.php.inc (74%) rename rules-tests/DeadCode/Rector/If_/{RemoveDeadIfBlocksRector => RemoveDeadIfBlockRector}/Fixture/skip_property_fetch.php.inc (72%) rename rules-tests/DeadCode/Rector/If_/{RemoveDeadIfBlocksRector => RemoveDeadIfBlockRector}/Fixture/skip_used_in_next_stmt.php.inc (81%) rename rules-tests/DeadCode/Rector/If_/{RemoveDeadIfBlocksRector => RemoveDeadIfBlockRector}/Fixture/skip_used_in_next_stmt2.php.inc (79%) rename rules-tests/DeadCode/Rector/If_/{RemoveDeadIfBlocksRector/RemoveDeadIfBlocksRectorTest.php => RemoveDeadIfBlockRector/RemoveDeadIfBlockRectorTest.php} (79%) create mode 100644 rules-tests/DeadCode/Rector/If_/RemoveDeadIfBlockRector/config/configured_rule.php delete mode 100644 rules-tests/DeadCode/Rector/If_/RemoveDeadIfBlocksRector/config/configured_rule.php rename rules/DeadCode/Rector/If_/{RemoveDeadIfBlocksRector.php => RemoveDeadIfBlockRector.php} (96%) diff --git a/rules-tests/DeadCode/Rector/If_/RemoveDeadIfBlocksRector/Fixture/fixture.php.inc b/rules-tests/DeadCode/Rector/If_/RemoveDeadIfBlockRector/Fixture/fixture.php.inc similarity index 82% rename from rules-tests/DeadCode/Rector/If_/RemoveDeadIfBlocksRector/Fixture/fixture.php.inc rename to rules-tests/DeadCode/Rector/If_/RemoveDeadIfBlockRector/Fixture/fixture.php.inc index cd1d128d86d..866d950a398 100644 --- a/rules-tests/DeadCode/Rector/If_/RemoveDeadIfBlocksRector/Fixture/fixture.php.inc +++ b/rules-tests/DeadCode/Rector/If_/RemoveDeadIfBlockRector/Fixture/fixture.php.inc @@ -1,6 +1,6 @@ withRules([RemoveDeadIfBlockRector::class]); diff --git a/rules-tests/DeadCode/Rector/If_/RemoveDeadIfBlocksRector/config/configured_rule.php b/rules-tests/DeadCode/Rector/If_/RemoveDeadIfBlocksRector/config/configured_rule.php deleted file mode 100644 index e3defc172c3..00000000000 --- a/rules-tests/DeadCode/Rector/If_/RemoveDeadIfBlocksRector/config/configured_rule.php +++ /dev/null @@ -1,9 +0,0 @@ -withRules([RemoveDeadIfBlocksRector::class]); diff --git a/rules/DeadCode/Rector/If_/RemoveDeadIfBlocksRector.php b/rules/DeadCode/Rector/If_/RemoveDeadIfBlockRector.php similarity index 96% rename from rules/DeadCode/Rector/If_/RemoveDeadIfBlocksRector.php rename to rules/DeadCode/Rector/If_/RemoveDeadIfBlockRector.php index c0b5e4e55e0..87456f68511 100644 --- a/rules/DeadCode/Rector/If_/RemoveDeadIfBlocksRector.php +++ b/rules/DeadCode/Rector/If_/RemoveDeadIfBlockRector.php @@ -16,9 +16,9 @@ use Symplify\RuleDocGenerator\ValueObject\RuleDefinition; /** - * @see \Rector\Tests\DeadCode\Rector\If_\RemoveDeadIfBlocksRector\RemoveDeadIfBlocksRectorTest + * @see \Rector\Tests\DeadCode\Rector\If_\RemoveDeadIfBlockRector\RemoveDeadIfBlockRectorTest */ -final class RemoveDeadIfBlocksRector extends AbstractRector +final class RemoveDeadIfBlockRector extends AbstractRector { public function __construct( private readonly ConditionInverter $conditionInverter, diff --git a/src/Config/Level/DeadCodeLevel.php b/src/Config/Level/DeadCodeLevel.php index a3157e7847e..ab64aba9797 100644 --- a/src/Config/Level/DeadCodeLevel.php +++ b/src/Config/Level/DeadCodeLevel.php @@ -41,7 +41,7 @@ use Rector\DeadCode\Rector\FunctionLike\RemoveDeadReturnRector; use Rector\DeadCode\Rector\If_\ReduceAlwaysFalseIfOrRector; use Rector\DeadCode\Rector\If_\RemoveAlwaysTrueIfConditionRector; -use Rector\DeadCode\Rector\If_\RemoveDeadIfBlocksRector; +use Rector\DeadCode\Rector\If_\RemoveDeadIfBlockRector; use Rector\DeadCode\Rector\If_\RemoveDeadInstanceOfRector; use Rector\DeadCode\Rector\If_\RemoveTypedPropertyDeadInstanceOfRector; use Rector\DeadCode\Rector\If_\RemoveUnusedNonEmptyArrayBeforeForeachRector; @@ -130,7 +130,7 @@ final class DeadCodeLevel RemoveDeadCatchRector::class, RemoveDeadTryCatchRector::class, - RemoveDeadIfBlocksRector::class, + RemoveDeadIfBlockRector::class, RemoveDeadIfForeachForRector::class, RemoveConditionExactReturnRector::class, RemoveDeadStmtRector::class, From c1cfff79b3a69d858f5f513eec8b85422bb0dc29 Mon Sep 17 00:00:00 2001 From: John Shaffer Date: Tue, 30 Dec 2025 14:47:59 -0600 Subject: [PATCH 6/7] Test that RemoveDeadIfBlock preserves calls Add a test case to ensure that RemoveDeadIfBlockRector does not remove function calls in if conditions. --- .../Fixture/side_effect_checks.php.inc | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/rules-tests/DeadCode/Rector/If_/RemoveDeadIfBlockRector/Fixture/side_effect_checks.php.inc b/rules-tests/DeadCode/Rector/If_/RemoveDeadIfBlockRector/Fixture/side_effect_checks.php.inc index 1d8200fa22f..77c6e2e881c 100644 --- a/rules-tests/DeadCode/Rector/If_/RemoveDeadIfBlockRector/Fixture/side_effect_checks.php.inc +++ b/rules-tests/DeadCode/Rector/If_/RemoveDeadIfBlockRector/Fixture/side_effect_checks.php.inc @@ -14,6 +14,13 @@ class SideEffectChecks if (5 + 10) { } + + if ($this->someCall()) { + } + + if (false) { + } elseif ($this->anotherCall()) { + } } } @@ -27,6 +34,11 @@ class SideEffectChecks { public function run() { + if ($this->someCall()) { + } + + if (!false && $this->anotherCall()) { + } } } From 85c6f5cbb0dd21a09877d3a3e49ecebea85f5c9b Mon Sep 17 00:00:00 2001 From: John Shaffer Date: Tue, 30 Dec 2025 15:14:59 -0600 Subject: [PATCH 7/7] Fix typo --- .../If_/RemoveDeadIfBlockRector/Fixture/skip_if_comment.php.inc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/rules-tests/DeadCode/Rector/If_/RemoveDeadIfBlockRector/Fixture/skip_if_comment.php.inc b/rules-tests/DeadCode/Rector/If_/RemoveDeadIfBlockRector/Fixture/skip_if_comment.php.inc index a8bbd1cf214..7932e5a16bf 100644 --- a/rules-tests/DeadCode/Rector/If_/RemoveDeadIfBlockRector/Fixture/skip_if_comment.php.inc +++ b/rules-tests/DeadCode/Rector/If_/RemoveDeadIfBlockRector/Fixture/skip_if_comment.php.inc @@ -9,7 +9,7 @@ class MergeComments // toplevel if ($b) { } elseif (!$b) { - // first innner + // first inner f(); // second inner }