From e856fb8ddb76f6e79b994d3c797f19be3e2513d3 Mon Sep 17 00:00:00 2001 From: Jeroen Smit Date: Wed, 15 Jan 2020 20:41:42 +0100 Subject: [PATCH 1/4] Added CombineIfRector --- config/set/code-quality/code-quality.yaml | 3 +- .../src/Rector/If_/CombineIfRector.php | 102 ++++++++++++++++++ .../CombineIfRector/CombineIfRectorTest.php | 30 ++++++ .../Fixture/child_else.php.inc | 16 +++ .../Fixture/child_elseif.php.inc | 16 +++ .../CombineIfRector/Fixture/fixture.php.inc | 31 ++++++ .../Fixture/more_statements.php.inc | 17 +++ .../Fixture/parent_else.php.inc | 16 +++ .../Fixture/parent_elseif.php.inc | 16 +++ 9 files changed, 246 insertions(+), 1 deletion(-) create mode 100644 packages/CodeQuality/src/Rector/If_/CombineIfRector.php create mode 100644 packages/CodeQuality/tests/Rector/If_/CombineIfRector/CombineIfRectorTest.php create mode 100644 packages/CodeQuality/tests/Rector/If_/CombineIfRector/Fixture/child_else.php.inc create mode 100644 packages/CodeQuality/tests/Rector/If_/CombineIfRector/Fixture/child_elseif.php.inc create mode 100644 packages/CodeQuality/tests/Rector/If_/CombineIfRector/Fixture/fixture.php.inc create mode 100644 packages/CodeQuality/tests/Rector/If_/CombineIfRector/Fixture/more_statements.php.inc create mode 100644 packages/CodeQuality/tests/Rector/If_/CombineIfRector/Fixture/parent_else.php.inc create mode 100644 packages/CodeQuality/tests/Rector/If_/CombineIfRector/Fixture/parent_elseif.php.inc diff --git a/config/set/code-quality/code-quality.yaml b/config/set/code-quality/code-quality.yaml index 6965e49270a3..b1bea00415e6 100644 --- a/config/set/code-quality/code-quality.yaml +++ b/config/set/code-quality/code-quality.yaml @@ -1,4 +1,4 @@ -services: + services: Rector\CodeQuality\Rector\Assign\CombinedAssignRector: null Rector\CodeQuality\Rector\BooleanAnd\SimplifyEmptyArrayCheckRector: null Rector\CodeQuality\Rector\Foreach_\ForeachToInArrayRector: null @@ -25,6 +25,7 @@ services: Rector\CodeQuality\Rector\If_\ConsecutiveNullCompareReturnsToNullCoalesceQueueRector: null Rector\CodeQuality\Rector\If_\SimplifyIfIssetToNullCoalescingRector: null Rector\CodeQuality\Rector\If_\ExplicitBoolCompareRector: null + Rector\CodeQuality\Rector\If_\CombineIfRector: null Rector\CodeQuality\Rector\Equal\UseIdenticalOverEqualWithSameTypeRector: null Rector\CodeQuality\Rector\Ternary\SimplifyDuplicatedTernaryRector: null Rector\CodeQuality\Rector\Identical\SimplifyBoolIdenticalTrueRector: null diff --git a/packages/CodeQuality/src/Rector/If_/CombineIfRector.php b/packages/CodeQuality/src/Rector/If_/CombineIfRector.php new file mode 100644 index 000000000000..2e03c39fe16c --- /dev/null +++ b/packages/CodeQuality/src/Rector/If_/CombineIfRector.php @@ -0,0 +1,102 @@ +shouldSkip($node)) { + return null; + } + + /** @var Node\Stmt\If_ $subIf */ + $subIf = $node->stmts[0]; + $node->cond = new BooleanAnd($node->cond, $subIf->cond); + $node->stmts = $subIf->stmts; + return $node; + } + + private function shouldSkip(If_ $node): bool + { + if ($node->else !== null) { + return true; + } + + if (count($node->stmts) !== 1) { + return true; + } + + if ($node->elseifs) { + return true; + } + + if (! $node->stmts[0] instanceof If_) { + return true; + } + + if ($node->stmts[0]->else !== null) { + return true; + } + + if ($node->stmts[0]->elseifs) { + return true; + } + return false; + } +} diff --git a/packages/CodeQuality/tests/Rector/If_/CombineIfRector/CombineIfRectorTest.php b/packages/CodeQuality/tests/Rector/If_/CombineIfRector/CombineIfRectorTest.php new file mode 100644 index 000000000000..153c11dd5c0f --- /dev/null +++ b/packages/CodeQuality/tests/Rector/If_/CombineIfRector/CombineIfRectorTest.php @@ -0,0 +1,30 @@ +doTestFile($file); + } + + public function provideDataForTest(): Iterator + { + return $this->yieldFilesFromDirectory(__DIR__ . '/Fixture'); + } + + protected function getRectorClass(): string + { + return CombineIfRector::class; + } +} diff --git a/packages/CodeQuality/tests/Rector/If_/CombineIfRector/Fixture/child_else.php.inc b/packages/CodeQuality/tests/Rector/If_/CombineIfRector/Fixture/child_else.php.inc new file mode 100644 index 000000000000..a8bb998e3e13 --- /dev/null +++ b/packages/CodeQuality/tests/Rector/If_/CombineIfRector/Fixture/child_else.php.inc @@ -0,0 +1,16 @@ + +----- + diff --git a/packages/CodeQuality/tests/Rector/If_/CombineIfRector/Fixture/more_statements.php.inc b/packages/CodeQuality/tests/Rector/If_/CombineIfRector/Fixture/more_statements.php.inc new file mode 100644 index 000000000000..459a82d7101a --- /dev/null +++ b/packages/CodeQuality/tests/Rector/If_/CombineIfRector/Fixture/more_statements.php.inc @@ -0,0 +1,17 @@ + diff --git a/packages/CodeQuality/tests/Rector/If_/CombineIfRector/Fixture/parent_else.php.inc b/packages/CodeQuality/tests/Rector/If_/CombineIfRector/Fixture/parent_else.php.inc new file mode 100644 index 000000000000..7606bf6fe425 --- /dev/null +++ b/packages/CodeQuality/tests/Rector/If_/CombineIfRector/Fixture/parent_else.php.inc @@ -0,0 +1,16 @@ + Date: Wed, 15 Jan 2020 21:40:44 +0100 Subject: [PATCH 2/4] updated docs --- docs/AllRectorsOverview.md | 25 ++++++++++++++++++++++++- 1 file changed, 24 insertions(+), 1 deletion(-) diff --git a/docs/AllRectorsOverview.md b/docs/AllRectorsOverview.md index 294121d32659..2a8268a0b667 100644 --- a/docs/AllRectorsOverview.md +++ b/docs/AllRectorsOverview.md @@ -1,4 +1,4 @@ -# All 429 Rectors Overview +# All 430 Rectors Overview - [Projects](#projects) - [General](#general) @@ -514,6 +514,29 @@ Change array_push() to direct variable assign
+### `CombineIfRector` + +- class: `Rector\CodeQuality\Rector\If_\CombineIfRector` + +Merges nested if statements + +```diff + class SomeClass { + public function run() + { +- if ($cond1) { +- if ($cond2) { +- return 'foo'; +- } ++ if ($cond1 && $cond2) { ++ return 'foo'; + } + } + } +``` + +
+ ### `CombinedAssignRector` - class: `Rector\CodeQuality\Rector\Assign\CombinedAssignRector` From ad89be4c0f2bee104bfe4bbaa73ae25885fdb275 Mon Sep 17 00:00:00 2001 From: Jeroen Smit Date: Wed, 15 Jan 2020 21:43:13 +0100 Subject: [PATCH 3/4] Fixed indent --- config/set/code-quality/code-quality.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/config/set/code-quality/code-quality.yaml b/config/set/code-quality/code-quality.yaml index b1bea00415e6..6f5f45747b6b 100644 --- a/config/set/code-quality/code-quality.yaml +++ b/config/set/code-quality/code-quality.yaml @@ -1,4 +1,4 @@ - services: +services: Rector\CodeQuality\Rector\Assign\CombinedAssignRector: null Rector\CodeQuality\Rector\BooleanAnd\SimplifyEmptyArrayCheckRector: null Rector\CodeQuality\Rector\Foreach_\ForeachToInArrayRector: null From 5b06f4828fbe0c5b032eead6cfbeb910751fa72b Mon Sep 17 00:00:00 2001 From: Jeroen Smit Date: Wed, 15 Jan 2020 21:48:14 +0100 Subject: [PATCH 4/4] style --- packages/CodeQuality/src/Rector/If_/CombineIfRector.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/CodeQuality/src/Rector/If_/CombineIfRector.php b/packages/CodeQuality/src/Rector/If_/CombineIfRector.php index 2e03c39fe16c..2577d6b2b299 100644 --- a/packages/CodeQuality/src/Rector/If_/CombineIfRector.php +++ b/packages/CodeQuality/src/Rector/If_/CombineIfRector.php @@ -4,8 +4,8 @@ namespace Rector\CodeQuality\Rector\If_; -use PhpParser\Node\Expr\BinaryOp\BooleanAnd; use PhpParser\Node; +use PhpParser\Node\Expr\BinaryOp\BooleanAnd; use PhpParser\Node\Stmt\If_; use Rector\Rector\AbstractRector; use Rector\RectorDefinition\CodeSample;