From f25f303dc83cf60977cd737ab0c4eac4d3bf05ba Mon Sep 17 00:00:00 2001 From: Tomas Votruba Date: Sun, 6 Oct 2019 01:54:34 +0200 Subject: [PATCH] [DeadCode] Add SimplifyIfElseWithSameContentRector --- config/set/dead-code/dead-code.yaml | 1 + .../SimplifyIfElseWithSameContentRector.php | 93 +++++++++++++++++++ .../Fixture/fixture.php.inc | 31 +++++++ .../Fixture/skip_different_content.php.inc | 15 +++ .../Fixture/skip_else_with_no_return.php.inc | 15 +++ .../Fixture/skip_missing_else.php.inc | 15 +++ .../Fixture/skip_more_than_return.php.inc | 16 ++++ .../Fixture/with_else_ifs.php.inc | 51 ++++++++++ ...implifyIfElseWithSameContentRectorTest.php | 33 +++++++ .../Node/Commander/NodeAddingCommander.php | 6 ++ 10 files changed, 276 insertions(+) create mode 100644 packages/DeadCode/src/Rector/If_/SimplifyIfElseWithSameContentRector.php create mode 100644 packages/DeadCode/tests/Rector/If_/SimplifyIfElseWithSameContentRector/Fixture/fixture.php.inc create mode 100644 packages/DeadCode/tests/Rector/If_/SimplifyIfElseWithSameContentRector/Fixture/skip_different_content.php.inc create mode 100644 packages/DeadCode/tests/Rector/If_/SimplifyIfElseWithSameContentRector/Fixture/skip_else_with_no_return.php.inc create mode 100644 packages/DeadCode/tests/Rector/If_/SimplifyIfElseWithSameContentRector/Fixture/skip_missing_else.php.inc create mode 100644 packages/DeadCode/tests/Rector/If_/SimplifyIfElseWithSameContentRector/Fixture/skip_more_than_return.php.inc create mode 100644 packages/DeadCode/tests/Rector/If_/SimplifyIfElseWithSameContentRector/Fixture/with_else_ifs.php.inc create mode 100644 packages/DeadCode/tests/Rector/If_/SimplifyIfElseWithSameContentRector/SimplifyIfElseWithSameContentRectorTest.php diff --git a/config/set/dead-code/dead-code.yaml b/config/set/dead-code/dead-code.yaml index b941b81ff6fc..c6e48e70b2ea 100644 --- a/config/set/dead-code/dead-code.yaml +++ b/config/set/dead-code/dead-code.yaml @@ -29,3 +29,4 @@ services: Rector\DeadCode\Rector\Property\RemoveNullPropertyInitializationRector: ~ Rector\DeadCode\Rector\Stmt\RemoveUnreachableStatementRector: ~ + Rector\DeadCode\Rector\If_\SimplifyIfElseWithSameContentRector: ~ diff --git a/packages/DeadCode/src/Rector/If_/SimplifyIfElseWithSameContentRector.php b/packages/DeadCode/src/Rector/If_/SimplifyIfElseWithSameContentRector.php new file mode 100644 index 000000000000..ca31352e3d2d --- /dev/null +++ b/packages/DeadCode/src/Rector/If_/SimplifyIfElseWithSameContentRector.php @@ -0,0 +1,93 @@ +else === null) { + return null; + } + + if (! $this->isIfWithConstantReturns($node)) { + return null; + } + + foreach ($node->stmts as $stmt) { + $this->addNodeBeforeNode($stmt, $node); + } + + $this->removeNode($node); + + return $node; + } + + private function isIfWithConstantReturns(If_ $if): bool + { + $possibleContents = []; + $possibleContents[] = $this->print($if->stmts); + + foreach ($if->elseifs as $elseif) { + $possibleContents[] = $this->print($elseif->stmts); + } + + $possibleContents[] = $this->print($if->else->stmts); + + $uniqueContents = array_unique($possibleContents); + + // only one content for all + return count($uniqueContents) === 1; + } +} diff --git a/packages/DeadCode/tests/Rector/If_/SimplifyIfElseWithSameContentRector/Fixture/fixture.php.inc b/packages/DeadCode/tests/Rector/If_/SimplifyIfElseWithSameContentRector/Fixture/fixture.php.inc new file mode 100644 index 000000000000..ccbd2ae03280 --- /dev/null +++ b/packages/DeadCode/tests/Rector/If_/SimplifyIfElseWithSameContentRector/Fixture/fixture.php.inc @@ -0,0 +1,31 @@ + +----- + diff --git a/packages/DeadCode/tests/Rector/If_/SimplifyIfElseWithSameContentRector/Fixture/skip_different_content.php.inc b/packages/DeadCode/tests/Rector/If_/SimplifyIfElseWithSameContentRector/Fixture/skip_different_content.php.inc new file mode 100644 index 000000000000..6fbdfe25405d --- /dev/null +++ b/packages/DeadCode/tests/Rector/If_/SimplifyIfElseWithSameContentRector/Fixture/skip_different_content.php.inc @@ -0,0 +1,15 @@ + +----- + diff --git a/packages/DeadCode/tests/Rector/If_/SimplifyIfElseWithSameContentRector/SimplifyIfElseWithSameContentRectorTest.php b/packages/DeadCode/tests/Rector/If_/SimplifyIfElseWithSameContentRector/SimplifyIfElseWithSameContentRectorTest.php new file mode 100644 index 000000000000..3b0c559765bf --- /dev/null +++ b/packages/DeadCode/tests/Rector/If_/SimplifyIfElseWithSameContentRector/SimplifyIfElseWithSameContentRectorTest.php @@ -0,0 +1,33 @@ +doTestFile($file); + } + + public function provideDataForTest(): Iterator + { + yield [__DIR__ . '/Fixture/fixture.php.inc']; + yield [__DIR__ . '/Fixture/with_else_ifs.php.inc']; + yield [__DIR__ . '/Fixture/skip_different_content.php.inc']; + yield [__DIR__ . '/Fixture/skip_missing_else.php.inc']; + yield [__DIR__ . '/Fixture/skip_else_with_no_return.php.inc']; + yield [__DIR__ . '/Fixture/skip_more_than_return.php.inc']; + } + + protected function getRectorClass(): string + { + return SimplifyIfElseWithSameContentRector::class; + } +} diff --git a/src/PhpParser/Node/Commander/NodeAddingCommander.php b/src/PhpParser/Node/Commander/NodeAddingCommander.php index 3fd6ec9cae3d..5ff03df6f183 100644 --- a/src/PhpParser/Node/Commander/NodeAddingCommander.php +++ b/src/PhpParser/Node/Commander/NodeAddingCommander.php @@ -88,6 +88,12 @@ private function resolveNearestExpressionPosition(Node $node): string return spl_object_hash($node); } + // special case for "If_" + $parentNode = $node->getAttribute(AttributeKey::CURRENT_EXPRESSION); + if ($parentNode === null) { + return spl_object_hash($node); + } + /** @var Expression|null $foundNode */ $foundNode = $this->betterNodeFinder->findFirstAncestorInstanceOf($node, Expression::class); if ($foundNode === null) {