From 7f99a934d49c0a314fe023d9f6bcaf7a2a2a618b Mon Sep 17 00:00:00 2001 From: TomasVotruba Date: Sat, 4 Jan 2020 13:51:09 +0100 Subject: [PATCH] [CodeQuality] Add ForRepeatedCountToOwnVariableRector --- config/set/code-quality/code-quality.yaml | 1 + .../ForRepeatedCountToOwnVariableRector.php | 106 ++++++++++++++++++ .../Fixture/fallback_for_complex.php.inc | 32 ++++++ .../Fixture/fixture.php.inc | 32 ++++++ .../Fixture/method_call_count.php.inc | 32 ++++++ ...orRepeatedCountToOwnVariableRectorTest.php | 30 +++++ 6 files changed, 233 insertions(+) create mode 100644 packages/CodeQuality/src/Rector/For_/ForRepeatedCountToOwnVariableRector.php create mode 100644 packages/CodeQuality/tests/Rector/For_/ForRepeatedCountToOwnVariableRector/Fixture/fallback_for_complex.php.inc create mode 100644 packages/CodeQuality/tests/Rector/For_/ForRepeatedCountToOwnVariableRector/Fixture/fixture.php.inc create mode 100644 packages/CodeQuality/tests/Rector/For_/ForRepeatedCountToOwnVariableRector/Fixture/method_call_count.php.inc create mode 100644 packages/CodeQuality/tests/Rector/For_/ForRepeatedCountToOwnVariableRector/ForRepeatedCountToOwnVariableRectorTest.php diff --git a/config/set/code-quality/code-quality.yaml b/config/set/code-quality/code-quality.yaml index da1adfff7f59..9822d9f205cf 100644 --- a/config/set/code-quality/code-quality.yaml +++ b/config/set/code-quality/code-quality.yaml @@ -49,3 +49,4 @@ services: Rector\CodeQuality\Rector\Ternary\ArrayKeyExistsTernaryThenValueToCoalescingRector: ~ Rector\CodeQuality\Rector\Include_\AbsolutizeRequireAndIncludePathRector: ~ Rector\CodeQuality\Rector\FuncCall\ChangeArrayPushToArrayAssignRector: ~ + Rector\CodeQuality\Rector\For_\ForRepeatedCountToOwnVariableRector: ~ diff --git a/packages/CodeQuality/src/Rector/For_/ForRepeatedCountToOwnVariableRector.php b/packages/CodeQuality/src/Rector/For_/ForRepeatedCountToOwnVariableRector.php new file mode 100644 index 000000000000..edae1a1b9c17 --- /dev/null +++ b/packages/CodeQuality/src/Rector/For_/ForRepeatedCountToOwnVariableRector.php @@ -0,0 +1,106 @@ +traverseNodesWithCallable($node->cond, function (Node $node) use (&$countInCond, &$countedValueName) { + if (! $node instanceof FuncCall) { + return null; + } + + if (! $this->isName($node, 'count')) { + return null; + } + + $countInCond = $node; + $valueName = $this->getName($node->args[0]->value); + + if ($valueName === null) { + $countedValueName = self::DEFAULT_VARIABLE_COUNT_NAME; + } else { + $countedValueName = $valueName . 'Count'; + } + + return new Variable($countedValueName); + }); + + if ($countInCond === null || $countedValueName === null) { + return null; + } + + $countAssign = new Assign(new Variable($countedValueName), $countInCond); + + $this->addNodeBeforeNode($countAssign, $node); + + return $node; + } +} diff --git a/packages/CodeQuality/tests/Rector/For_/ForRepeatedCountToOwnVariableRector/Fixture/fallback_for_complex.php.inc b/packages/CodeQuality/tests/Rector/For_/ForRepeatedCountToOwnVariableRector/Fixture/fallback_for_complex.php.inc new file mode 100644 index 000000000000..962f5d5485ba --- /dev/null +++ b/packages/CodeQuality/tests/Rector/For_/ForRepeatedCountToOwnVariableRector/Fixture/fallback_for_complex.php.inc @@ -0,0 +1,32 @@ +getItems() + 10); $i++) { + echo $items[$i]; + } + } +} + +?> +----- +getItems() + 10); + for ($i = 5; $i <= $itemsCount; $i++) { + echo $items[$i]; + } + } +} + +?> diff --git a/packages/CodeQuality/tests/Rector/For_/ForRepeatedCountToOwnVariableRector/Fixture/fixture.php.inc b/packages/CodeQuality/tests/Rector/For_/ForRepeatedCountToOwnVariableRector/Fixture/fixture.php.inc new file mode 100644 index 000000000000..22cd3c4bb2ed --- /dev/null +++ b/packages/CodeQuality/tests/Rector/For_/ForRepeatedCountToOwnVariableRector/Fixture/fixture.php.inc @@ -0,0 +1,32 @@ + +----- + diff --git a/packages/CodeQuality/tests/Rector/For_/ForRepeatedCountToOwnVariableRector/Fixture/method_call_count.php.inc b/packages/CodeQuality/tests/Rector/For_/ForRepeatedCountToOwnVariableRector/Fixture/method_call_count.php.inc new file mode 100644 index 000000000000..ec4383b78115 --- /dev/null +++ b/packages/CodeQuality/tests/Rector/For_/ForRepeatedCountToOwnVariableRector/Fixture/method_call_count.php.inc @@ -0,0 +1,32 @@ +getItems()); $i++) { + echo $items[$i]; + } + } +} + +?> +----- +getItems()); + for ($i = 5; $i <= $getItemsCount; $i++) { + echo $items[$i]; + } + } +} + +?> diff --git a/packages/CodeQuality/tests/Rector/For_/ForRepeatedCountToOwnVariableRector/ForRepeatedCountToOwnVariableRectorTest.php b/packages/CodeQuality/tests/Rector/For_/ForRepeatedCountToOwnVariableRector/ForRepeatedCountToOwnVariableRectorTest.php new file mode 100644 index 000000000000..1a148e61a03c --- /dev/null +++ b/packages/CodeQuality/tests/Rector/For_/ForRepeatedCountToOwnVariableRector/ForRepeatedCountToOwnVariableRectorTest.php @@ -0,0 +1,30 @@ +doTestFile($file); + } + + public function provideDataForTest(): Iterator + { + return $this->yieldFilesFromDirectory(__DIR__ . '/Fixture'); + } + + protected function getRectorClass(): string + { + return ForRepeatedCountToOwnVariableRector::class; + } +}