Skip to content

Incorrect behavior of AnnotationToAttributeRector #9120

@mvhirsch

Description

@mvhirsch

Bug Report

Subject Details
Rector version 2.0.11
PHPUnit version 10.5.45
Installed as composer dependency

Minimal PHP Code Causing Issue

See https://getrector.com/demo/d45106cc-fb9d-4188-8a67-b8aa0bcefe63

<?php

final class DemoFile
{
    /**
     * @test
     * @testdox ::property is true
     */
    public function myAwesomeTest(): void
    {
        self::assertTrue(true);
    }
}

Responsible rules

  • AnnotationToAttributeRector

Actual Behavior

I face this error:

symfony php vendor/bin/rector process /path/to/project/tests/PHPUnitLegacy/Entity/EpisodeTest.php --debug
[ERROR] Could not process "/path/to/project/tests/PHPUnitLegacy/Entity/EpisodeTest.php" file, due to:     
         "System error: "Name cannot be empty"                                                                          
                                                                                                                        
         Stack trace:                                                                                                   
         #0 vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/Node/Name.php(25):                               
         PhpParser\Node\Name::prepareName()                                                                             
         #1                                                                                                             
         vendor/rector/rector/src/PhpAttribute/AnnotationToAttributeMapper/ClassConstFetchAnnotationToAttributeMapper.ph
         p(34): PhpParser\Node\Name->__construct()                                                                      
         #2 vendor/rector/rector/src/PhpAttribute/AnnotationToAttributeMapper.php(42):                                  
         Rector\PhpAttribute\AnnotationToAttributeMapper\ClassConstFetchAnnotationToAttributeMapper->map()              
         #3 vendor/rector/rector/src/PhpAttribute/AnnotationToAttributeMapper/ArrayAnnotationToAttributeMapper.php(49): 
         Rector\PhpAttribute\AnnotationToAttributeMapper->map()                                                         
         #4 vendor/rector/rector/src/PhpAttribute/AnnotationToAttributeMapper.php(42):                                  
         Rector\PhpAttribute\AnnotationToAttributeMapper\ArrayAnnotationToAttributeMapper->map()                        
         #5 vendor/rector/rector/src/PhpAttribute/NodeFactory/PhpAttributeGroupFactory.php(115):                        
         Rector\PhpAttribute\AnnotationToAttributeMapper->map()                                                         
         #6 vendor/rector/rector/src/PhpAttribute/NodeFactory/PhpAttributeGroupFactory.php(80):                         
         Rector\PhpAttribute\NodeFactory\PhpAttributeGroupFactory->createArgsFromItems()                                
         #7                                                                                                             
         vendor/rector/rector/vendor/rector/rector-phpunit/rules/AnnotationsToAttributes/Rector/Class_/AnnotationWithVal
         ueToAttributeRector.php(117):                                                                                  
         Rector\PhpAttribute\NodeFactory\PhpAttributeGroupFactory->createFromClassWithItems()                           
         #8 vendor/rector/rector/src/Rector/AbstractRector.php(112):                                                    
         Rector\PHPUnit\AnnotationsToAttributes\Rector\Class_\AnnotationWithValueToAttributeRector->refactor()          
         #9 vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/NodeTraverser.php(173):                          
         Rector\Rector\AbstractRector->enterNode()                                                                      
         #10 vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/NodeTraverser.php(90):                          
         PhpParser\NodeTraverser->traverseArray()                                                                       
         #11 vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/NodeTraverser.php(200):                         
         PhpParser\NodeTraverser->traverseNode()                                                                        
         #12 vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/NodeTraverser.php(90):                          
         PhpParser\NodeTraverser->traverseArray()                                                                       
         #13 vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/NodeTraverser.php(200):                         
         PhpParser\NodeTraverser->traverseNode()                                                                        
         #14 vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/NodeTraverser.php(71):                          
         PhpParser\NodeTraverser->traverseArray()                                                                       
         #15 vendor/rector/rector/src/PhpParser/NodeTraverser/RectorNodeTraverser.php(49):                              
         PhpParser\NodeTraverser->traverse()                                                                            
         #16 vendor/rector/rector/src/Application/FileProcessor.php(95):                                                
         Rector\PhpParser\NodeTraverser\RectorNodeTraverser->traverse()                                                 
         #17 vendor/rector/rector/src/Application/ApplicationFileProcessor.php(174):                                    
         Rector\Application\FileProcessor->processFile()                                                                
         #18 vendor/rector/rector/src/Application/ApplicationFileProcessor.php(151):                                    
         Rector\Application\ApplicationFileProcessor->processFile()                                                     
         #19 vendor/rector/rector/src/Application/ApplicationFileProcessor.php(128):                                    
         Rector\Application\ApplicationFileProcessor->processFiles()                                                    
         #20 vendor/rector/rector/src/Console/Command/ProcessCommand.php(167):                                          
         Rector\Application\ApplicationFileProcessor->run()                                                             
         #21 vendor/rector/rector/vendor/symfony/console/Command/Command.php(285):                                      
         Rector\Console\Command\ProcessCommand->execute()                                                               
         #22 vendor/rector/rector/vendor/symfony/console/Application.php(900):                                          
         RectorPrefix202503\Symfony\Component\Console\Command\Command->run()                                            
         #23 vendor/rector/rector/vendor/symfony/console/Application.php(279):                                          
         RectorPrefix202503\Symfony\Component\Console\Application->doRunCommand()                                       
         #24 vendor/rector/rector/src/Console/ConsoleApplication.php(53):                                               
         RectorPrefix202503\Symfony\Component\Console\Application->doRun()                                              
         #25 vendor/rector/rector/vendor/symfony/console/Application.php(162):                                          
         Rector\Console\ConsoleApplication->doRun()                                                                     
         #26 vendor/rector/rector/bin/rector.php(130): RectorPrefix202503\Symfony\Component\Console\Application->run()  
         #27 vendor/rector/rector/bin/rector(5): require_once('...')                                                    
         #28 vendor/bin/rector(119): include('...')                                                                     
         #29 {main}". On line: 243                                 

Expected Behavior

<?php

final class DemoFile
{
    #[\PHPUnit\Framework\Attributes\Test]
    #[\PHPUnit\Framework\Attributes\TestDox('::property is true')]
    public function myAwesomeTest(): void
    {
        self::assertTrue(true);
    }
}

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