Skip to content

Could not process file with anonymous class and phpmd SupressWarnings annotation #7398

@Magiczne

Description

@Magiczne

Bug Report

Subject Details
Rector version 0.14.0

When running rector on fairly complex Laravel project it crashes when using importNames() option on files with anonymouse migration classes.

After some digging I've found that it is related to the @SupressWarnings annotation for phpmd placed in the docblock and extends clause to the anonymous class.

Minimal PHP Code Causing Issue

https://getrector.org/demo/7c707108-2446-4131-840c-06902b157199

Hovewer the error differs from the error that I found in the rector output:

[ERROR] Could not process "database/migrations/2021_10_11_200031_create_tagging_tagged.php" file, due to:
         "System error: "Undefined array key "AnonymousClass74d2a512287fe15ba1fc9f5f8e6c8dd5""

         Stack trace:
         #0 C:\project\vendor\laravel\framework\src\Illuminate\Foundation\Bootstrap\HandleExceptions.php(257):
         Illuminate\Foundation\Bootstrap\HandleExceptions->handleError(2, 'Undefined array...', 'C:\\laragon\\www\\...', 234)
#1
         C:\project\vendor\rector\rector\vendor\nette\utils\src\Utils\Reflection.php(234):
         Illuminate\Foundation\Bootstrap\HandleExceptions->Illuminate\Foundation\Bootstrap\{closure}(2, 'Undefined array...',
         'C:\\laragon\\www\\...', 234)
#2
         C:\project\vendor\rector\rector\vendor\nette\utils\src\Utils\Reflection.php(208):
         RectorPrefix202208\Nette\Utils\Reflection::getUseStatements(Object(PHPStan\BetterReflection\Reflection\Adapter\Reflectio
         nClass))
#3 C:\project\vendor\rector\rector\rules\CodingStyle\ClassNameImport\ShortNameResolver.php(214):
         RectorPrefix202208\Nette\Utils\Reflection::expandClassName('SuppressWarning...',
         Object(PHPStan\BetterReflection\Reflection\Adapter\ReflectionClass))
#4
         C:\project\vendor\rector\rector\rules\CodingStyle\ClassNameImport\ShortNameResolver.php(185):
         Rector\CodingStyle\ClassNameImport\ShortNameResolver->fqnizeShortNames(Array,
         Object(PHPStan\BetterReflection\Reflection\Adapter\ReflectionClass), Array)
#5
         C:\project\vendor\rector\rector\rules\CodingStyle\ClassNameImport\ShortNameResolver.php(150):
         Rector\CodingStyle\ClassNameImport\ShortNameResolver->resolveFromStmtsDocBlocks(Array)
#6
         C:\project\vendor\rector\rector\rules\CodingStyle\ClassNameImport\ShortNameResolver.php(96):
         Rector\CodingStyle\ClassNameImport\ShortNameResolver->resolveForStmts(Array)
#7
         C:\project\vendor\rector\rector\rules\CodingStyle\ClassNameImport\ClassNameImportSkipVoter\FullyQualified
         NameClassNameImportSkipVoter.php(35):
         Rector\CodingStyle\ClassNameImport\ShortNameResolver->resolveFromFile(Object(Rector\Core\ValueObject\Application\File))

#8 C:\project\vendor\rector\rector\rules\CodingStyle\ClassNameImport\ClassNameImportSkipper.php(37):
         Rector\CodingStyle\ClassNameImport\ClassNameImportSkipVoter\FullyQualifiedNameClassNameImportSkipVoter->shouldSkip(Obje
         ct(Rector\Core\ValueObject\Application\File), Object(Rector\StaticTypeMapper\ValueObject\Type\FullyQualifiedObjectType),
         Object(PhpParser\Node\Name\FullyQualified))
#9
         C:\project\vendor\rector\rector\rules\CodingStyle\Node\NameImporter.php(118):
         Rector\CodingStyle\ClassNameImport\ClassNameImportSkipper->shouldSkipNameForFullyQualifiedObjectType(Object(Rector\Core
         \ValueObject\Application\File), Object(PhpParser\Node\Name\FullyQualified),
         Object(Rector\StaticTypeMapper\ValueObject\Type\FullyQualifiedObjectType))
#10
         C:\project\vendor\rector\rector\rules\CodingStyle\Node\NameImporter.php(86):
         Rector\CodingStyle\Node\NameImporter->importNameAndCollectNewUseStatement(Object(Rector\Core\ValueObject\Application\Fi
         le), Object(PhpParser\Node\Name\FullyQualified),
         Object(Rector\StaticTypeMapper\ValueObject\Type\FullyQualifiedObjectType), 'Illuminate\\Data...')
#11
         C:\project\vendor\rector\rector\packages\PostRector\Rector\NameImportingPostRector.php(131):
         Rector\CodingStyle\Node\NameImporter->importName(Object(PhpParser\Node\Name\FullyQualified),
         Object(Rector\Core\ValueObject\Application\File), Array)
#12
         C:\project\vendor\rector\rector\packages\PostRector\Rector\NameImportingPostRector.php(87):
         Rector\PostRector\Rector\NameImportingPostRector->processNodeName(Object(PhpParser\Node\Name\FullyQualified),
         Object(Rector\Core\ValueObject\Application\File))
#13
         C:\project\vendor\rector\rector\vendor\nikic\php-parser\lib\PhpParser\NodeTraverser.php(113):
         Rector\PostRector\Rector\NameImportingPostRector->enterNode(Object(PhpParser\Node\Name\FullyQualified))
#14
         C:\project\vendor\rector\rector\vendor\nikic\php-parser\lib\PhpParser\NodeTraverser.php(133):
         PhpParser\NodeTraverser->traverseNode(Object(PhpParser\Node\Stmt\Class_))
#15
         C:\project\vendor\rector\rector\vendor\nikic\php-parser\lib\PhpParser\NodeTraverser.php(133):
         PhpParser\NodeTraverser->traverseNode(Object(PhpParser\Node\Expr\New_))
#16
         C:\project\vendor\rector\rector\vendor\nikic\php-parser\lib\PhpParser\NodeTraverser.php(196):
         PhpParser\NodeTraverser->traverseNode(Object(PhpParser\Node\Stmt\Return_))
#17
         C:\project\vendor\rector\rector\vendor\nikic\php-parser\lib\PhpParser\NodeTraverser.php(105):
         PhpParser\NodeTraverser->traverseArray(Array)
#18
         C:\project\vendor\rector\rector\vendor\nikic\php-parser\lib\PhpParser\NodeTraverser.php(196):
         PhpParser\NodeTraverser->traverseNode(Object(Rector\Core\PhpParser\Node\CustomNode\FileWithoutNamespace))
#19
         C:\project\vendor\rector\rector\vendor\nikic\php-parser\lib\PhpParser\NodeTraverser.php(85):
         PhpParser\NodeTraverser->traverseArray(Array)
#20
         C:\project\vendor\rector\rector\packages\PostRector\Application\PostFileProcessor.php(58):
         PhpParser\NodeTraverser->traverse(Array)
#21
         C:\project\vendor\rector\rector\src\Application\FileProcessor\PhpFileProcessor.php(95):
         Rector\PostRector\Application\PostFileProcessor->traverse(Array)
#22
         C:\project\vendor\rector\rector\packages\Parallel\WorkerRunner.php(99):
         Rector\Core\Application\FileProcessor\PhpFileProcessor->process(Object(Rector\Core\ValueObject\Application\File),
         Object(Rector\Core\ValueObject\Configuration))
#23
         C:\project\vendor\rector\rector\vendor\evenement\evenement\src\Evenement\EventEmitterTrait.php(97):
         Rector\Parallel\WorkerRunner->Rector\Parallel\{closure}(Array)
#24
         C:\project\vendor\rector\rector\vendor\clue\ndjson-react\src\Decoder.php(110):
         RectorPrefix202208\Evenement\EventEmitter->emit('data', Array)
#25
         C:\project\vendor\rector\rector\vendor\evenement\evenement\src\Evenement\EventEmitterTrait.php(97):
         RectorPrefix202208\Clue\React\NDJson\Decoder->handleData(Array)
#26
         C:\project\vendor\rector\rector\vendor\react\stream\src\Util.php(62):
         RectorPrefix202208\Evenement\EventEmitter->emit('data', Array)
#27
         C:\project\vendor\rector\rector\vendor\evenement\evenement\src\Evenement\EventEmitterTrait.php(97):
         RectorPrefix202208\React\Stream\Util::RectorPrefix202208\React\Stream\{closure}('{"action":"main...')
#28
         C:\project\vendor\rector\rector\vendor\react\stream\src\DuplexResourceStream.php(154):
         RectorPrefix202208\Evenement\EventEmitter->emit('data', Array)
#29
         C:\project\vendor\rector\rector\vendor\react\event-loop\src\StreamSelectLoop.php(201):
         RectorPrefix202208\React\Stream\DuplexResourceStream->handleData(Resource id #3825)
#30
         C:\project\vendor\rector\rector\vendor\react\event-loop\src\StreamSelectLoop.php(173):
         RectorPrefix202208\React\EventLoop\StreamSelectLoop->waitForStreamActivity(NULL)
#31
         C:\project\vendor\rector\rector\src\Console\Command\WorkerCommand.php(63):
         RectorPrefix202208\React\EventLoop\StreamSelectLoop->run()
#32
         C:\project\vendor\rector\rector\vendor\symfony\console\Command\Command.php(307):
         Rector\Core\Console\Command\WorkerCommand->execute(Object(RectorPrefix202208\Symfony\Component\Console\Input\ArgvInput)
         , Object(RectorPrefix202208\Symfony\Component\Console\Output\ConsoleOutput))
#33
         C:\project\vendor\rector\rector\vendor\symfony\console\Application.php(891):
         RectorPrefix202208\Symfony\Component\Console\Command\Command->run(Object(RectorPrefix202208\Symfony\Component\Console\I
         nput\ArgvInput), Object(RectorPrefix202208\Symfony\Component\Console\Output\ConsoleOutput))
#34
         C:\project\vendor\rector\rector\vendor\symfony\console\Application.php(310):
         RectorPrefix202208\Symfony\Component\Console\Application->doRunCommand(Object(Rector\Core\Console\Command\WorkerCommand
         ), Object(RectorPrefix202208\Symfony\Component\Console\Input\ArgvInput),
         Object(RectorPrefix202208\Symfony\Component\Console\Output\ConsoleOutput))
#35
         C:\project\vendor\rector\rector\src\Console\ConsoleApplication.php(49):
         RectorPrefix202208\Symfony\Component\Console\Application->doRun(Object(RectorPrefix202208\Symfony\Component\Console\Inp
         ut\ArgvInput), Object(RectorPrefix202208\Symfony\Component\Console\Output\ConsoleOutput))
#36
         C:\project\vendor\rector\rector\vendor\symfony\console\Application.php(208):
         Rector\Core\Console\ConsoleApplication->doRun(Object(RectorPrefix202208\Symfony\Component\Console\Input\ArgvInput),
         Object(RectorPrefix202208\Symfony\Component\Console\Output\ConsoleOutput))
#37
         C:\project\vendor\rector\rector\bin\rector.php(128):
         RectorPrefix202208\Symfony\Component\Console\Application->run()
#38
         C:\project\vendor\rector\rector\bin\rector(5): require_once('C:\\project\\...')
#39 {main}". On
         line: 234

Expected Behaviour

The phpmdm supress annotation should not make rector crash.

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