From 5c264c839a406b281e9c14ec1597ba125c755d8e Mon Sep 17 00:00:00 2001 From: Abdul Malik Ikhsan Date: Fri, 15 Aug 2025 23:06:20 +0700 Subject: [PATCH] [DX] Pass Class_ stmt on FeatureFlags::treatClassesAsFinal() --- .../StaticToSelfStaticMethodCallOnFinalClassRector.php | 6 +----- .../CodeQuality/Rector/New_/NewStaticToNewSelfRector.php | 6 +----- .../Rector/ClassMethod/RemoveEmptyClassMethodRector.php | 6 +++--- .../RemoveUnusedPublicMethodParameterRector.php | 6 +----- rules/Php83/Rector/ClassConst/AddTypeToConstRector.php | 4 ++-- .../AddMethodCallBasedStrictParamTypeRector.php | 2 +- src/Configuration/Parameter/FeatureFlags.php | 9 ++++++++- 7 files changed, 17 insertions(+), 22 deletions(-) diff --git a/rules/CodeQuality/Rector/Class_/StaticToSelfStaticMethodCallOnFinalClassRector.php b/rules/CodeQuality/Rector/Class_/StaticToSelfStaticMethodCallOnFinalClassRector.php index 64bdc3dd53f..2bc4731fa12 100644 --- a/rules/CodeQuality/Rector/Class_/StaticToSelfStaticMethodCallOnFinalClassRector.php +++ b/rules/CodeQuality/Rector/Class_/StaticToSelfStaticMethodCallOnFinalClassRector.php @@ -71,11 +71,7 @@ public function getNodeTypes(): array */ public function refactor(Node $node): ?Class_ { - if ($node->isAbstract()) { - return null; - } - - if (! $node->isFinal() && FeatureFlags::treatClassesAsFinal() === false) { + if (! $node->isFinal() && FeatureFlags::treatClassesAsFinal($node) === false) { return null; } diff --git a/rules/CodeQuality/Rector/New_/NewStaticToNewSelfRector.php b/rules/CodeQuality/Rector/New_/NewStaticToNewSelfRector.php index 6785c2bcddb..a32a99324c5 100644 --- a/rules/CodeQuality/Rector/New_/NewStaticToNewSelfRector.php +++ b/rules/CodeQuality/Rector/New_/NewStaticToNewSelfRector.php @@ -60,11 +60,7 @@ public function getNodeTypes(): array */ public function refactor(Node $node): ?Node { - if ($node->isAbstract()) { - return null; - } - - if (! $node->isFinal() && FeatureFlags::treatClassesAsFinal() === false) { + if (! $node->isFinal() && FeatureFlags::treatClassesAsFinal($node) === false) { return null; } diff --git a/rules/DeadCode/Rector/ClassMethod/RemoveEmptyClassMethodRector.php b/rules/DeadCode/Rector/ClassMethod/RemoveEmptyClassMethodRector.php index 45678801603..eacb0e06a27 100644 --- a/rules/DeadCode/Rector/ClassMethod/RemoveEmptyClassMethodRector.php +++ b/rules/DeadCode/Rector/ClassMethod/RemoveEmptyClassMethodRector.php @@ -89,7 +89,7 @@ public function refactor(Node $node): ?Class_ continue; } - if ($stmt->isFinal() && ! $node->isFinal() && FeatureFlags::treatClassesAsFinal() === false) { + if ($stmt->isFinal() && ! $node->isFinal() && FeatureFlags::treatClassesAsFinal($node) === false) { continue; } @@ -114,8 +114,8 @@ public function refactor(Node $node): ?Class_ private function shouldSkipNonFinalNonPrivateClassMethod(Class_ $class, ClassMethod $classMethod): bool { - if ($class->isFinal() || FeatureFlags::treatClassesAsFinal()) { - return $class->isAbstract(); + if ($class->isFinal() || FeatureFlags::treatClassesAsFinal($class)) { + return false; } if ($classMethod->isMagic()) { diff --git a/rules/DeadCode/Rector/ClassMethod/RemoveUnusedPublicMethodParameterRector.php b/rules/DeadCode/Rector/ClassMethod/RemoveUnusedPublicMethodParameterRector.php index ece487d2ce0..18e603a8ba1 100644 --- a/rules/DeadCode/Rector/ClassMethod/RemoveUnusedPublicMethodParameterRector.php +++ b/rules/DeadCode/Rector/ClassMethod/RemoveUnusedPublicMethodParameterRector.php @@ -73,12 +73,8 @@ public function getNodeTypes(): array */ public function refactor(Node $node): ?Node { - if ($node->isAbstract()) { - return null; - } - // may have child, or override parent that needs to follow the signature - if (! $node->isFinal() && FeatureFlags::treatClassesAsFinal() === false) { + if (! $node->isFinal() && FeatureFlags::treatClassesAsFinal($node) === false) { return null; } diff --git a/rules/Php83/Rector/ClassConst/AddTypeToConstRector.php b/rules/Php83/Rector/ClassConst/AddTypeToConstRector.php index 88434969f39..e6ada69f31f 100644 --- a/rules/Php83/Rector/ClassConst/AddTypeToConstRector.php +++ b/rules/Php83/Rector/ClassConst/AddTypeToConstRector.php @@ -222,8 +222,8 @@ private function getParentReflections(string $className): array private function canBeInherited(ClassConst $classConst, Class_ $class): bool { - if (FeatureFlags::treatClassesAsFinal()) { - return $class->isAbstract(); + if (FeatureFlags::treatClassesAsFinal($class)) { + return false; } return ! $class->isFinal() && ! $classConst->isPrivate() && ! $classConst->isFinal(); diff --git a/rules/TypeDeclaration/Rector/ClassMethod/AddMethodCallBasedStrictParamTypeRector.php b/rules/TypeDeclaration/Rector/ClassMethod/AddMethodCallBasedStrictParamTypeRector.php index ee1266629b7..b2c4af799ea 100644 --- a/rules/TypeDeclaration/Rector/ClassMethod/AddMethodCallBasedStrictParamTypeRector.php +++ b/rules/TypeDeclaration/Rector/ClassMethod/AddMethodCallBasedStrictParamTypeRector.php @@ -131,7 +131,7 @@ private function isClassMethodPrivate(Class_ $class, ClassMethod $classMethod): return true; } - $isClassFinal = $class->isFinal() || (FeatureFlags::treatClassesAsFinal() && ! $class->isAbstract()); + $isClassFinal = $class->isFinal() || FeatureFlags::treatClassesAsFinal($class); return $isClassFinal && ! $class->extends instanceof Name && $class->implements === [] && $classMethod->isProtected(); } diff --git a/src/Configuration/Parameter/FeatureFlags.php b/src/Configuration/Parameter/FeatureFlags.php index 1ae49704c5c..8326b037b11 100644 --- a/src/Configuration/Parameter/FeatureFlags.php +++ b/src/Configuration/Parameter/FeatureFlags.php @@ -4,6 +4,7 @@ namespace Rector\Configuration\Parameter; +use PhpParser\Node\Stmt\Class_; use Rector\Configuration\Option; /** @@ -12,8 +13,14 @@ */ final class FeatureFlags { - public static function treatClassesAsFinal(): bool + public static function treatClassesAsFinal(Class_ $class): bool { + // abstract class never can be treated as "final" + // as always must be overridden + if ($class->isAbstract()) { + return false; + } + return SimpleParameterProvider::provideBoolParameter(Option::TREAT_CLASSES_AS_FINAL); } }