From 11bff182c15940c9eb4ac16d3ef50607d42f3071 Mon Sep 17 00:00:00 2001 From: Caleb White Date: Sat, 28 Mar 2026 17:09:42 -0500 Subject: [PATCH] feat(php86): add DowngradeClampRector --- config/set/downgrade-php86.php | 12 ++++ config/set/level/down-to-php84.php | 3 +- config/set/level/down-to-php85.php | 10 +++ .../DowngradeClampRectorTest.php | 28 ++++++++ .../Fixture/fixture.php.inc | 19 +++++ .../Fixture/skip_first_class_callable.php.inc | 7 ++ .../Fixture/with_named_args.php.inc | 19 +++++ .../config/configured_rule.php | 10 +++ .../Rector/FuncCall/DowngradeClampRector.php | 69 +++++++++++++++++++ src/Set/ValueObject/DowngradeLevelSetList.php | 2 + src/Set/ValueObject/DowngradeSetList.php | 2 + 11 files changed, 180 insertions(+), 1 deletion(-) create mode 100644 config/set/downgrade-php86.php create mode 100644 config/set/level/down-to-php85.php create mode 100644 rules-tests/DowngradePhp86/Rector/FuncCall/DowngradeClampRector/DowngradeClampRectorTest.php create mode 100644 rules-tests/DowngradePhp86/Rector/FuncCall/DowngradeClampRector/Fixture/fixture.php.inc create mode 100644 rules-tests/DowngradePhp86/Rector/FuncCall/DowngradeClampRector/Fixture/skip_first_class_callable.php.inc create mode 100644 rules-tests/DowngradePhp86/Rector/FuncCall/DowngradeClampRector/Fixture/with_named_args.php.inc create mode 100644 rules-tests/DowngradePhp86/Rector/FuncCall/DowngradeClampRector/config/configured_rule.php create mode 100644 rules/DowngradePhp86/Rector/FuncCall/DowngradeClampRector.php diff --git a/config/set/downgrade-php86.php b/config/set/downgrade-php86.php new file mode 100644 index 00000000..3223083e --- /dev/null +++ b/config/set/downgrade-php86.php @@ -0,0 +1,12 @@ +phpVersion(PhpVersion::PHP_85); + $rectorConfig->rule(DowngradeClampRector::class); +}; diff --git a/config/set/level/down-to-php84.php b/config/set/level/down-to-php84.php index f8ffa0ca..ec9e8738 100644 --- a/config/set/level/down-to-php84.php +++ b/config/set/level/down-to-php84.php @@ -3,8 +3,9 @@ declare(strict_types=1); use Rector\Config\RectorConfig; +use Rector\Set\ValueObject\DowngradeLevelSetList; use Rector\Set\ValueObject\DowngradeSetList; return static function (RectorConfig $rectorConfig): void { - $rectorConfig->sets([DowngradeSetList::PHP_85]); + $rectorConfig->sets([DowngradeLevelSetList::DOWN_TO_PHP_85, DowngradeSetList::PHP_85]); }; diff --git a/config/set/level/down-to-php85.php b/config/set/level/down-to-php85.php new file mode 100644 index 00000000..58f92be0 --- /dev/null +++ b/config/set/level/down-to-php85.php @@ -0,0 +1,10 @@ +sets([DowngradeSetList::PHP_86]); +}; diff --git a/rules-tests/DowngradePhp86/Rector/FuncCall/DowngradeClampRector/DowngradeClampRectorTest.php b/rules-tests/DowngradePhp86/Rector/FuncCall/DowngradeClampRector/DowngradeClampRectorTest.php new file mode 100644 index 00000000..2286945d --- /dev/null +++ b/rules-tests/DowngradePhp86/Rector/FuncCall/DowngradeClampRector/DowngradeClampRectorTest.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/DowngradePhp86/Rector/FuncCall/DowngradeClampRector/Fixture/fixture.php.inc b/rules-tests/DowngradePhp86/Rector/FuncCall/DowngradeClampRector/Fixture/fixture.php.inc new file mode 100644 index 00000000..7c993250 --- /dev/null +++ b/rules-tests/DowngradePhp86/Rector/FuncCall/DowngradeClampRector/Fixture/fixture.php.inc @@ -0,0 +1,19 @@ + +----- + diff --git a/rules-tests/DowngradePhp86/Rector/FuncCall/DowngradeClampRector/Fixture/skip_first_class_callable.php.inc b/rules-tests/DowngradePhp86/Rector/FuncCall/DowngradeClampRector/Fixture/skip_first_class_callable.php.inc new file mode 100644 index 00000000..303405d5 --- /dev/null +++ b/rules-tests/DowngradePhp86/Rector/FuncCall/DowngradeClampRector/Fixture/skip_first_class_callable.php.inc @@ -0,0 +1,7 @@ + +----- + diff --git a/rules-tests/DowngradePhp86/Rector/FuncCall/DowngradeClampRector/config/configured_rule.php b/rules-tests/DowngradePhp86/Rector/FuncCall/DowngradeClampRector/config/configured_rule.php new file mode 100644 index 00000000..ccf7e346 --- /dev/null +++ b/rules-tests/DowngradePhp86/Rector/FuncCall/DowngradeClampRector/config/configured_rule.php @@ -0,0 +1,10 @@ +rule(DowngradeClampRector::class); +}; diff --git a/rules/DowngradePhp86/Rector/FuncCall/DowngradeClampRector.php b/rules/DowngradePhp86/Rector/FuncCall/DowngradeClampRector.php new file mode 100644 index 00000000..ce35baac --- /dev/null +++ b/rules/DowngradePhp86/Rector/FuncCall/DowngradeClampRector.php @@ -0,0 +1,69 @@ +isName($node, 'clamp')) { + return null; + } + + if ($node->isFirstClassCallable()) { + return null; + } + + $valueArg = $node->getArg('value', 0); + $minArg = $node->getArg('min', 1); + $maxArg = $node->getArg('max', 2); + + if (! $valueArg instanceof Arg || ! $minArg instanceof Arg || ! $maxArg instanceof Arg) { + return null; + } + + return $this->nodeFactory->createFuncCall('max', [ + $minArg->value, + $this->nodeFactory->createFuncCall('min', [$maxArg->value, $valueArg->value]), + ]); + } +} diff --git a/src/Set/ValueObject/DowngradeLevelSetList.php b/src/Set/ValueObject/DowngradeLevelSetList.php index 8265dd83..fa721ce1 100644 --- a/src/Set/ValueObject/DowngradeLevelSetList.php +++ b/src/Set/ValueObject/DowngradeLevelSetList.php @@ -10,6 +10,8 @@ */ final class DowngradeLevelSetList { + public const string DOWN_TO_PHP_85 = __DIR__ . '/../../../config/set/level/down-to-php85.php'; + public const string DOWN_TO_PHP_84 = __DIR__ . '/../../../config/set/level/down-to-php84.php'; public const string DOWN_TO_PHP_83 = __DIR__ . '/../../../config/set/level/down-to-php83.php'; diff --git a/src/Set/ValueObject/DowngradeSetList.php b/src/Set/ValueObject/DowngradeSetList.php index ded54bb5..b24ce78c 100644 --- a/src/Set/ValueObject/DowngradeSetList.php +++ b/src/Set/ValueObject/DowngradeSetList.php @@ -27,4 +27,6 @@ final class DowngradeSetList public const string PHP_84 = __DIR__ . '/../../../config/set/downgrade-php84.php'; public const string PHP_85 = __DIR__ . '/../../../config/set/downgrade-php85.php'; + + public const string PHP_86 = __DIR__ . '/../../../config/set/downgrade-php86.php'; }