From 2f9683271df89e613a6e2dc3abfc19180806693c Mon Sep 17 00:00:00 2001 From: Abdul Malik Ikhsan Date: Fri, 23 May 2025 04:06:26 +0700 Subject: [PATCH 1/3] [DowngradePhp83] Add DowngradeDynamicClassConstFetchRector --- config/set/downgrade-php83.php | 2 + ...ngradeDynamicClassConstFetchRectorTest.php | 28 +++++++ .../Fixture/fixture.php.inc | 37 ++++++++++ .../skip_named_class_const_fetch.php.inc | 15 ++++ .../config/configured_rule.php | 10 +++ .../DowngradeDynamicClassConstFetchRector.php | 74 +++++++++++++++++++ 6 files changed, 166 insertions(+) create mode 100644 rules-tests/DowngradePhp83/Rector/ClassConstFetch/DowngradeDynamicClassConstFetchRector/DowngradeDynamicClassConstFetchRectorTest.php create mode 100644 rules-tests/DowngradePhp83/Rector/ClassConstFetch/DowngradeDynamicClassConstFetchRector/Fixture/fixture.php.inc create mode 100644 rules-tests/DowngradePhp83/Rector/ClassConstFetch/DowngradeDynamicClassConstFetchRector/Fixture/skip_named_class_const_fetch.php.inc create mode 100644 rules-tests/DowngradePhp83/Rector/ClassConstFetch/DowngradeDynamicClassConstFetchRector/config/configured_rule.php create mode 100644 rules/DowngradePhp83/Rector/ClassConstFetch/DowngradeDynamicClassConstFetchRector.php diff --git a/config/set/downgrade-php83.php b/config/set/downgrade-php83.php index f86f2300..af0d5d88 100644 --- a/config/set/downgrade-php83.php +++ b/config/set/downgrade-php83.php @@ -6,11 +6,13 @@ use Rector\DowngradePhp83\Rector\Class_\DowngradeReadonlyAnonymousClassRector; use Rector\ValueObject\PhpVersion; use Rector\DowngradePhp83\Rector\ClassConst\DowngradeTypedClassConstRector; +use Rector\DowngradePhp83\Rector\ClassConstFetch\DowngradeDynamicClassConstFetchRector; return static function (RectorConfig $rectorConfig): void { $rectorConfig->phpVersion(PhpVersion::PHP_82); $rectorConfig->rules([ DowngradeTypedClassConstRector::class, DowngradeReadonlyAnonymousClassRector::class, + DowngradeDynamicClassConstFetchRector::class, ]); }; diff --git a/rules-tests/DowngradePhp83/Rector/ClassConstFetch/DowngradeDynamicClassConstFetchRector/DowngradeDynamicClassConstFetchRectorTest.php b/rules-tests/DowngradePhp83/Rector/ClassConstFetch/DowngradeDynamicClassConstFetchRector/DowngradeDynamicClassConstFetchRectorTest.php new file mode 100644 index 00000000..c440a848 --- /dev/null +++ b/rules-tests/DowngradePhp83/Rector/ClassConstFetch/DowngradeDynamicClassConstFetchRector/DowngradeDynamicClassConstFetchRectorTest.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/DowngradePhp83/Rector/ClassConstFetch/DowngradeDynamicClassConstFetchRector/Fixture/fixture.php.inc b/rules-tests/DowngradePhp83/Rector/ClassConstFetch/DowngradeDynamicClassConstFetchRector/Fixture/fixture.php.inc new file mode 100644 index 00000000..5869e412 --- /dev/null +++ b/rules-tests/DowngradePhp83/Rector/ClassConstFetch/DowngradeDynamicClassConstFetchRector/Fixture/fixture.php.inc @@ -0,0 +1,37 @@ + +----- + diff --git a/rules-tests/DowngradePhp83/Rector/ClassConstFetch/DowngradeDynamicClassConstFetchRector/Fixture/skip_named_class_const_fetch.php.inc b/rules-tests/DowngradePhp83/Rector/ClassConstFetch/DowngradeDynamicClassConstFetchRector/Fixture/skip_named_class_const_fetch.php.inc new file mode 100644 index 00000000..d4ead3be --- /dev/null +++ b/rules-tests/DowngradePhp83/Rector/ClassConstFetch/DowngradeDynamicClassConstFetchRector/Fixture/skip_named_class_const_fetch.php.inc @@ -0,0 +1,15 @@ +rule(DowngradeDynamicClassConstFetchRector::class); +}; diff --git a/rules/DowngradePhp83/Rector/ClassConstFetch/DowngradeDynamicClassConstFetchRector.php b/rules/DowngradePhp83/Rector/ClassConstFetch/DowngradeDynamicClassConstFetchRector.php new file mode 100644 index 00000000..fce6cf5e --- /dev/null +++ b/rules/DowngradePhp83/Rector/ClassConstFetch/DowngradeDynamicClassConstFetchRector.php @@ -0,0 +1,74 @@ +> + */ + public function getNodeTypes(): array + { + return [ClassConstFetch::class]; + } + + public function getRuleDefinition(): RuleDefinition + { + return new RuleDefinition( + 'Change dynamic class const fetch Example::{$constName} to constant(Example::class . \'::\' . $constName)', + [ + new CodeSample( + <<<'CODE_SAMPLE' +$value = Example::{$constName}; +CODE_SAMPLE + , + <<<'CODE_SAMPLE' +$value = constant(Example::class . '::' . $constName); +CODE_SAMPLE + ), + ] + ); + } + + /** + * @param ClassConstFetch $node + */ + public function refactor(Node $node): ?Node + { + if ($node->name instanceof Identifier) { + return null; + } + + return $this->nodeFactory->createFuncCall('constant', [ + new Concat( + new Concat( + new ClassConstFetch($node->class, new Identifier('class')), + new String_('::') + ), + $node->name + ), + ]); + } +} From a41b97c5515f6f38f27b423834a15e10d819fb85 Mon Sep 17 00:00:00 2001 From: Abdul Malik Ikhsan Date: Fri, 23 May 2025 04:08:49 +0700 Subject: [PATCH 2/3] cleasns up --- .../DowngradeDynamicClassConstFetchRector.php | 11 +---------- 1 file changed, 1 insertion(+), 10 deletions(-) diff --git a/rules/DowngradePhp83/Rector/ClassConstFetch/DowngradeDynamicClassConstFetchRector.php b/rules/DowngradePhp83/Rector/ClassConstFetch/DowngradeDynamicClassConstFetchRector.php index fce6cf5e..cee77418 100644 --- a/rules/DowngradePhp83/Rector/ClassConstFetch/DowngradeDynamicClassConstFetchRector.php +++ b/rules/DowngradePhp83/Rector/ClassConstFetch/DowngradeDynamicClassConstFetchRector.php @@ -9,7 +9,6 @@ use PhpParser\Node\Expr\ClassConstFetch; use PhpParser\Node\Identifier; use PhpParser\Node\Scalar\String_; -use Rector\NodeManipulator\PropertyDecorator; use Rector\Rector\AbstractRector; use Symplify\RuleDocGenerator\ValueObject\CodeSample\CodeSample; use Symplify\RuleDocGenerator\ValueObject\RuleDefinition; @@ -21,11 +20,6 @@ */ final class DowngradeDynamicClassConstFetchRector extends AbstractRector { - public function __construct( - private readonly PropertyDecorator $propertyDecorator - ) { - } - /** * @return array> */ @@ -63,10 +57,7 @@ public function refactor(Node $node): ?Node return $this->nodeFactory->createFuncCall('constant', [ new Concat( - new Concat( - new ClassConstFetch($node->class, new Identifier('class')), - new String_('::') - ), + new Concat(new ClassConstFetch($node->class, new Identifier('class')), new String_('::')), $node->name ), ]); From abd2aa3edee8f5226c067ecd74fb9753cecbbb28 Mon Sep 17 00:00:00 2001 From: Abdul Malik Ikhsan Date: Fri, 23 May 2025 04:09:52 +0700 Subject: [PATCH 3/3] cleasns up --- .../Fixture/fixture.php.inc | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/rules-tests/DowngradePhp83/Rector/ClassConstFetch/DowngradeDynamicClassConstFetchRector/Fixture/fixture.php.inc b/rules-tests/DowngradePhp83/Rector/ClassConstFetch/DowngradeDynamicClassConstFetchRector/Fixture/fixture.php.inc index 5869e412..80635bce 100644 --- a/rules-tests/DowngradePhp83/Rector/ClassConstFetch/DowngradeDynamicClassConstFetchRector/Fixture/fixture.php.inc +++ b/rules-tests/DowngradePhp83/Rector/ClassConstFetch/DowngradeDynamicClassConstFetchRector/Fixture/fixture.php.inc @@ -10,7 +10,7 @@ class Fixture public function run() { - $someValue = 'foo'; + $someValue = 'FOO'; Fixture::{$someValue}; } } @@ -29,7 +29,7 @@ class Fixture public function run() { - $someValue = 'foo'; + $someValue = 'FOO'; constant(Fixture::class . '::' . $someValue); } }