From 9c1a66825d5d9e7123d630c16f79280e8a934042 Mon Sep 17 00:00:00 2001 From: Abdul Malik Ikhsan Date: Mon, 21 Sep 2026 20:23:46 +0700 Subject: [PATCH] [DowngradePhp84] Add DowngradeFinalPropertyRector --- config/set/downgrade-php84.php | 4 +- .../DowngradeFinalPropertyRectorTest.php | 28 +++++ .../Fixture/already_has_final_tag.php.inc | 27 +++++ .../Fixture/existing_docblock.php.inc | 28 +++++ .../Fixture/fixture.php.inc | 24 ++++ .../Fixture/in_trait.php.inc | 24 ++++ .../Fixture/public_property.php.inc | 24 ++++ .../config/configured_rule.php | 10 ++ .../Class_/DowngradeFinalPropertyRector.php | 103 ++++++++++++++++++ 9 files changed, 271 insertions(+), 1 deletion(-) create mode 100644 rules-tests/DowngradePhp84/Rector/Class_/DowngradeFinalPropertyRector/DowngradeFinalPropertyRectorTest.php create mode 100644 rules-tests/DowngradePhp84/Rector/Class_/DowngradeFinalPropertyRector/Fixture/already_has_final_tag.php.inc create mode 100644 rules-tests/DowngradePhp84/Rector/Class_/DowngradeFinalPropertyRector/Fixture/existing_docblock.php.inc create mode 100644 rules-tests/DowngradePhp84/Rector/Class_/DowngradeFinalPropertyRector/Fixture/fixture.php.inc create mode 100644 rules-tests/DowngradePhp84/Rector/Class_/DowngradeFinalPropertyRector/Fixture/in_trait.php.inc create mode 100644 rules-tests/DowngradePhp84/Rector/Class_/DowngradeFinalPropertyRector/Fixture/public_property.php.inc create mode 100644 rules-tests/DowngradePhp84/Rector/Class_/DowngradeFinalPropertyRector/config/configured_rule.php create mode 100644 rules/DowngradePhp84/Rector/Class_/DowngradeFinalPropertyRector.php diff --git a/config/set/downgrade-php84.php b/config/set/downgrade-php84.php index af56a7d2..18a0c4c6 100644 --- a/config/set/downgrade-php84.php +++ b/config/set/downgrade-php84.php @@ -3,10 +3,11 @@ declare(strict_types=1); use Rector\Config\RectorConfig; +use Rector\DowngradePhp84\Rector\Class_\DowngradeFinalPropertyRector; +use Rector\DowngradePhp84\Rector\ClassMethod\DowngradeDeprecatedAttributeRector; use Rector\DowngradePhp84\Rector\Expression\DowngradeArrayAllRector; use Rector\DowngradePhp84\Rector\Expression\DowngradeArrayAnyRector; use Rector\DowngradePhp84\Rector\Expression\DowngradeArrayFindKeyRector; -use Rector\DowngradePhp84\Rector\ClassMethod\DowngradeDeprecatedAttributeRector; use Rector\DowngradePhp84\Rector\Expression\DowngradeArrayFindRector; use Rector\DowngradePhp84\Rector\FuncCall\DowngradeExitNamedArgumentRector; use Rector\DowngradePhp84\Rector\FuncCall\DowngradeRoundingModeEnumRector; @@ -24,5 +25,6 @@ DowngradeArrayFindRector::class, DowngradeArrayFindKeyRector::class, DowngradeDeprecatedAttributeRector::class, + DowngradeFinalPropertyRector::class, ]); }; diff --git a/rules-tests/DowngradePhp84/Rector/Class_/DowngradeFinalPropertyRector/DowngradeFinalPropertyRectorTest.php b/rules-tests/DowngradePhp84/Rector/Class_/DowngradeFinalPropertyRector/DowngradeFinalPropertyRectorTest.php new file mode 100644 index 00000000..28bd5fc8 --- /dev/null +++ b/rules-tests/DowngradePhp84/Rector/Class_/DowngradeFinalPropertyRector/DowngradeFinalPropertyRectorTest.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/Class_/DowngradeFinalPropertyRector/Fixture/already_has_final_tag.php.inc b/rules-tests/DowngradePhp84/Rector/Class_/DowngradeFinalPropertyRector/Fixture/already_has_final_tag.php.inc new file mode 100644 index 00000000..86236c7d --- /dev/null +++ b/rules-tests/DowngradePhp84/Rector/Class_/DowngradeFinalPropertyRector/Fixture/already_has_final_tag.php.inc @@ -0,0 +1,27 @@ + +----- + diff --git a/rules-tests/DowngradePhp84/Rector/Class_/DowngradeFinalPropertyRector/Fixture/existing_docblock.php.inc b/rules-tests/DowngradePhp84/Rector/Class_/DowngradeFinalPropertyRector/Fixture/existing_docblock.php.inc new file mode 100644 index 00000000..595fb8a9 --- /dev/null +++ b/rules-tests/DowngradePhp84/Rector/Class_/DowngradeFinalPropertyRector/Fixture/existing_docblock.php.inc @@ -0,0 +1,28 @@ + +----- + diff --git a/rules-tests/DowngradePhp84/Rector/Class_/DowngradeFinalPropertyRector/Fixture/fixture.php.inc b/rules-tests/DowngradePhp84/Rector/Class_/DowngradeFinalPropertyRector/Fixture/fixture.php.inc new file mode 100644 index 00000000..0ab3193a --- /dev/null +++ b/rules-tests/DowngradePhp84/Rector/Class_/DowngradeFinalPropertyRector/Fixture/fixture.php.inc @@ -0,0 +1,24 @@ + +----- + diff --git a/rules-tests/DowngradePhp84/Rector/Class_/DowngradeFinalPropertyRector/Fixture/in_trait.php.inc b/rules-tests/DowngradePhp84/Rector/Class_/DowngradeFinalPropertyRector/Fixture/in_trait.php.inc new file mode 100644 index 00000000..b5b2f277 --- /dev/null +++ b/rules-tests/DowngradePhp84/Rector/Class_/DowngradeFinalPropertyRector/Fixture/in_trait.php.inc @@ -0,0 +1,24 @@ + +----- + diff --git a/rules-tests/DowngradePhp84/Rector/Class_/DowngradeFinalPropertyRector/Fixture/public_property.php.inc b/rules-tests/DowngradePhp84/Rector/Class_/DowngradeFinalPropertyRector/Fixture/public_property.php.inc new file mode 100644 index 00000000..ff7b7035 --- /dev/null +++ b/rules-tests/DowngradePhp84/Rector/Class_/DowngradeFinalPropertyRector/Fixture/public_property.php.inc @@ -0,0 +1,24 @@ + +----- + diff --git a/rules-tests/DowngradePhp84/Rector/Class_/DowngradeFinalPropertyRector/config/configured_rule.php b/rules-tests/DowngradePhp84/Rector/Class_/DowngradeFinalPropertyRector/config/configured_rule.php new file mode 100644 index 00000000..c61423ad --- /dev/null +++ b/rules-tests/DowngradePhp84/Rector/Class_/DowngradeFinalPropertyRector/config/configured_rule.php @@ -0,0 +1,10 @@ +rule(DowngradeFinalPropertyRector::class); +}; diff --git a/rules/DowngradePhp84/Rector/Class_/DowngradeFinalPropertyRector.php b/rules/DowngradePhp84/Rector/Class_/DowngradeFinalPropertyRector.php new file mode 100644 index 00000000..f595c879 --- /dev/null +++ b/rules/DowngradePhp84/Rector/Class_/DowngradeFinalPropertyRector.php @@ -0,0 +1,103 @@ +> + */ + public function getNodeTypes(): array + { + return [Class_::class, Trait_::class]; + } + + /** + * @param Class_|Trait_ $node + */ + public function refactor(Node $node): ?Node + { + $hasChanged = false; + + foreach ($node->getProperties() as $property) { + if (! $property->isFinal()) { + continue; + } + + $this->downgradeFinal($property); + $hasChanged = true; + } + + if ($hasChanged) { + return $node; + } + + return null; + } + + private function downgradeFinal(Property $property): void + { + $property->flags &= ~Modifiers::FINAL; + + $phpDocInfo = $this->phpDocInfoFactory->createFromNodeOrEmpty($property); + if ($phpDocInfo->hasByName(self::TAGNAME)) { + return; + } + + $phpDocInfo->addPhpDocTagNode(new PhpDocTagNode('@' . self::TAGNAME, new GenericTagValueNode(''))); + $this->docBlockUpdater->updateRefactoredNodeWithPhpDocInfo($property); + } +}