From 2fdd9403ec194b35a6c12caa7dda67858e554194 Mon Sep 17 00:00:00 2001 From: Tomas Votruba Date: Wed, 29 Jun 2022 16:21:49 +0200 Subject: [PATCH] [CodeQuality] Add TernaryFalseExpressionToIfRector --- config/set/code-quality.php | 2 + .../include_no_side_effect_expr.php.inc | 29 +++++++ .../Fixture/negated_value.php.inc | 29 +++++++ .../Fixture/skip_null_ternary.php.inc | 11 +++ .../Fixture/some_class.php.inc | 29 +++++++ .../TernaryFalseExpressionToIfRectorTest.php | 33 +++++++ .../config/configured_rule.php | 10 +++ .../TernaryFalseExpressionToIfRector.php | 87 +++++++++++++++++++ 8 files changed, 230 insertions(+) create mode 100644 rules-tests/CodeQuality/Rector/Expression/TernaryFalseExpressionToIfRector/Fixture/include_no_side_effect_expr.php.inc create mode 100644 rules-tests/CodeQuality/Rector/Expression/TernaryFalseExpressionToIfRector/Fixture/negated_value.php.inc create mode 100644 rules-tests/CodeQuality/Rector/Expression/TernaryFalseExpressionToIfRector/Fixture/skip_null_ternary.php.inc create mode 100644 rules-tests/CodeQuality/Rector/Expression/TernaryFalseExpressionToIfRector/Fixture/some_class.php.inc create mode 100644 rules-tests/CodeQuality/Rector/Expression/TernaryFalseExpressionToIfRector/TernaryFalseExpressionToIfRectorTest.php create mode 100644 rules-tests/CodeQuality/Rector/Expression/TernaryFalseExpressionToIfRector/config/configured_rule.php create mode 100644 rules/CodeQuality/Rector/Expression/TernaryFalseExpressionToIfRector.php diff --git a/config/set/code-quality.php b/config/set/code-quality.php index f0e04b6fa3c..9b127fc189c 100644 --- a/config/set/code-quality.php +++ b/config/set/code-quality.php @@ -17,6 +17,7 @@ use Rector\CodeQuality\Rector\Do_\DoWhileBreakFalseToIfElseRector; use Rector\CodeQuality\Rector\Equal\UseIdenticalOverEqualWithSameTypeRector; use Rector\CodeQuality\Rector\Expression\InlineIfToExplicitIfRector; +use Rector\CodeQuality\Rector\Expression\TernaryFalseExpressionToIfRector; use Rector\CodeQuality\Rector\For_\ForRepeatedCountToOwnVariableRector; use Rector\CodeQuality\Rector\For_\ForToForeachRector; use Rector\CodeQuality\Rector\Foreach_\ForeachItemsAssignToEmptyArrayToAssignRector; @@ -182,5 +183,6 @@ DoWhileBreakFalseToIfElseRector::class, InlineArrayReturnAssignRector::class, InlineIsAInstanceOfRector::class, + TernaryFalseExpressionToIfRector::class, ]); }; diff --git a/rules-tests/CodeQuality/Rector/Expression/TernaryFalseExpressionToIfRector/Fixture/include_no_side_effect_expr.php.inc b/rules-tests/CodeQuality/Rector/Expression/TernaryFalseExpressionToIfRector/Fixture/include_no_side_effect_expr.php.inc new file mode 100644 index 00000000000..e6cd2d8ef42 --- /dev/null +++ b/rules-tests/CodeQuality/Rector/Expression/TernaryFalseExpressionToIfRector/Fixture/include_no_side_effect_expr.php.inc @@ -0,0 +1,29 @@ +call($value) : true; + } +} + +?> +----- +call($value); + } + } +} + +?> diff --git a/rules-tests/CodeQuality/Rector/Expression/TernaryFalseExpressionToIfRector/Fixture/negated_value.php.inc b/rules-tests/CodeQuality/Rector/Expression/TernaryFalseExpressionToIfRector/Fixture/negated_value.php.inc new file mode 100644 index 00000000000..aebb2154725 --- /dev/null +++ b/rules-tests/CodeQuality/Rector/Expression/TernaryFalseExpressionToIfRector/Fixture/negated_value.php.inc @@ -0,0 +1,29 @@ + +----- + diff --git a/rules-tests/CodeQuality/Rector/Expression/TernaryFalseExpressionToIfRector/Fixture/skip_null_ternary.php.inc b/rules-tests/CodeQuality/Rector/Expression/TernaryFalseExpressionToIfRector/Fixture/skip_null_ternary.php.inc new file mode 100644 index 00000000000..e4838167739 --- /dev/null +++ b/rules-tests/CodeQuality/Rector/Expression/TernaryFalseExpressionToIfRector/Fixture/skip_null_ternary.php.inc @@ -0,0 +1,11 @@ +call($value); + } +} diff --git a/rules-tests/CodeQuality/Rector/Expression/TernaryFalseExpressionToIfRector/Fixture/some_class.php.inc b/rules-tests/CodeQuality/Rector/Expression/TernaryFalseExpressionToIfRector/Fixture/some_class.php.inc new file mode 100644 index 00000000000..0aa00170ea4 --- /dev/null +++ b/rules-tests/CodeQuality/Rector/Expression/TernaryFalseExpressionToIfRector/Fixture/some_class.php.inc @@ -0,0 +1,29 @@ +call($value) : false; + } +} + +?> +----- +call($value); + } + } +} + +?> diff --git a/rules-tests/CodeQuality/Rector/Expression/TernaryFalseExpressionToIfRector/TernaryFalseExpressionToIfRectorTest.php b/rules-tests/CodeQuality/Rector/Expression/TernaryFalseExpressionToIfRector/TernaryFalseExpressionToIfRectorTest.php new file mode 100644 index 00000000000..c90e3ceefff --- /dev/null +++ b/rules-tests/CodeQuality/Rector/Expression/TernaryFalseExpressionToIfRector/TernaryFalseExpressionToIfRectorTest.php @@ -0,0 +1,33 @@ +doTestFileInfo($fileInfo); + } + + /** + * @return Iterator + */ + public function provideData(): Iterator + { + return $this->yieldFilesFromDirectory(__DIR__ . '/Fixture'); + } + + public function provideConfigFilePath(): string + { + return __DIR__ . '/config/configured_rule.php'; + } +} diff --git a/rules-tests/CodeQuality/Rector/Expression/TernaryFalseExpressionToIfRector/config/configured_rule.php b/rules-tests/CodeQuality/Rector/Expression/TernaryFalseExpressionToIfRector/config/configured_rule.php new file mode 100644 index 00000000000..1c4baa4bf4d --- /dev/null +++ b/rules-tests/CodeQuality/Rector/Expression/TernaryFalseExpressionToIfRector/config/configured_rule.php @@ -0,0 +1,10 @@ +rule(TernaryFalseExpressionToIfRector::class); +}; diff --git a/rules/CodeQuality/Rector/Expression/TernaryFalseExpressionToIfRector.php b/rules/CodeQuality/Rector/Expression/TernaryFalseExpressionToIfRector.php new file mode 100644 index 00000000000..10643a36485 --- /dev/null +++ b/rules/CodeQuality/Rector/Expression/TernaryFalseExpressionToIfRector.php @@ -0,0 +1,87 @@ +call($value) : false; + } +} +CODE_SAMPLE + + , + <<<'CODE_SAMPLE' +final class SomeClass +{ + public function run($value, $someMethod) + { + if ($value) { + $someMethod->call($value); + } + } +} +CODE_SAMPLE + ), + ]); + } + + /** + * @return array> + */ + public function getNodeTypes(): array + { + return [Expression::class]; + } + + /** + * @param Expression $node + */ + public function refactor(Node $node): ?Node + { + if (! $node->expr instanceof Ternary) { + return null; + } + + $ternary = $node->expr; + if (! $ternary->if instanceof Expr) { + return null; + } + + if ($this->sideEffectNodeDetector->detect($ternary->else)) { + return null; + } + + return new If_($ternary->cond, [ + 'stmts' => [new Expression($ternary->if)], + ]); + } +}