diff --git a/rules-tests/EarlyReturn/Rector/If_/RemoveAlwaysElseRector/Fixture/elseif.php.inc b/rules-tests/EarlyReturn/Rector/If_/RemoveAlwaysElseRector/Fixture/elseif.php.inc index be5cc8ad31c..c6a15298a74 100644 --- a/rules-tests/EarlyReturn/Rector/If_/RemoveAlwaysElseRector/Fixture/elseif.php.inc +++ b/rules-tests/EarlyReturn/Rector/If_/RemoveAlwaysElseRector/Fixture/elseif.php.inc @@ -35,7 +35,8 @@ class ElseIf_ bar(); } elseif ($cond3) { baz(); - } else { + } + else { foo(); } } diff --git a/rules-tests/EarlyReturn/Rector/If_/RemoveAlwaysElseRector/Fixture/keep_the_else_if_elseif_has_no_stmt.php.inc b/rules-tests/EarlyReturn/Rector/If_/RemoveAlwaysElseRector/Fixture/keep_the_else_if_elseif_has_no_stmt.php.inc new file mode 100644 index 00000000000..b778fb2a7c2 --- /dev/null +++ b/rules-tests/EarlyReturn/Rector/If_/RemoveAlwaysElseRector/Fixture/keep_the_else_if_elseif_has_no_stmt.php.inc @@ -0,0 +1,50 @@ + +----- + diff --git a/rules-tests/EarlyReturn/Rector/If_/RemoveAlwaysElseRector/Fixture/lost_comment_before_elseif2.php.inc b/rules-tests/EarlyReturn/Rector/If_/RemoveAlwaysElseRector/Fixture/lost_comment_before_elseif2.php.inc new file mode 100644 index 00000000000..a0f31fe1818 --- /dev/null +++ b/rules-tests/EarlyReturn/Rector/If_/RemoveAlwaysElseRector/Fixture/lost_comment_before_elseif2.php.inc @@ -0,0 +1,44 @@ + +----- + diff --git a/rules-tests/EarlyReturn/Rector/If_/RemoveAlwaysElseRector/Fixture/process_empty_return_last.php.inc b/rules-tests/EarlyReturn/Rector/If_/RemoveAlwaysElseRector/Fixture/process_empty_return_last.php.inc index b67964983be..ca6d518b0b9 100644 --- a/rules-tests/EarlyReturn/Rector/If_/RemoveAlwaysElseRector/Fixture/process_empty_return_last.php.inc +++ b/rules-tests/EarlyReturn/Rector/If_/RemoveAlwaysElseRector/Fixture/process_empty_return_last.php.inc @@ -46,7 +46,8 @@ class ProcessEmptyReturnLast if ($value - 1) { $value = 55; return 10; - } else { + } + else { return; } } diff --git a/rules/EarlyReturn/Rector/If_/RemoveAlwaysElseRector.php b/rules/EarlyReturn/Rector/If_/RemoveAlwaysElseRector.php index f921e407e77..234db18bbef 100644 --- a/rules/EarlyReturn/Rector/If_/RemoveAlwaysElseRector.php +++ b/rules/EarlyReturn/Rector/If_/RemoveAlwaysElseRector.php @@ -7,6 +7,7 @@ namespace Rector\EarlyReturn\Rector\If_; use PhpParser\Node; use PhpParser\Node\Expr\Exit_; use PhpParser\Node\Stmt\Continue_; +use PhpParser\Node\Stmt\Else_; use PhpParser\Node\Stmt\ElseIf_; use PhpParser\Node\Stmt\Expression; use PhpParser\Node\Stmt\If_; @@ -77,10 +78,12 @@ CODE_SAMPLE } if ($node->elseifs !== []) { + $originalNode = clone $node; $if = new If_($node->cond); $if->stmts = $node->stmts; $this->addNodeBeforeNode($if, $node); + $this->mirrorComments($if, $node); /** @var ElseIf_ $firstElseIf */ $firstElseIf = array_shift($node->elseifs); @@ -88,6 +91,16 @@ CODE_SAMPLE $node->stmts = $firstElseIf->stmts; $this->mirrorComments($node, $firstElseIf); + $statements = $this->getStatementsElseIfs($node); + if ($statements !== []) { + $this->addNodesAfterNode($statements, $node); + } + + if ($originalNode->else instanceof Else_) { + $node->else = null; + $this->addNodeAfterNode($originalNode->else, $node); + } + return $node; } @@ -100,9 +113,30 @@ CODE_SAMPLE return null; } - private function doesLastStatementBreakFlow(If_ $if): bool + /** + * @return ElseIf_[] + */ + private function getStatementsElseIfs(If_ $if): array { - $lastStmt = end($if->stmts); + $statements = []; + foreach ($if->elseifs as $key => $elseif) { + if ($this->doesLastStatementBreakFlow($elseif) && $elseif->stmts !== []) { + continue; + } + + $statements[] = $elseif; + unset($if->elseifs[$key]); + } + + return $statements; + } + + /** + * @param If_|ElseIf_ $node + */ + private function doesLastStatementBreakFlow(Node $node): bool + { + $lastStmt = end($node->stmts); return ! ($lastStmt instanceof Return_ || $lastStmt instanceof Throw_