rectorphp / rector

Instant Upgrades and Automated Refactoring of any PHP 5.3+ code
https://getrector.com
MIT License
8.32k stars 670 forks source link

Call to a member function mapToPhpParserNode() on null #8600

Closed LVMade01 closed 1 month ago

LVMade01 commented 1 month ago

Bug Report

A file can't be scanned. Rector crashes. The error "Call to a member function mapToPhpParserNode() on null" is thrown and the file is not processed

Subject Details
Rector version v1.0.4

When running with --debug the error is:

[ERROR] Could not process "/Users/xxx/projects/am-backend/app/JsonApi/Client.php" file, due to:
"System error: "Call to a member function mapToPhpParserNode() on null"

     Stack trace:                                                                                                   
     #0 vendor/rector/rector/src/PHPStanStaticTypeMapper/PHPStanStaticTypeMapper.php(50):                           
     Rector\PHPStanStaticTypeMapper\TypeMapper\ConditionalTypeMapper->mapToPhpParserNode(Object(PHPStan\Type\MixedT 
     ype), 'return')                                                                                                
     #1 vendor/rector/rector/src/StaticTypeMapper/StaticTypeMapper.php(68):                                         
     Rector\PHPStanStaticTypeMapper\PHPStanStaticTypeMapper->mapToPhpParserNode(Object(PHPStan\Type\ConditionalType 
     ), 'return')                                                                                                   
     #2 vendor/rector/rector/rules/TypeDeclaration/TypeAnalyzer/ReturnStrictTypeAnalyzer.php(118):                  
     Rector\StaticTypeMapper\StaticTypeMapper->mapPHPStanTypeToPhpParserNode(Object(PHPStan\Type\ConditionalType),  
     'return')                                                                                                      
     #3 vendor/rector/rector/rules/TypeDeclaration/TypeAnalyzer/ReturnStrictTypeAnalyzer.php(73):                   
     Rector\TypeDeclaration\TypeAnalyzer\ReturnStrictTypeAnalyzer->resolveMethodCallReturnNode(Object(PhpParser\Nod 
     e\Expr\StaticCall))                                                                                            
     #4 vendor/rector/rector/rules/TypeDeclaration/Rector/ClassMethod/ReturnTypeFromStrictTypedCallRector.php(127): 
     Rector\TypeDeclaration\TypeAnalyzer\ReturnStrictTypeAnalyzer->collectStrictReturnTypes(Array,                  
     Object(PHPStan\Analyser\MutatingScope))                                                                        
     #5 vendor/rector/rector/src/Rector/AbstractScopeAwareRector.php(27):                                           
     Rector\TypeDeclaration\Rector\ClassMethod\ReturnTypeFromStrictTypedCallRector->refactorWithScope(Object(PhpPar 
     ser\Node\Stmt\ClassMethod), Object(PHPStan\Analyser\MutatingScope))                                            
     #6 vendor/rector/rector/src/Rector/AbstractRector.php(136):                                                    
     Rector\Rector\AbstractScopeAwareRector->refactor(Object(PhpParser\Node\Stmt\ClassMethod))                      
     #7 vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/NodeTraverser.php(176):                          
     Rector\Rector\AbstractRector->enterNode(Object(PhpParser\Node\Stmt\ClassMethod))                               
     #8 vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/NodeTraverser.php(105):                          
     PhpParser\NodeTraverser->traverseArray(Array)                                                                  
     #9 vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/NodeTraverser.php(196):                          
     PhpParser\NodeTraverser->traverseNode(Object(PhpParser\Node\Stmt\Class_))                                      
     #10 vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/NodeTraverser.php(105):                         
     PhpParser\NodeTraverser->traverseArray(Array)                                                                  
     #11 vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/NodeTraverser.php(196):                         
     PhpParser\NodeTraverser->traverseNode(Object(PhpParser\Node\Stmt\Namespace_))                                  
     #12 vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/NodeTraverser.php(85):                          
     PhpParser\NodeTraverser->traverseArray(Array)                                                                  
     #13 vendor/rector/rector/src/PhpParser/NodeTraverser/RectorNodeTraverser.php(41):                              
     PhpParser\NodeTraverser->traverse(Array)                                                                       
     #14 vendor/rector/rector/src/Application/FileProcessor.php(111):                                               
     Rector\PhpParser\NodeTraverser\RectorNodeTraverser->traverse(Array)                                            
     #15 vendor/rector/rector/src/Application/ApplicationFileProcessor.php(184):                                    
     Rector\Application\FileProcessor->processFile(Object(Rector\ValueObject\Application\File),                     
     Object(Rector\ValueObject\Configuration))                                                                      
     #16 vendor/rector/rector/src/Application/ApplicationFileProcessor.php(161):                                    
     Rector\Application\ApplicationFileProcessor->processFile(Object(Rector\ValueObject\Application\File),          
     Object(Rector\ValueObject\Configuration))                                                                      
     #17 vendor/rector/rector/src/Console/Command/WorkerCommand.php(118):                                           
     Rector\Application\ApplicationFileProcessor->processFiles(Array, Object(Rector\ValueObject\Configuration),     
     Object(Closure))                                                                                               
     #18 vendor/rector/rector/vendor/evenement/evenement/src/EventEmitterTrait.php(111):                            
     Rector\Console\Command\WorkerCommand->Rector\Console\Command\{closure}(Array)                                  
     #19 vendor/rector/rector/vendor/clue/ndjson-react/src/Decoder.php(117):                                        
     RectorPrefix202404\Evenement\EventEmitter->emit('data', Array)                                                 
     #20 vendor/rector/rector/vendor/evenement/evenement/src/EventEmitterTrait.php(111):                            
     RectorPrefix202404\Clue\React\NDJson\Decoder->handleData(Array)                                                
     #21 vendor/rector/rector/vendor/react/stream/src/Util.php(62):                                                 
     RectorPrefix202404\Evenement\EventEmitter->emit('data', Array)                                                 
     #22 vendor/rector/rector/vendor/evenement/evenement/src/EventEmitterTrait.php(111):                            
     RectorPrefix202404\React\Stream\Util::RectorPrefix202404\React\Stream\{closure}('{"action":"main...')          
     #23 vendor/rector/rector/vendor/react/stream/src/DuplexResourceStream.php(154):                                
     RectorPrefix202404\Evenement\EventEmitter->emit('data', Array)                                                 
     #24 vendor/rector/rector/vendor/react/event-loop/src/StreamSelectLoop.php(201):                                
     RectorPrefix202404\React\Stream\DuplexResourceStream->handleData(Resource id #2036)                            
     #25 vendor/rector/rector/vendor/react/event-loop/src/StreamSelectLoop.php(173):                                
     RectorPrefix202404\React\EventLoop\StreamSelectLoop->waitForStreamActivity(NULL)                               
     #26 vendor/rector/rector/src/Console/Command/WorkerCommand.php(89):                                            
     RectorPrefix202404\React\EventLoop\StreamSelectLoop->run()                                                     
     #27 vendor/rector/rector/vendor/symfony/console/Command/Command.php(327):                                      
     Rector\Console\Command\WorkerCommand->execute(Object(RectorPrefix202404\Symfony\Component\Console\Input\ArgvIn 
     put), Object(RectorPrefix202404\Symfony\Component\Console\Output\ConsoleOutput))                               
     #28 vendor/rector/rector/vendor/symfony/console/Application.php(960):                                          
     RectorPrefix202404\Symfony\Component\Console\Command\Command->run(Object(RectorPrefix202404\Symfony\Component\ 
     Console\Input\ArgvInput), Object(RectorPrefix202404\Symfony\Component\Console\Output\ConsoleOutput))           
     #29 vendor/rector/rector/vendor/symfony/console/Application.php(333):                                          
     RectorPrefix202404\Symfony\Component\Console\Application->doRunCommand(Object(Rector\Console\Command\WorkerCom 
     mand), Object(RectorPrefix202404\Symfony\Component\Console\Input\ArgvInput),                                   
     Object(RectorPrefix202404\Symfony\Component\Console\Output\ConsoleOutput))                                     
     #30 vendor/rector/rector/src/Console/ConsoleApplication.php(53):                                               
     RectorPrefix202404\Symfony\Component\Console\Application->doRun(Object(RectorPrefix202404\Symfony\Component\Co 
     nsole\Input\ArgvInput), Object(RectorPrefix202404\Symfony\Component\Console\Output\ConsoleOutput))             
     #31 vendor/rector/rector/vendor/symfony/console/Application.php(216):                                          
     Rector\Console\ConsoleApplication->doRun(Object(RectorPrefix202404\Symfony\Component\Console\Input\ArgvInput), 
     Object(RectorPrefix202404\Symfony\Component\Console\Output\ConsoleOutput))                                     
     #32 vendor/rector/rector/bin/rector.php(130): RectorPrefix202404\Symfony\Component\Console\Application->run()  
     #33 vendor/rector/rector/bin/rector(5): require_once('/Users/markusma...')                                     
     #34 vendor/bin/rector(119): include('/Users/markusma...')                                                      
     #35 {main}". On line: 59    

Minimal PHP Code Causing Issue

https://getrector.com/demo/d5fc25af-b1bb-4779-8779-d0abae91c284

<?php

namespace App\JsonApi;

use Illuminate\Support\Facades\Cache;

class Client
{
    /**
     * @throws GuzzleException
     * @throws JsonException
     */
    protected function getOauthToken(bool $force = false)
    {
        $key = "json_api_oauth_token_$this->endpointName";
        if (! $force && Cache::has($key)) {
            return Cache::get($key);
        }

        return tap(\safe\json_decode($body, true), static function (array $data) use ($key): void {
           Cache::put($key, $data, $data['expires_in']);
        });
    }
}

Expected Behaviour

Rector should not crash.

samsonasik commented 1 month ago

Reproduced by ReturnTypeFromStrictTypedCallRector https://getrector.com/demo/f7273fc1-83ae-401d-ba61-1905d7b23544

samsonasik commented 1 month ago

it seems due to mixin usage https://getrector.com/demo/b450e42d-5c0a-42d8-8dfb-7c350969a5ad