| Subject | Details |
| :------------- | :---------------------------------------------------------------|
| Rector version | dev-master@112025d |
| Installed as | composer dependency |
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.
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
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
<?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)
Rector\BetterPhpDocParser\AnnotationReader\AnnotationReaderFactoryUff, few hours later... issue is located.
See failing test case #3275