diff --git a/config/set/privatization.php b/config/set/privatization.php index f0c771e4894..f259deeaa91 100644 --- a/config/set/privatization.php +++ b/config/set/privatization.php @@ -7,10 +7,9 @@ use Rector\Privatization\Rector\MethodCall\PrivatizeLocalGetterToPropertyRector; use Rector\Privatization\Rector\Property\PrivatizeFinalClassPropertyRector; -return static function (RectorConfig $rectorConfig): void { - $rectorConfig->rules([ +return RectorConfig::configure() + ->withRules([ PrivatizeLocalGetterToPropertyRector::class, PrivatizeFinalClassPropertyRector::class, PrivatizeFinalClassMethodRector::class, ]); -}; diff --git a/rules-tests/Privatization/Rector/Class_/FinalizeTestCaseClassRector/FinalizeTestCaseClassRectorTest.php b/rules-tests/Privatization/Rector/Class_/FinalizeTestCaseClassRector/FinalizeTestCaseClassRectorTest.php new file mode 100644 index 00000000000..7ffffd48f94 --- /dev/null +++ b/rules-tests/Privatization/Rector/Class_/FinalizeTestCaseClassRector/FinalizeTestCaseClassRectorTest.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/Privatization/Rector/Class_/FinalizeTestCaseClassRector/Fixture/some_class.php.inc b/rules-tests/Privatization/Rector/Class_/FinalizeTestCaseClassRector/Fixture/some_class.php.inc new file mode 100644 index 00000000000..957997bb7dc --- /dev/null +++ b/rules-tests/Privatization/Rector/Class_/FinalizeTestCaseClassRector/Fixture/some_class.php.inc @@ -0,0 +1,23 @@ + +----- + diff --git a/rules-tests/Privatization/Rector/Class_/FinalizeTestCaseClassRector/config/configured_rule.php b/rules-tests/Privatization/Rector/Class_/FinalizeTestCaseClassRector/config/configured_rule.php new file mode 100644 index 00000000000..35c7d511742 --- /dev/null +++ b/rules-tests/Privatization/Rector/Class_/FinalizeTestCaseClassRector/config/configured_rule.php @@ -0,0 +1,10 @@ +rule(FinalizeTestCaseClassRector::class); +}; diff --git a/rules/Privatization/Rector/Class_/FinalizeTestCaseClassRector.php b/rules/Privatization/Rector/Class_/FinalizeTestCaseClassRector.php new file mode 100644 index 00000000000..b756587855e --- /dev/null +++ b/rules/Privatization/Rector/Class_/FinalizeTestCaseClassRector.php @@ -0,0 +1,86 @@ +> + */ + public function getNodeTypes(): array + { + return [Class_::class]; + } + + /** + * @param Class_ $node + */ + public function refactor(Node $node): ?Node + { + // skip obvious cases + if ($node->isAbstract() || $node->isAnonymous() || $node->isFinal()) { + return null; + } + + $className = $this->getName($node); + if (! is_string($className)) { + return null; + } + + if (! $this->reflectionProvider->hasClass($className)) { + return null; + } + + $classReflection = $this->reflectionProvider->getClass($className); + if (! $classReflection->isSubclassOf('PHPUnit\Framework\TestCase')) { + return null; + } + + $this->visibilityManipulator->makeFinal($node); + + return $node; + } +} diff --git a/utils/Command/MissingInSetCommand.php b/utils/Command/MissingInSetCommand.php index 48ef6e6f6a7..0cd0f1a54fd 100644 --- a/utils/Command/MissingInSetCommand.php +++ b/utils/Command/MissingInSetCommand.php @@ -11,6 +11,7 @@ use Rector\Php73\Rector\FuncCall\JsonThrowOnErrorRector; use Rector\Php81\Rector\ClassConst\FinalizePublicClassConstantRector; use Rector\Privatization\Rector\Class_\FinalizeClassesWithoutChildrenRector; +use Rector\Privatization\Rector\Class_\FinalizeTestCaseClassRector; use Rector\TypeDeclaration\Rector\BooleanAnd\BinaryOpNullableToInstanceofRector; use Rector\TypeDeclaration\Rector\StmtsAwareInterface\DeclareStrictTypesRector; use Rector\TypeDeclaration\Rector\While_\WhileNullableToInstanceofRector; @@ -39,6 +40,7 @@ final class MissingInSetCommand extends Command RemoveNullTagValueNodeRector::class, // personal preference, enable on purpose ArraySpreadInsteadOfArrayMergeRector::class, + FinalizeTestCaseClassRector::class, FinalizeClassesWithoutChildrenRector::class, // deprecated FinalizePublicClassConstantRector::class,