From 2ed8b1049ecc6523fb261baabe8ae894fba6e606 Mon Sep 17 00:00:00 2001 From: Stefan Blanke Date: Wed, 30 Oct 2019 17:04:28 +0100 Subject: [PATCH 1/2] Add AbstractController as base class if no one exists --- .../TemplateAnnotationRector.php | 21 +++++++++- .../Fixture/Version3/fixture.php.inc | 6 ++- .../Fixture/Version3/fixture2.php.inc | 6 ++- .../Fixture/Version3/fixture3.php.inc | 6 ++- .../Fixture/Version3/fixture4.php.inc | 6 ++- .../Version3/skip_just_template.php.inc | 4 +- .../Fixture/Version5/fixture.php.inc | 6 ++- .../Fixture/Version5/fixture2.php.inc | 6 ++- .../Fixture/Version5/fixture3.php.inc | 6 ++- .../Fixture/Version5/fixture4.php.inc | 6 ++- .../Fixture/Version5/fixture5.php.inc | 6 ++- .../Version5/with_route_options.php.inc | 6 ++- .../Fixture/Version5/with_route_too.php.inc | 6 ++- .../Version5/without_base_class.php.inc | 40 +++++++++++++++++++ .../TemplateAnnotationVersion5RectorTest.php | 1 + 15 files changed, 108 insertions(+), 24 deletions(-) mode change 100644 => 100755 packages/Sensio/src/Rector/FrameworkExtraBundle/TemplateAnnotationRector.php mode change 100644 => 100755 packages/Sensio/tests/Rector/FrameworkExtraBundle/TemplateAnnotationRector/Fixture/Version3/fixture.php.inc mode change 100644 => 100755 packages/Sensio/tests/Rector/FrameworkExtraBundle/TemplateAnnotationRector/Fixture/Version3/fixture2.php.inc mode change 100644 => 100755 packages/Sensio/tests/Rector/FrameworkExtraBundle/TemplateAnnotationRector/Fixture/Version3/fixture3.php.inc mode change 100644 => 100755 packages/Sensio/tests/Rector/FrameworkExtraBundle/TemplateAnnotationRector/Fixture/Version3/fixture4.php.inc mode change 100644 => 100755 packages/Sensio/tests/Rector/FrameworkExtraBundle/TemplateAnnotationRector/Fixture/Version3/skip_just_template.php.inc mode change 100644 => 100755 packages/Sensio/tests/Rector/FrameworkExtraBundle/TemplateAnnotationRector/Fixture/Version5/fixture.php.inc mode change 100644 => 100755 packages/Sensio/tests/Rector/FrameworkExtraBundle/TemplateAnnotationRector/Fixture/Version5/fixture2.php.inc mode change 100644 => 100755 packages/Sensio/tests/Rector/FrameworkExtraBundle/TemplateAnnotationRector/Fixture/Version5/fixture3.php.inc mode change 100644 => 100755 packages/Sensio/tests/Rector/FrameworkExtraBundle/TemplateAnnotationRector/Fixture/Version5/fixture4.php.inc mode change 100644 => 100755 packages/Sensio/tests/Rector/FrameworkExtraBundle/TemplateAnnotationRector/Fixture/Version5/fixture5.php.inc mode change 100644 => 100755 packages/Sensio/tests/Rector/FrameworkExtraBundle/TemplateAnnotationRector/Fixture/Version5/with_route_too.php.inc create mode 100755 packages/Sensio/tests/Rector/FrameworkExtraBundle/TemplateAnnotationRector/Fixture/Version5/without_base_class.php.inc mode change 100644 => 100755 packages/Sensio/tests/Rector/FrameworkExtraBundle/TemplateAnnotationRector/TemplateAnnotationVersion5RectorTest.php diff --git a/packages/Sensio/src/Rector/FrameworkExtraBundle/TemplateAnnotationRector.php b/packages/Sensio/src/Rector/FrameworkExtraBundle/TemplateAnnotationRector.php old mode 100644 new mode 100755 index be2a123439e4..d67e586b001e --- a/packages/Sensio/src/Rector/FrameworkExtraBundle/TemplateAnnotationRector.php +++ b/packages/Sensio/src/Rector/FrameworkExtraBundle/TemplateAnnotationRector.php @@ -8,6 +8,8 @@ use PhpParser\Node\Arg; use PhpParser\Node\Expr\Array_; use PhpParser\Node\Expr\MethodCall; +use PhpParser\Node\Name\FullyQualified; +use PhpParser\Node\Stmt\Class_; use PhpParser\Node\Stmt\ClassMethod; use PhpParser\Node\Stmt\Return_; use Rector\BetterPhpDocParser\PhpDocNode\Sensio\SensioTemplateTagValueNode; @@ -15,6 +17,7 @@ use Rector\RectorDefinition\CodeSample; use Rector\RectorDefinition\RectorDefinition; use Rector\Sensio\Helper\TemplateGuesser; +use Symfony\Bundle\FrameworkBundle\Controller\AbstractController; final class TemplateAnnotationRector extends AbstractRector { @@ -65,7 +68,7 @@ public function indexAction() */ public function getNodeTypes(): array { - return [ClassMethod::class]; + return [ClassMethod::class, Class_::class]; } /** @@ -73,6 +76,10 @@ public function getNodeTypes(): array */ public function refactor(Node $node): ?Node { + if ($node instanceof Class_) { + return $this->addBaseClassIfMissing($node); + } + $phpDocInfo = $this->getPhpDocInfo($node); if ($phpDocInfo === null) { return null; @@ -106,6 +113,17 @@ public function refactor(Node $node): ?Node return $node; } + private function addBaseClassIfMissing(Node $node): ?Node + { + if ($node->extends !== null) { + return null; + } + + $node->extends = new FullyQualified(AbstractController::class); + + return $node; + } + /** * @return Arg[] */ @@ -142,6 +160,7 @@ private function resolveTemplateName( /** * Already existing method call + * * @return Array_[] */ private function resolveArrayArgumentsFromMethodCall(Return_ $returnNode): array diff --git a/packages/Sensio/tests/Rector/FrameworkExtraBundle/TemplateAnnotationRector/Fixture/Version3/fixture.php.inc b/packages/Sensio/tests/Rector/FrameworkExtraBundle/TemplateAnnotationRector/Fixture/Version3/fixture.php.inc old mode 100644 new mode 100755 index 20497cd4278a..c7a5607be133 --- a/packages/Sensio/tests/Rector/FrameworkExtraBundle/TemplateAnnotationRector/Fixture/Version3/fixture.php.inc +++ b/packages/Sensio/tests/Rector/FrameworkExtraBundle/TemplateAnnotationRector/Fixture/Version3/fixture.php.inc @@ -3,8 +3,9 @@ namespace AppBundle\Controller; use Sensio\Bundle\FrameworkExtraBundle\Configuration\Template; +use Symfony\Bundle\FrameworkBundle\Controller\AbstractController; -class ClassWithNamedService13Controller +class ClassWithNamedService13Controller extends AbstractController { /** * @Template @@ -38,8 +39,9 @@ class ClassWithNamedService13Controller namespace AppBundle\Controller; use Sensio\Bundle\FrameworkExtraBundle\Configuration\Template; +use Symfony\Bundle\FrameworkBundle\Controller\AbstractController; -class ClassWithNamedService13Controller +class ClassWithNamedService13Controller extends AbstractController { public function indexAction() { diff --git a/packages/Sensio/tests/Rector/FrameworkExtraBundle/TemplateAnnotationRector/Fixture/Version3/fixture2.php.inc b/packages/Sensio/tests/Rector/FrameworkExtraBundle/TemplateAnnotationRector/Fixture/Version3/fixture2.php.inc old mode 100644 new mode 100755 index a64103cfc604..5bd3dce82410 --- a/packages/Sensio/tests/Rector/FrameworkExtraBundle/TemplateAnnotationRector/Fixture/Version3/fixture2.php.inc +++ b/packages/Sensio/tests/Rector/FrameworkExtraBundle/TemplateAnnotationRector/Fixture/Version3/fixture2.php.inc @@ -3,8 +3,9 @@ namespace AppBundle\Controller; use Sensio\Bundle\FrameworkExtraBundle\Configuration\Template; +use Symfony\Bundle\FrameworkBundle\Controller\AbstractController; -class ClassWithNamedService23Controller +class ClassWithNamedService23Controller extends AbstractController { /** * @Template() @@ -32,8 +33,9 @@ class ClassWithNamedService23Controller namespace AppBundle\Controller; use Sensio\Bundle\FrameworkExtraBundle\Configuration\Template; +use Symfony\Bundle\FrameworkBundle\Controller\AbstractController; -class ClassWithNamedService23Controller +class ClassWithNamedService23Controller extends AbstractController { public function indexAction() { diff --git a/packages/Sensio/tests/Rector/FrameworkExtraBundle/TemplateAnnotationRector/Fixture/Version3/fixture3.php.inc b/packages/Sensio/tests/Rector/FrameworkExtraBundle/TemplateAnnotationRector/Fixture/Version3/fixture3.php.inc old mode 100644 new mode 100755 index 02fb2e999b16..f02ac63c7540 --- a/packages/Sensio/tests/Rector/FrameworkExtraBundle/TemplateAnnotationRector/Fixture/Version3/fixture3.php.inc +++ b/packages/Sensio/tests/Rector/FrameworkExtraBundle/TemplateAnnotationRector/Fixture/Version3/fixture3.php.inc @@ -3,8 +3,9 @@ namespace AppBundle\Controller; use Sensio\Bundle\FrameworkExtraBundle\Configuration\Template; +use Symfony\Bundle\FrameworkBundle\Controller\AbstractController; -class ClassWithNamedService33Controller +class ClassWithNamedService33Controller extends AbstractController { /** * @Template() @@ -38,8 +39,9 @@ class ClassWithNamedService33Controller namespace AppBundle\Controller; use Sensio\Bundle\FrameworkExtraBundle\Configuration\Template; +use Symfony\Bundle\FrameworkBundle\Controller\AbstractController; -class ClassWithNamedService33Controller +class ClassWithNamedService33Controller extends AbstractController { public function indexAction() { diff --git a/packages/Sensio/tests/Rector/FrameworkExtraBundle/TemplateAnnotationRector/Fixture/Version3/fixture4.php.inc b/packages/Sensio/tests/Rector/FrameworkExtraBundle/TemplateAnnotationRector/Fixture/Version3/fixture4.php.inc old mode 100644 new mode 100755 index 44758218807f..39ae1543ea9a --- a/packages/Sensio/tests/Rector/FrameworkExtraBundle/TemplateAnnotationRector/Fixture/Version3/fixture4.php.inc +++ b/packages/Sensio/tests/Rector/FrameworkExtraBundle/TemplateAnnotationRector/Fixture/Version3/fixture4.php.inc @@ -1,8 +1,9 @@ +----- +render('AppBundle:ClassWithNamedService25:index.html.twig'); + } +} + +?> diff --git a/packages/Sensio/tests/Rector/FrameworkExtraBundle/TemplateAnnotationRector/TemplateAnnotationVersion5RectorTest.php b/packages/Sensio/tests/Rector/FrameworkExtraBundle/TemplateAnnotationRector/TemplateAnnotationVersion5RectorTest.php old mode 100644 new mode 100755 index cc8161056b14..04c303408eaa --- a/packages/Sensio/tests/Rector/FrameworkExtraBundle/TemplateAnnotationRector/TemplateAnnotationVersion5RectorTest.php +++ b/packages/Sensio/tests/Rector/FrameworkExtraBundle/TemplateAnnotationRector/TemplateAnnotationVersion5RectorTest.php @@ -27,6 +27,7 @@ public function provideDataForTest(): Iterator yield [__DIR__ . '/Fixture/Version5/fixture5.php.inc']; yield [__DIR__ . '/Fixture/Version5/with_route_too.php.inc']; yield [__DIR__ . '/Fixture/Version5/with_route_options.php.inc']; + yield [__DIR__ . '/Fixture/Version5/without_base_class.php.inc']; } /** From 1b23cb059adb3b6d4812bde7fc5ca0833d55f3b1 Mon Sep 17 00:00:00 2001 From: Stefan Blanke Date: Thu, 31 Oct 2019 10:00:45 +0100 Subject: [PATCH 2/2] Check if class has at least one template annotation --- .../TemplateAnnotationRector.php | 67 +++++++++++++------ .../Version5/skip_without_template.php.inc | 17 +++++ .../TemplateAnnotationVersion5RectorTest.php | 1 + 3 files changed, 65 insertions(+), 20 deletions(-) create mode 100755 packages/Sensio/tests/Rector/FrameworkExtraBundle/TemplateAnnotationRector/Fixture/Version5/skip_without_template.php.inc diff --git a/packages/Sensio/src/Rector/FrameworkExtraBundle/TemplateAnnotationRector.php b/packages/Sensio/src/Rector/FrameworkExtraBundle/TemplateAnnotationRector.php index d67e586b001e..17d5e7c0b78b 100755 --- a/packages/Sensio/src/Rector/FrameworkExtraBundle/TemplateAnnotationRector.php +++ b/packages/Sensio/src/Rector/FrameworkExtraBundle/TemplateAnnotationRector.php @@ -71,16 +71,54 @@ public function getNodeTypes(): array return [ClassMethod::class, Class_::class]; } - /** - * @param ClassMethod $node - */ public function refactor(Node $node): ?Node { if ($node instanceof Class_) { return $this->addBaseClassIfMissing($node); } - $phpDocInfo = $this->getPhpDocInfo($node); + if ($node instanceof ClassMethod) { + return $this->replaceTemplateAnnotation($node); + } + + return null; + } + + private function addBaseClassIfMissing(Class_ $node): ?Node + { + if ($node->extends !== null) { + return null; + } + + if (! $this->classHasTemplateAnnotations($node)) { + return null; + } + + $node->extends = new FullyQualified(AbstractController::class); + + return $node; + } + + private function classHasTemplateAnnotations(Class_ $node): bool + { + foreach ($node->stmts as $stmtNode) { + $phpDocInfo = $this->getPhpDocInfo($stmtNode); + if ($phpDocInfo === null) { + continue; + } + + $templateTagValueNode = $phpDocInfo->getByType(SensioTemplateTagValueNode::class); + if ($templateTagValueNode !== null) { + return true; + } + } + + return false; + } + + private function replaceTemplateAnnotation(ClassMethod $classMethod): ?Node + { + $phpDocInfo = $this->getPhpDocInfo($classMethod); if ($phpDocInfo === null) { return null; } @@ -91,15 +129,15 @@ public function refactor(Node $node): ?Node } /** @var Return_|null $returnNode */ - $returnNode = $this->betterNodeFinder->findLastInstanceOf((array) $node->stmts, Return_::class); + $returnNode = $this->betterNodeFinder->findLastInstanceOf((array) $classMethod->stmts, Return_::class); // create "$this->render('template.file.twig.html', ['key' => 'value']);" method call - $renderArguments = $this->resolveRenderArguments($node, $returnNode, $templateTagValueNode); + $renderArguments = $this->resolveRenderArguments($classMethod, $returnNode, $templateTagValueNode); $thisRenderMethodCall = $this->createMethodCall('this', 'render', $renderArguments); if ($returnNode === null) { // or add as last statement in the method - $node->stmts[] = new Return_($thisRenderMethodCall); + $classMethod->stmts[] = new Return_($thisRenderMethodCall); } // replace Return_ node value if exists and is not already in correct format @@ -108,20 +146,9 @@ public function refactor(Node $node): ?Node } // remove annotation - $this->docBlockManipulator->removeTagFromNode($node, SensioTemplateTagValueNode::class); - - return $node; - } - - private function addBaseClassIfMissing(Node $node): ?Node - { - if ($node->extends !== null) { - return null; - } + $this->docBlockManipulator->removeTagFromNode($classMethod, SensioTemplateTagValueNode::class); - $node->extends = new FullyQualified(AbstractController::class); - - return $node; + return $classMethod; } /** diff --git a/packages/Sensio/tests/Rector/FrameworkExtraBundle/TemplateAnnotationRector/Fixture/Version5/skip_without_template.php.inc b/packages/Sensio/tests/Rector/FrameworkExtraBundle/TemplateAnnotationRector/Fixture/Version5/skip_without_template.php.inc new file mode 100755 index 000000000000..f040793ef3ba --- /dev/null +++ b/packages/Sensio/tests/Rector/FrameworkExtraBundle/TemplateAnnotationRector/Fixture/Version5/skip_without_template.php.inc @@ -0,0 +1,17 @@ +