Skip to content

Error when removing a MethodCall node, in a custom rule #8375

@nikophil

Description

@nikophil

Bug Report

Subject Details
Rector version Rector 0.18.13

Hello,

I'm trying to remove a node with a custom rector rule, I've checked what is done in RemoveFuncCallRector.

The node I want to remove is a simple method call:

$this->something();

I'm basically returning NodeTraverser::REMOVE_NODE from refactor() method.

And I got the following error:

 [ERROR] Could not process                                                                                              
         "tests/Domain/Program/Availability/ProgrammingsSpecification/AvailableScreensSpecificationTest.php" file, due  
         to:                                                                                                            
         "System error: "leaveNode() returned invalid value of type integer"                                            
                                                                                                                        
         Stack trace:                                                                                                   
         #0 vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/NodeTraverser.php(196):                          
         PhpParser\NodeTraverser->traverseNode()                                                                        
         #1 vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/NodeTraverser.php(105):                          
         PhpParser\NodeTraverser->traverseArray()                                                                       
         #2 vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/NodeTraverser.php(196):                          
         PhpParser\NodeTraverser->traverseNode()                                                                        
         #3 vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/NodeTraverser.php(105):                          
         PhpParser\NodeTraverser->traverseArray()                                                                       
         #4 vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/NodeTraverser.php(196):                          
         PhpParser\NodeTraverser->traverseNode()                                                                        
         #5 vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/NodeTraverser.php(105):                          
         PhpParser\NodeTraverser->traverseArray()                                                                       
         #6 vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/NodeTraverser.php(196):                          
         PhpParser\NodeTraverser->traverseNode()                                                                        
         #7 vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/NodeTraverser.php(85):                           
         PhpParser\NodeTraverser->traverseArray()                                                                       
         #8 vendor/rector/rector/src/PhpParser/NodeTraverser/RectorNodeTraverser.php(50):                               
         PhpParser\NodeTraverser->traverse()                                                                            
         #9 vendor/rector/rector/src/Application/FileProcessor.php(116):                                                
         Rector\Core\PhpParser\NodeTraverser\RectorNodeTraverser->traverse()                                            
         #10 vendor/rector/rector/src/Application/ApplicationFileProcessor.php(177):                                    
         Rector\Core\Application\FileProcessor->processFile()                                                           
         #11 vendor/rector/rector/src/Application/ApplicationFileProcessor.php(153):                                    
         Rector\Core\Application\ApplicationFileProcessor->processFile()                                                
         #12 vendor/rector/rector/src/Console/Command/WorkerCommand.php(132):                                           
         Rector\Core\Application\ApplicationFileProcessor->processFiles()                                               
         #13 vendor/rector/rector/vendor/evenement/evenement/src/EventEmitterTrait.php(111):                            
         Rector\Core\Console\Command\WorkerCommand->Rector\Core\Console\Command\{closure}()                             
         #14 vendor/rector/rector/vendor/clue/ndjson-react/src/Decoder.php(117):                                        
         RectorPrefix202312\Evenement\EventEmitter->emit()                                                              
         #15 vendor/rector/rector/vendor/evenement/evenement/src/EventEmitterTrait.php(111):                            
         RectorPrefix202312\Clue\React\NDJson\Decoder->handleData()                                                     
         #16 vendor/rector/rector/vendor/react/stream/src/Util.php(62):                                                 
         RectorPrefix202312\Evenement\EventEmitter->emit()                                                              
         #17 vendor/rector/rector/vendor/evenement/evenement/src/EventEmitterTrait.php(111):                            
         RectorPrefix202312\React\Stream\Util::RectorPrefix202312\React\Stream\{closure}()                              
         #18 vendor/rector/rector/vendor/react/stream/src/DuplexResourceStream.php(154):                                
         RectorPrefix202312\Evenement\EventEmitter->emit()                                                              
         #19 vendor/rector/rector/vendor/react/event-loop/src/StreamSelectLoop.php(201):                                
         RectorPrefix202312\React\Stream\DuplexResourceStream->handleData()                                             
         #20 vendor/rector/rector/vendor/react/event-loop/src/StreamSelectLoop.php(173):                                
         RectorPrefix202312\React\EventLoop\StreamSelectLoop->waitForStreamActivity()                                   
         #21 vendor/rector/rector/src/Console/Command/WorkerCommand.php(90):                                            
         RectorPrefix202312\React\EventLoop\StreamSelectLoop->run()                                                     
         #22 vendor/rector/rector/vendor/symfony/console/Command/Command.php(327):                                      
         Rector\Core\Console\Command\WorkerCommand->execute()                                                           
         #23 vendor/rector/rector/vendor/symfony/console/Application.php(960):                                          
         RectorPrefix202312\Symfony\Component\Console\Command\Command->run()                                            
         #24 vendor/rector/rector/vendor/symfony/console/Application.php(333):                                          
         RectorPrefix202312\Symfony\Component\Console\Application->doRunCommand()                                       
         #25 vendor/rector/rector/src/Console/ConsoleApplication.php(53):                                               
         RectorPrefix202312\Symfony\Component\Console\Application->doRun()                                              
         #26 vendor/rector/rector/vendor/symfony/console/Application.php(216):                                          
         Rector\Core\Console\ConsoleApplication->doRun()                                                                
         #27 vendor/rector/rector/bin/rector.php(129): RectorPrefix202312\Symfony\Component\Console\Application->run()  
         #28 vendor/rector/rector/bin/rector(5): require_once('...')                                                    
         #29 vendor/bin/rector(119): include('...')                                                                     
         #30 {main}". On line: 150                                                         

Minimal PHP Code Causing Issue

final class MyRectorRule extends AbstractRector
{
    public function getNodeTypes(): array
    {
        return [Node\Expr\MethodCall::class];
    }

    /**
     * @param Node\Expr\MethodCall $node
     */
    public function refactor(Node $node): Node|int|null
    {
        if (/** some condition **/) {
            return NodeTraverser::REMOVE_NODE;
        }

        return null;
    }

I'm 100% sure my condition here is good, and I can see thanks to print_node() that I'm targetting the right node

Expected Behaviour

no error, and the node removed 😁

Thanks for your answer and your awesome tool!

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