From 380c2767b6c1a41f784027d2fb5e62dc02a09ad3 Mon Sep 17 00:00:00 2001 From: Abdul Malik Ikhsan Date: Wed, 27 Nov 2024 19:43:16 +0700 Subject: [PATCH] [DowngradePhp84] Add DowngradeNewMethodCallWithoutParenthesesRector --- config/set/downgrade-php84.php | 14 ++++ config/set/level/down-to-php82.php | 3 +- config/set/level/down-to-php83.php | 10 +++ ...MethodCallWithoutParenthesesRectorTest.php | 28 ++++++++ .../Fixture/fixture.php.inc | 31 +++++++++ .../Fixture/skip_already_parentheses.php.inc | 13 ++++ .../config/configured_rule.php | 10 +++ ...eNewMethodCallWithoutParenthesesRector.php | 65 +++++++++++++++++++ src/Set/ValueObject/DowngradeLevelSetList.php | 5 ++ src/Set/ValueObject/DowngradeSetList.php | 5 ++ 10 files changed, 183 insertions(+), 1 deletion(-) create mode 100644 config/set/downgrade-php84.php create mode 100644 config/set/level/down-to-php83.php create mode 100644 rules-tests/DowngradePhp84/Rector/MethodCall/DowngradeNewMethodCallWithoutParenthesesRector/DowngradeNewMethodCallWithoutParenthesesRectorTest.php create mode 100644 rules-tests/DowngradePhp84/Rector/MethodCall/DowngradeNewMethodCallWithoutParenthesesRector/Fixture/fixture.php.inc create mode 100644 rules-tests/DowngradePhp84/Rector/MethodCall/DowngradeNewMethodCallWithoutParenthesesRector/Fixture/skip_already_parentheses.php.inc create mode 100644 rules-tests/DowngradePhp84/Rector/MethodCall/DowngradeNewMethodCallWithoutParenthesesRector/config/configured_rule.php create mode 100644 rules/DowngradePhp84/Rector/MethodCall/DowngradeNewMethodCallWithoutParenthesesRector.php diff --git a/config/set/downgrade-php84.php b/config/set/downgrade-php84.php new file mode 100644 index 00000000..a5d80aad --- /dev/null +++ b/config/set/downgrade-php84.php @@ -0,0 +1,14 @@ +phpVersion(PhpVersion::PHP_83); + $rectorConfig->rules([ + DowngradeNewMethodCallWithoutParenthesesRector::class, + ]); +}; diff --git a/config/set/level/down-to-php82.php b/config/set/level/down-to-php82.php index a9f96761..b0013360 100644 --- a/config/set/level/down-to-php82.php +++ b/config/set/level/down-to-php82.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_83]); + $rectorConfig->sets([DowngradeLevelSetList::DOWN_TO_PHP_83, DowngradeSetList::PHP_83]); }; diff --git a/config/set/level/down-to-php83.php b/config/set/level/down-to-php83.php new file mode 100644 index 00000000..e70c5d20 --- /dev/null +++ b/config/set/level/down-to-php83.php @@ -0,0 +1,10 @@ +sets([DowngradeSetList::PHP_84]); +}; diff --git a/rules-tests/DowngradePhp84/Rector/MethodCall/DowngradeNewMethodCallWithoutParenthesesRector/DowngradeNewMethodCallWithoutParenthesesRectorTest.php b/rules-tests/DowngradePhp84/Rector/MethodCall/DowngradeNewMethodCallWithoutParenthesesRector/DowngradeNewMethodCallWithoutParenthesesRectorTest.php new file mode 100644 index 00000000..b426a4a7 --- /dev/null +++ b/rules-tests/DowngradePhp84/Rector/MethodCall/DowngradeNewMethodCallWithoutParenthesesRector/DowngradeNewMethodCallWithoutParenthesesRectorTest.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/MethodCall/DowngradeNewMethodCallWithoutParenthesesRector/Fixture/fixture.php.inc b/rules-tests/DowngradePhp84/Rector/MethodCall/DowngradeNewMethodCallWithoutParenthesesRector/Fixture/fixture.php.inc new file mode 100644 index 00000000..70fd9cf2 --- /dev/null +++ b/rules-tests/DowngradePhp84/Rector/MethodCall/DowngradeNewMethodCallWithoutParenthesesRector/Fixture/fixture.php.inc @@ -0,0 +1,31 @@ +withMethod('GET')->withUri('/hello-world'); + } +} + +?> +----- +withMethod('GET')->withUri('/hello-world'); + } +} + +?> diff --git a/rules-tests/DowngradePhp84/Rector/MethodCall/DowngradeNewMethodCallWithoutParenthesesRector/Fixture/skip_already_parentheses.php.inc b/rules-tests/DowngradePhp84/Rector/MethodCall/DowngradeNewMethodCallWithoutParenthesesRector/Fixture/skip_already_parentheses.php.inc new file mode 100644 index 00000000..8fe43da6 --- /dev/null +++ b/rules-tests/DowngradePhp84/Rector/MethodCall/DowngradeNewMethodCallWithoutParenthesesRector/Fixture/skip_already_parentheses.php.inc @@ -0,0 +1,13 @@ +withMethod('GET')->withUri('/hello-world'); + } +} diff --git a/rules-tests/DowngradePhp84/Rector/MethodCall/DowngradeNewMethodCallWithoutParenthesesRector/config/configured_rule.php b/rules-tests/DowngradePhp84/Rector/MethodCall/DowngradeNewMethodCallWithoutParenthesesRector/config/configured_rule.php new file mode 100644 index 00000000..3fcff53d --- /dev/null +++ b/rules-tests/DowngradePhp84/Rector/MethodCall/DowngradeNewMethodCallWithoutParenthesesRector/config/configured_rule.php @@ -0,0 +1,10 @@ +rule(DowngradeNewMethodCallWithoutParenthesesRector::class); +}; diff --git a/rules/DowngradePhp84/Rector/MethodCall/DowngradeNewMethodCallWithoutParenthesesRector.php b/rules/DowngradePhp84/Rector/MethodCall/DowngradeNewMethodCallWithoutParenthesesRector.php new file mode 100644 index 00000000..af4623b3 --- /dev/null +++ b/rules/DowngradePhp84/Rector/MethodCall/DowngradeNewMethodCallWithoutParenthesesRector.php @@ -0,0 +1,65 @@ +> + */ + public function getNodeTypes(): array + { + return [MethodCall::class]; + } + + public function getRuleDefinition(): RuleDefinition + { + return new RuleDefinition( + 'Add parentheses on new method call without parentheses', + [ + new CodeSample( + <<<'CODE_SAMPLE' +new Request()->withMethod('GET')->withUri('/hello-world'); +CODE_SAMPLE + , + <<<'CODE_SAMPLE' +(new Request())->withMethod('GET')->withUri('/hello-world'); +CODE_SAMPLE + ), + ] + ); + } + + /** + * @param MethodCall $node + */ + public function refactor(Node $node): ?Node + { + if (! $node->var instanceof New_) { + return null; + } + + $oldTokens = $this->file->getOldTokens(); + if (isset($oldTokens[$node->getStartTokenPos()]) && (string) $oldTokens[$node->getStartTokenPos()] === '(') { + return null; + } + + $node->var->setAttribute(AttributeKey::ORIGINAL_NODE, null); + return $node; + } +} diff --git a/src/Set/ValueObject/DowngradeLevelSetList.php b/src/Set/ValueObject/DowngradeLevelSetList.php index 4c3e1e28..297ba42f 100644 --- a/src/Set/ValueObject/DowngradeLevelSetList.php +++ b/src/Set/ValueObject/DowngradeLevelSetList.php @@ -10,6 +10,11 @@ */ final class DowngradeLevelSetList { + /** + * @var string + */ + public const DOWN_TO_PHP_83 = __DIR__ . '/../../../config/set/level/down-to-php83.php'; + /** * @var string */ diff --git a/src/Set/ValueObject/DowngradeSetList.php b/src/Set/ValueObject/DowngradeSetList.php index 6ed78711..424fcfaa 100644 --- a/src/Set/ValueObject/DowngradeSetList.php +++ b/src/Set/ValueObject/DowngradeSetList.php @@ -44,4 +44,9 @@ final class DowngradeSetList * @var string */ public const PHP_83 = __DIR__ . '/../../../config/set/downgrade-php83.php'; + + /** + * @var string + */ + public const PHP_84 = __DIR__ . '/../../../config/set/downgrade-php84.php'; }