From d4977511748179d1a3da17a1c8d1469e993456f9 Mon Sep 17 00:00:00 2001 From: Jorg Sowa Date: Fri, 20 Dec 2024 00:02:26 +0100 Subject: [PATCH] [DowngradePhp84] Downgrade RoundingMode enum --- .../DowngradeRoundingModeEnumRectorTest.php | 28 +++++++ .../Fixture/fixture.php.inc | 37 ++++++++ .../skip_indirect_use_of_roundin_mode.php.inc | 10 +++ .../config/configured_rule.php | 10 +++ .../DowngradeRoundingModeEnumRector.php | 84 +++++++++++++++++++ 5 files changed, 169 insertions(+) create mode 100644 rules-tests/DowngradePhp84/Rector/FuncCall/DowngradeRoundingModeEnumRector/DowngradeRoundingModeEnumRectorTest.php create mode 100644 rules-tests/DowngradePhp84/Rector/FuncCall/DowngradeRoundingModeEnumRector/Fixture/fixture.php.inc create mode 100644 rules-tests/DowngradePhp84/Rector/FuncCall/DowngradeRoundingModeEnumRector/Fixture/skip_indirect_use_of_roundin_mode.php.inc create mode 100644 rules-tests/DowngradePhp84/Rector/FuncCall/DowngradeRoundingModeEnumRector/config/configured_rule.php create mode 100644 rules/DowngradePhp84/Rector/FuncCall/DowngradeRoundingModeEnumRector.php diff --git a/rules-tests/DowngradePhp84/Rector/FuncCall/DowngradeRoundingModeEnumRector/DowngradeRoundingModeEnumRectorTest.php b/rules-tests/DowngradePhp84/Rector/FuncCall/DowngradeRoundingModeEnumRector/DowngradeRoundingModeEnumRectorTest.php new file mode 100644 index 00000000..312fbddf --- /dev/null +++ b/rules-tests/DowngradePhp84/Rector/FuncCall/DowngradeRoundingModeEnumRector/DowngradeRoundingModeEnumRectorTest.php @@ -0,0 +1,28 @@ +doTestFile($filePath); + } + + public static function provideData(): Iterator + { + return self::yieldFilesFromDirectory(__DIR__ . '/Fixture'); + } + + public function provideConfigFilePath(): string + { + return __DIR__ . '/config/configured_rule.php'; + } +} diff --git a/rules-tests/DowngradePhp84/Rector/FuncCall/DowngradeRoundingModeEnumRector/Fixture/fixture.php.inc b/rules-tests/DowngradePhp84/Rector/FuncCall/DowngradeRoundingModeEnumRector/Fixture/fixture.php.inc new file mode 100644 index 00000000..ad57e63e --- /dev/null +++ b/rules-tests/DowngradePhp84/Rector/FuncCall/DowngradeRoundingModeEnumRector/Fixture/fixture.php.inc @@ -0,0 +1,37 @@ + +----- + diff --git a/rules-tests/DowngradePhp84/Rector/FuncCall/DowngradeRoundingModeEnumRector/Fixture/skip_indirect_use_of_roundin_mode.php.inc b/rules-tests/DowngradePhp84/Rector/FuncCall/DowngradeRoundingModeEnumRector/Fixture/skip_indirect_use_of_roundin_mode.php.inc new file mode 100644 index 00000000..3d095cef --- /dev/null +++ b/rules-tests/DowngradePhp84/Rector/FuncCall/DowngradeRoundingModeEnumRector/Fixture/skip_indirect_use_of_roundin_mode.php.inc @@ -0,0 +1,10 @@ + diff --git a/rules-tests/DowngradePhp84/Rector/FuncCall/DowngradeRoundingModeEnumRector/config/configured_rule.php b/rules-tests/DowngradePhp84/Rector/FuncCall/DowngradeRoundingModeEnumRector/config/configured_rule.php new file mode 100644 index 00000000..27680d6a --- /dev/null +++ b/rules-tests/DowngradePhp84/Rector/FuncCall/DowngradeRoundingModeEnumRector/config/configured_rule.php @@ -0,0 +1,10 @@ +rule(DowngradeRoundingModeEnumRector::class); +}; diff --git a/rules/DowngradePhp84/Rector/FuncCall/DowngradeRoundingModeEnumRector.php b/rules/DowngradePhp84/Rector/FuncCall/DowngradeRoundingModeEnumRector.php new file mode 100644 index 00000000..f6572232 --- /dev/null +++ b/rules/DowngradePhp84/Rector/FuncCall/DowngradeRoundingModeEnumRector.php @@ -0,0 +1,84 @@ +isName($node, 'round')) { + return null; + } + + if ($node->isFirstClassCallable()) { + return null; + } + + $args = $node->getArgs(); + + if (count($args) !== 3) { + return null; + } + + $modeArg = $args[2]->value; + if ($modeArg instanceof ClassConstFetch) { + if ($modeArg->class->name === 'RoundingMode') { + $constantName = match ($modeArg->name->name) { + 'HalfAwayFromZero' => 'PHP_ROUND_HALF_UP', + 'HalfTowardsZero' => 'PHP_ROUND_HALF_DOWN', + 'HalfEven' => 'PHP_ROUND_HALF_EVEN', + 'HalfOdd' => 'PHP_ROUND_HALF_ODD', + default => null, + }; + + if ($constantName === null) { + return null; + } + + $args[2]->value = new Node\Expr\ConstFetch(new Node\Name($constantName)); + } + } + + return $node; + } +}