Skip to content

Changing PHPDoc with phpdoc return typehint duplicates Annotation #7020

@shyim

Description

@shyim

Bug Report

Subject Details
Rector version bc0eac3

Minimal PHP Code Causing Issue

Code

<?php

use Shopware\Core\Framework\Context;
use Shopware\Core\Framework\Routing\Annotation\Since;
use Symfony\Component\HttpFoundation\JsonResponse;
use Symfony\Component\Routing\Annotation\Route;

class Test {
    /**
     * @Since("6.4.0.1")
     * @Route("/api/_admin/reset-excluded-search-term", name="api.admin.reset-excluded-search-term", methods={"POST"})
     *
     * @return JsonResponse
     */
    public function resetExcludedSearchTerm(Context $context)
    {

    }
}

Rector

<?php

namespace Shopware\Core\DevOps\Rector;

use PhpParser\Node;
use PhpParser\Node\Stmt\ClassMethod;
use Rector\BetterPhpDocParser\PhpDocInfo\PhpDocInfo;
use Rector\BetterPhpDocParser\PhpDocManipulator\PhpDocTagRemover;
use Rector\BetterPhpDocParser\ValueObject\PhpDoc\DoctrineAnnotation\CurlyListNode;
use Rector\Core\Rector\AbstractRector;
use Rector\Php80\NodeFactory\AttrGroupsFactory;
use Symplify\RuleDocGenerator\ValueObject\RuleDefinition;

class TestRector extends AbstractRector
{
    public function __construct(
        private AttrGroupsFactory $attrGroupsFactory,
        private PhpDocTagRemover $phpDocTagRemover,
    ) {
    }

    public function getRuleDefinition(): RuleDefinition
    {
        return new RuleDefinition('uff', []);
    }

    public function getNodeTypes(): array
    {
        return [
            ClassMethod::class,
        ];
    }

    public function refactor(Node $node)
    {
        $phpDocInfo = $this->phpDocInfoFactory->createFromNode($node);
        if (!$phpDocInfo instanceof PhpDocInfo) {
            return null;
        }

        $route = $phpDocInfo->getByName('Route');

        $defaults = $route->value->getValue('defaults');

        if ($defaults === null) {
            $defaults = new CurlyListNode();
        }

        $route->value->changeValue('defaults', $defaults);
    }
}

Expected Behaviour

The route just gets an additional "defaults" and not be duplicated

1) class.php:7

    ---------- begin diff ----------
@@ @@
 class Test {
     /**
      * @Since("6.4.0.1")
+     * @Route("/api/_admin/reset-excluded-search-term", name="api.admin.reset-excluded-search-term", methods={"POST"}, defaults={})
      * @Route("/api/_admin/reset-excluded-search-term", name="api.admin.reset-excluded-search-term", methods={"POST"})
      *
      * @return JsonResponse
    ----------- end diff -----------

                                                                                                                        
 [OK] 1 file would have changed (dry-run) by Rector                                                                     
                                                                                                                        

Metadata

Metadata

Assignees

No one assigned

    Labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions