From 500d92dbbe9201fb08e00a1c2a4d42d41b12533d Mon Sep 17 00:00:00 2001 From: Abdul Malik Ikhsan Date: Fri, 20 Feb 2026 22:53:35 +0700 Subject: [PATCH] [CodeQuality] Only allow from final class or constant is marked final on VariableConstFetchToClassConstFetchRector --- ...inc => allow_final_class_constant.php.inc} | 16 +++++----- ...lass_constant_from_non_final_class.php.inc | 15 +++++++++ .../Source/ClassWithFinalConstant.php | 10 ++++++ ...iableConstFetchToClassConstFetchRector.php | 32 ++++++++++++++++++- 4 files changed, 64 insertions(+), 9 deletions(-) rename rules-tests/CodeQuality/Rector/ClassConstFetch/VariableConstFetchToClassConstFetchRector/Fixture/{some_class.php.inc => allow_final_class_constant.php.inc} (53%) create mode 100644 rules-tests/CodeQuality/Rector/ClassConstFetch/VariableConstFetchToClassConstFetchRector/Fixture/skip_class_constant_from_non_final_class.php.inc create mode 100644 rules-tests/CodeQuality/Rector/ClassConstFetch/VariableConstFetchToClassConstFetchRector/Source/ClassWithFinalConstant.php diff --git a/rules-tests/CodeQuality/Rector/ClassConstFetch/VariableConstFetchToClassConstFetchRector/Fixture/some_class.php.inc b/rules-tests/CodeQuality/Rector/ClassConstFetch/VariableConstFetchToClassConstFetchRector/Fixture/allow_final_class_constant.php.inc similarity index 53% rename from rules-tests/CodeQuality/Rector/ClassConstFetch/VariableConstFetchToClassConstFetchRector/Fixture/some_class.php.inc rename to rules-tests/CodeQuality/Rector/ClassConstFetch/VariableConstFetchToClassConstFetchRector/Fixture/allow_final_class_constant.php.inc index 574237ae62f..72074123515 100644 --- a/rules-tests/CodeQuality/Rector/ClassConstFetch/VariableConstFetchToClassConstFetchRector/Fixture/some_class.php.inc +++ b/rules-tests/CodeQuality/Rector/ClassConstFetch/VariableConstFetchToClassConstFetchRector/Fixture/allow_final_class_constant.php.inc @@ -4,13 +4,13 @@ declare(strict_types=1); namespace Rector\Tests\CodeQuality\Rector\ClassConstFetch\VariableConstFetchToClassConstFetchRector\Fixture; -use Rector\Tests\CodeQuality\Rector\ClassConstFetch\VariableConstFetchToClassConstFetchRector\Source\ClassWithConstants; +use Rector\Tests\CodeQuality\Rector\ClassConstFetch\VariableConstFetchToClassConstFetchRector\Source\ClassWithFinalConstant; -final class SomeClass +final class AllowFinalClassConstant { - public function run(ClassWithConstants $classWithConstants) + public function run(ClassWithFinalConstant $classWithFinalConstant) { - return $classWithConstants::NAME; + return $classWithFinalConstant::NAME; } } @@ -22,13 +22,13 @@ declare(strict_types=1); namespace Rector\Tests\CodeQuality\Rector\ClassConstFetch\VariableConstFetchToClassConstFetchRector\Fixture; -use Rector\Tests\CodeQuality\Rector\ClassConstFetch\VariableConstFetchToClassConstFetchRector\Source\ClassWithConstants; +use Rector\Tests\CodeQuality\Rector\ClassConstFetch\VariableConstFetchToClassConstFetchRector\Source\ClassWithFinalConstant; -final class SomeClass +final class AllowFinalClassConstant { - public function run(ClassWithConstants $classWithConstants) + public function run(ClassWithFinalConstant $classWithFinalConstant) { - return \Rector\Tests\CodeQuality\Rector\ClassConstFetch\VariableConstFetchToClassConstFetchRector\Source\ClassWithConstants::NAME; + return \Rector\Tests\CodeQuality\Rector\ClassConstFetch\VariableConstFetchToClassConstFetchRector\Source\ClassWithFinalConstant::NAME; } } diff --git a/rules-tests/CodeQuality/Rector/ClassConstFetch/VariableConstFetchToClassConstFetchRector/Fixture/skip_class_constant_from_non_final_class.php.inc b/rules-tests/CodeQuality/Rector/ClassConstFetch/VariableConstFetchToClassConstFetchRector/Fixture/skip_class_constant_from_non_final_class.php.inc new file mode 100644 index 00000000000..39379be4d16 --- /dev/null +++ b/rules-tests/CodeQuality/Rector/ClassConstFetch/VariableConstFetchToClassConstFetchRector/Fixture/skip_class_constant_from_non_final_class.php.inc @@ -0,0 +1,15 @@ +reflectionProvider->hasClass($classObjectType->getClassName())) { + return null; + } + + $classReflection = $this->reflectionProvider->getClass($classObjectType->getClassName()); + if (! $classReflection->isFinalByKeyword()) { + if (! $classReflection->hasConstant($constantName)) { + return null; + } + + $constant = $classReflection->getConstant($constantName); + if (! $constant->isFinal()) { + return null; + } + } + $node->class = new FullyQualified($classObjectType->getClassName()); return $node;