Rector: @ApiFilter(SearchFilter::class) not recognized

Created on 24 Apr 2020  路  9Comments  路  Source: rectorphp/rector

Bug Report

| Subject | Details |
| :------------- | :---------------------------------------------------------------|
| Rector version | dev-master@112025d |
| Installed as | composer dependency |

Minimal PHP Code Causing Issue

use ApiPlatform\Core\Annotation\ApiFilter;
use ApiPlatform\Core\Bridge\Doctrine\Orm\Filter\SearchFilter;

class Entity
{
    /**
     * @ApiFilter(SearchFilter::class)
     */
    protected $someProperty;
}

When running Rector:

In ApiFilter.php line 61:

[ApiPlatform\Core\Exception\InvalidArgumentException]
The filter class "SearchFilter::class" does not implement "ApiPlatform\Core\Api\FilterInterface". Did you forget a use statement?

However, this works as expected:
/**
* @ApiFilter(ApiPlatform\Core\Bridge\Doctrine\Orm\FilterSearchFilter)
*/

So Rector doesn't recongnize class name resolution via ::class in annotations.

bug

All 9 comments

What exact minimal Rector command do you run?

And rector.yaml if you use it. Again minimal content that is causing this error.

vendor/bin/rector process src/Entity/Entity.php --set=dead-code

I'd like to create a reproducable repo for you, is that the best way? I don't think I can create a PR in this repo because it hasn't got API Platform, or can I?

Exception trace:
  at /home/stephan/project/vendor/api-platform/core/src/Annotation/ApiFilter.php:61
 ApiPlatform\Core\Annotation\ApiFilter->__construct() at /home/stephan/project/vendor/rector/rector/packages/doctrine-annotation-generated/src/ConstantPreservingDocParser.php:600
 Rector\DoctrineAnnotationGenerated\ConstantPreservingDocParser->Annotation() at /home/stephan/project/vendor/rector/rector/packages/doctrine-annotation-generated/src/ConstantPreservingDocParser.php:473
 Rector\DoctrineAnnotationGenerated\ConstantPreservingDocParser->Annotations() at /home/stephan/project/vendor/rector/rector/packages/doctrine-annotation-generated/src/ConstantPreservingDocParser.php:238
 Rector\DoctrineAnnotationGenerated\ConstantPreservingDocParser->parse() at /home/stephan/project/vendor/rector/rector/packages/doctrine-annotation-generated/src/ConstantPreservingAnnotationReader.php:258
 Rector\DoctrineAnnotationGenerated\ConstantPreservingAnnotationReader->getPropertyAnnotations() at /home/stephan/project/vendor/rector/rector/packages/doctrine-annotation-generated/src/ConstantPreservingAnnotationReader.php:265
 Rector\DoctrineAnnotationGenerated\ConstantPreservingAnnotationReader->getPropertyAnnotation() at /home/stephan/project/vendor/rector/rector/packages/better-php-doc-parser/src/AnnotationReader/NodeAnnotationReader.php:103
 Rector\BetterPhpDocParser\AnnotationReader\NodeAnnotationReader->readPropertyAnnotation() at /home/stephan/project/vendor/rector/rector/packages/better-php-doc-parser/src/PhpDocNodeFactory/Doctrine/Property_/ManyToOnePhpDocNodeFactory.php:32
 Rector\BetterPhpDocParser\PhpDocNodeFactory\Doctrine\Property_\ManyToOnePhpDocNodeFactory->createFromNodeAndTokens() at /home/stephan/project/vendor/rector/rector/packages/better-php-doc-parser/src/PhpDocParser/BetterPhpDocParser.php:195
 Rector\BetterPhpDocParser\PhpDocParser\BetterPhpDocParser->parseTagValue() at /home/stephan/project/vendor/rector/rector/packages/better-php-doc-parser/src/PhpDocParser/BetterPhpDocParser.php:169
 Rector\BetterPhpDocParser\PhpDocParser\BetterPhpDocParser->parseTag() at /home/stephan/project/vendor/phpstan/phpdoc-parser/src/Parser/PhpDocParser.php:54
 PHPStan\PhpDocParser\Parser\PhpDocParser->parseChild() at n/a:n/a
 ReflectionMethod->invoke() at /home/stephan/project/vendor/symplify/package-builder/src/Reflection/PrivatesCaller.php:24
 Symplify\PackageBuilder\Reflection\PrivatesCaller->callPrivateMethod() at /home/stephan/project/vendor/rector/rector/packages/better-php-doc-parser/src/PhpDocParser/BetterPhpDocParser.php:218
 Rector\BetterPhpDocParser\PhpDocParser\BetterPhpDocParser->parseChildAndStoreItsPositions() at /home/stephan/project/vendor/rector/rector/packages/better-php-doc-parser/src/PhpDocParser/BetterPhpDocParser.php:144
 Rector\BetterPhpDocParser\PhpDocParser\BetterPhpDocParser->parse() at /home/stephan/project/vendor/rector/rector/packages/better-php-doc-parser/src/PhpDocInfo/PhpDocInfoFactory.php:141
 Rector\BetterPhpDocParser\PhpDocInfo\PhpDocInfoFactory->parseTokensToPhpDocNode() at /home/stephan/project/vendor/rector/rector/packages/better-php-doc-parser/src/PhpDocInfo/PhpDocInfoFactory.php:95
 Rector\BetterPhpDocParser\PhpDocInfo\PhpDocInfoFactory->createFromNode() at /home/stephan/project/vendor/rector/rector/packages/node-type-resolver/src/NodeVisitor/PhpDocInfoNodeVisitor.php:29
 Rector\NodeTypeResolver\NodeVisitor\PhpDocInfoNodeVisitor->enterNode() at /home/stephan/project/vendor/nikic/php-parser/lib/PhpParser/NodeTraverser.php:200
 PhpParser\NodeTraverser->traverseArray() at /home/stephan/project/vendor/nikic/php-parser/lib/PhpParser/NodeTraverser.php:114
 PhpParser\NodeTraverser->traverseNode() at /home/stephan/project/vendor/nikic/php-parser/lib/PhpParser/NodeTraverser.php:223
 PhpParser\NodeTraverser->traverseArray() at /home/stephan/project/vendor/nikic/php-parser/lib/PhpParser/NodeTraverser.php:114
 PhpParser\NodeTraverser->traverseNode() at /home/stephan/project/vendor/nikic/php-parser/lib/PhpParser/NodeTraverser.php:223
 PhpParser\NodeTraverser->traverseArray() at /home/stephan/project/vendor/nikic/php-parser/lib/PhpParser/NodeTraverser.php:91
 PhpParser\NodeTraverser->traverse() at /home/stephan/project/vendor/rector/rector/packages/node-type-resolver/src/NodeScopeAndMetadataDecorator.php:144
 Rector\NodeTypeResolver\NodeScopeAndMetadataDecorator->decorateNodesFromFile() at /home/stephan/project/vendor/rector/rector/src/Application/FileProcessor.php:166
 Rector\Core\Application\FileProcessor->parseAndTraverseFileInfoToNodes() at /home/stephan/project/vendor/rector/rector/src/Application/FileProcessor.php:103
 Rector\Core\Application\FileProcessor->parseFileInfoToLocalCache() at /home/stephan/project/vendor/rector/rector/src/Application/RectorApplication.php:135
 Rector\Core\Application\RectorApplication->Rector\Core\Application\{closure}() at /home/stephan/project/vendor/rector/rector/src/Application/RectorApplication.php:210
 Rector\Core\Application\RectorApplication->tryCatchWrapper() at /home/stephan/project/vendor/rector/rector/src/Application/RectorApplication.php:136
 Rector\Core\Application\RectorApplication->runOnFileInfos() at /home/stephan/project/vendor/rector/rector/src/Console/Command/ProcessCommand.php:242
 Rector\Core\Console\Command\ProcessCommand->execute() at /home/stephan/project/vendor/symfony/console/Command/Command.php:255
 Symfony\Component\Console\Command\Command->run() at /home/stephan/project/vendor/rector/rector/src/Console/Command/AbstractCommand.php:34
 Rector\Core\Console\Command\AbstractCommand->run() at /home/stephan/project/vendor/symfony/console/Application.php:912
 Symfony\Component\Console\Application->doRunCommand() at /home/stephan/project/vendor/symfony/console/Application.php:264
 Symfony\Component\Console\Application->doRun() at /home/stephan/project/vendor/rector/rector/src/Console/Application.php:94
 Rector\Core\Console\Application->doRun() at /home/stephan/project/vendor/symfony/console/Application.php:140
 Symfony\Component\Console\Application->run() at /home/stephan/project/vendor/rector/rector/bin/rector:53

I'd like to create a reproducable repo for you, is that the best way?

That would be awesome :+1:

I'll do! I hope ApiPlatform/demo would help me out.

https://github.com/stephanvierkant/demo/tree/rector

cd api
vendor/bin/rector process src/Entity/ --set dead-code

Thanks, I'll look into it

Step to Install

git clone [email protected]:stephanvierkant/demo.git
cd demo/api

# took me while to figure out master is not the branch :(
git checkout rector

composer install

# works!
vendor/bin/rector


Minimal code causing the fail

<?php

namespace App\Entity;

use ApiPlatform\Core\Annotation\ApiFilter;
use ApiPlatform\Core\Bridge\Doctrine\Orm\Filter\SearchFilter;
use Doctrine\ORM\Mapping as ORM;

class Book
{
    /**
     * @ApiFilter(SearchFilter::class)
     * @ORM\Column
     */
    public $title;
}

Looks like ConstantPreservingAnnotationReader (fails) is somehow different from AnnotationReader (works)

  • FQN of class where this can be found: Rector\BetterPhpDocParser\AnnotationReader\AnnotationReaderFactory

Uff, few hours later... issue is located.

See failing test case #3275

Was this page helpful?
0 / 5 - 0 ratings