diff --git a/config/set/symfony/symfony30.yaml b/config/set/symfony/symfony30.yaml index 631cc1a11a3..6cfb78b9702 100644 --- a/config/set/symfony/symfony30.yaml +++ b/config/set/symfony/symfony30.yaml @@ -12,6 +12,7 @@ services: Rector\Symfony\Rector\MethodCall\FormTypeInstanceToClassConstRector: null Rector\Symfony\Rector\Form\StringFormTypeToClassRector: null Rector\Symfony\Rector\MethodCall\CascadeValidationFormBuilderRector: null + Rector\Symfony\Rector\ClassMethod\RemoveDefaultGetBlockPrefixRector: null # forms - collection Rector\Symfony\Rector\MethodCall\ChangeCollectionTypeOptionTypeFromStringToClassReferenceRector: null diff --git a/docs/rector_rules_overview.md b/docs/rector_rules_overview.md index f384dc54ddf..e72d243a7e4 100644 --- a/docs/rector_rules_overview.md +++ b/docs/rector_rules_overview.md @@ -1,4 +1,4 @@ -# All 523 Rectors Overview +# All 524 Rectors Overview - [Projects](#projects) - [General](#general) @@ -65,7 +65,7 @@ - [SOLID](#solid) (12) - [Sensio](#sensio) (3) - [StrictCodeQuality](#strictcodequality) (1) -- [Symfony](#symfony) (32) +- [Symfony](#symfony) (33) - [SymfonyCodeQuality](#symfonycodequality) (1) - [SymfonyPHPUnit](#symfonyphpunit) (1) - [Twig](#twig) (1) @@ -11148,6 +11148,27 @@ Turns redirect to route to short helper method in Controller in Symfony

+### `RemoveDefaultGetBlockPrefixRector` + +- class: [`Rector\Symfony\Rector\ClassMethod\RemoveDefaultGetBlockPrefixRector`](/../master/rules/symfony/src/Rector/ClassMethod/RemoveDefaultGetBlockPrefixRector.php) +- [test fixtures](/../master/rules/symfony/tests/Rector/ClassMethod/RemoveDefaultGetBlockPrefixRector/Fixture) + +Rename `getBlockPrefix()` if it returns the default value - class to underscore, e.g. UserFormType = user_form + +```diff + use Symfony\Component\Form\AbstractType; + + class TaskType extends AbstractType + { +- public function getBlockPrefix() +- { +- return 'task'; +- } + } +``` + +

+ ### `ResponseStatusCodeRector` - class: [`Rector\Symfony\Rector\BinaryOp\ResponseStatusCodeRector`](/../master/rules/symfony/src/Rector/BinaryOp/ResponseStatusCodeRector.php) diff --git a/rules/symfony/src/Rector/ClassMethod/RemoveDefaultGetBlockPrefixRector.php b/rules/symfony/src/Rector/ClassMethod/RemoveDefaultGetBlockPrefixRector.php new file mode 100644 index 00000000000..de99a9210ee --- /dev/null +++ b/rules/symfony/src/Rector/ClassMethod/RemoveDefaultGetBlockPrefixRector.php @@ -0,0 +1,120 @@ +isObjectMethodNameMatch($node)) { + return null; + } + + $returnedExpr = $this->resolveOnlyStmtReturnExpr($node); + if ($returnedExpr === null) { + return null; + } + + $returnedValue = $this->getValue($returnedExpr); + + $classShortName = $node->getAttribute(AttributeKey::CLASS_SHORT_NAME); + if (Strings::endsWith($classShortName, 'Type')) { + $classShortName = Strings::before($classShortName, 'Type'); + } + + $underscoredClassShortName = StaticRectorStrings::camelCaseToUnderscore($classShortName); + if ($underscoredClassShortName !== $returnedValue) { + return null; + } + + $this->removeNode($node); + + return null; + } + + /** + * return <$thisValue>; + */ + private function resolveOnlyStmtReturnExpr(ClassMethod $classMethod): ?Expr + { + if (count((array) $classMethod->stmts) !== 1) { + return null; + } + + $onlyStmt = $classMethod->stmts[0]; + if (! $onlyStmt instanceof Return_) { + return null; + } + + return $onlyStmt->expr; + } + + private function isObjectMethodNameMatch(ClassMethod $classMethod): bool + { + if (! $this->isInObjectType($classMethod, 'Symfony\Component\Form\AbstractType')) { + return false; + } + + return $this->isName($classMethod->name, 'getBlockPrefix'); + } +} diff --git a/rules/symfony/tests/Rector/ClassMethod/RemoveDefaultGetBlockPrefixRector/Fixture/double_name.php.inc b/rules/symfony/tests/Rector/ClassMethod/RemoveDefaultGetBlockPrefixRector/Fixture/double_name.php.inc new file mode 100644 index 00000000000..f830580efc8 --- /dev/null +++ b/rules/symfony/tests/Rector/ClassMethod/RemoveDefaultGetBlockPrefixRector/Fixture/double_name.php.inc @@ -0,0 +1,27 @@ + +----- + diff --git a/rules/symfony/tests/Rector/ClassMethod/RemoveDefaultGetBlockPrefixRector/Fixture/fixture.php.inc b/rules/symfony/tests/Rector/ClassMethod/RemoveDefaultGetBlockPrefixRector/Fixture/fixture.php.inc new file mode 100644 index 00000000000..77a52555f9a --- /dev/null +++ b/rules/symfony/tests/Rector/ClassMethod/RemoveDefaultGetBlockPrefixRector/Fixture/fixture.php.inc @@ -0,0 +1,27 @@ + +----- + diff --git a/rules/symfony/tests/Rector/ClassMethod/RemoveDefaultGetBlockPrefixRector/Fixture/skip_different_name.php.inc b/rules/symfony/tests/Rector/ClassMethod/RemoveDefaultGetBlockPrefixRector/Fixture/skip_different_name.php.inc new file mode 100644 index 00000000000..7396d1d5841 --- /dev/null +++ b/rules/symfony/tests/Rector/ClassMethod/RemoveDefaultGetBlockPrefixRector/Fixture/skip_different_name.php.inc @@ -0,0 +1,13 @@ +doTestFileInfo($fileInfo); + } + + public function provideData(): Iterator + { + return $this->yieldFilesFromDirectory(__DIR__ . '/Fixture'); + } + + protected function getRectorClass(): string + { + return RemoveDefaultGetBlockPrefixRector::class; + } +}