From 654d4a2a2ba408a3143a5a11a775750b90b27866 Mon Sep 17 00:00:00 2001 From: Abdul Malik Ikhsan Date: Tue, 31 Aug 2021 19:20:06 +0700 Subject: [PATCH] [EarlyReturn] Skip ChangeOrIfReturnToEarlyReturnRector on next node is null or return void (#796) --- .../Rector/If_/ChangeOrIfReturnToEarlyReturnRector.php | 10 ++++++++++ .../Fixture/and_next_or.php.inc | 6 ++---- .../Fixture/complex_if_cond_or_without_elseif.php.inc | 5 +---- 3 files changed, 13 insertions(+), 8 deletions(-) diff --git a/rules/EarlyReturn/Rector/If_/ChangeOrIfReturnToEarlyReturnRector.php b/rules/EarlyReturn/Rector/If_/ChangeOrIfReturnToEarlyReturnRector.php index 9426b3433aa..5c0678c8359 100644 --- a/rules/EarlyReturn/Rector/If_/ChangeOrIfReturnToEarlyReturnRector.php +++ b/rules/EarlyReturn/Rector/If_/ChangeOrIfReturnToEarlyReturnRector.php @@ -12,6 +12,7 @@ use PhpParser\Node\Stmt\Return_; use Rector\Core\NodeManipulator\IfManipulator; use Rector\Core\Rector\AbstractRector; +use Rector\NodeTypeResolver\Node\AttributeKey; use Symplify\RuleDocGenerator\ValueObject\CodeSample\CodeSample; use Symplify\RuleDocGenerator\ValueObject\RuleDefinition; @@ -89,6 +90,15 @@ public function refactor(Node $node): ?Node return null; } + $nextNode = $node->getAttribute(AttributeKey::NEXT_NODE); + if ($nextNode === null) { + return null; + } + + if ($nextNode instanceof Return_ && $nextNode->expr === null) { + return null; + } + /** @var Return_ $return */ $return = $node->stmts[0]; $ifs = $this->createMultipleIfs($node->cond, $return, []); diff --git a/tests/Issues/IssueEarlyReturnAndOrNarrow/Fixture/and_next_or.php.inc b/tests/Issues/IssueEarlyReturnAndOrNarrow/Fixture/and_next_or.php.inc index 274d3fa0981..a3f0776f370 100644 --- a/tests/Issues/IssueEarlyReturnAndOrNarrow/Fixture/and_next_or.php.inc +++ b/tests/Issues/IssueEarlyReturnAndOrNarrow/Fixture/and_next_or.php.inc @@ -31,12 +31,10 @@ class AndNextOrReturnVoid */ public function run($a, $b, $c, $d) { - if ($a && $b) { - return null; - } - if ($c) { + if ($a && $b || $c) { return null; } + return; } } diff --git a/tests/Issues/IssueReturnBeforeElseIf/Fixture/complex_if_cond_or_without_elseif.php.inc b/tests/Issues/IssueReturnBeforeElseIf/Fixture/complex_if_cond_or_without_elseif.php.inc index ebc16f0e5db..423b6ffe982 100644 --- a/tests/Issues/IssueReturnBeforeElseIf/Fixture/complex_if_cond_or_without_elseif.php.inc +++ b/tests/Issues/IssueReturnBeforeElseIf/Fixture/complex_if_cond_or_without_elseif.php.inc @@ -28,10 +28,7 @@ class ComplexIfCondOrWithoutElseIf { public function run($a, $b, $c) { - if ($a && false === $b) { - return 'a'; - } - if (! $c) { + if (($a && false === $b) || ! $c) { return 'a'; } return 'b';