Skip to content

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

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

    Fields

    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions