phpstan/phpstan-symfony

Using consoleApplicationLoader with bin/console causes a phpstan internal error

DAcodedBEAT opened this issue · 5 comments

I tried to enable consoleApplicationLoader: bin/console in phpstan.neon config file and received the following error a few times for the Command classes.

 Internal error: Internal error: Return value of PHPStan\Symfony\ConsoleApplicationResolver::getConsoleApplication() must be an instance of Symfony\Component\Console\Application or null, instance   
     of Closure returned in file <my-application-path>/src/Command/MySymfonyCommand.php                                                                                     
                                                                                                                                                                                                          
     Post the following stack trace to https://github.com/phpstan/phpstan/issues/new?template=Bug_report.md:                                                                                              
     #0 <my-application-path>/vendor/phpstan/phpstan-symfony/src/Symfony/ConsoleApplicationResolver.php(54): PHPStan\Symfony\ConsoleApplicationResolver->getConsoleApplication()  
     #1 <my-application-path>/vendor/phpstan/phpstan-symfony/src/Type/Symfony/InputInterfaceGetOptionDynamicReturnTypeExtension.php(59):                                          
     PHPStan\Symfony\ConsoleApplicationResolver->findCommands(Object(PHPStan\Reflection\ClassReflection))                                                                                                 
     #2 phar://<my-application-path>/vendor/phpstan/phpstan/phpstan.phar/src/Analyser/MutatingScope.php(3367):                                                                    
     PHPStan\Type\Symfony\InputInterfaceGetOptionDynamicReturnTypeExtension->getTypeFromMethodCall(Object(PHPStan\Reflection\ResolvedMethodReflection), Object(PhpParser\Node\Expr\MethodCall),           
     Object(PHPStan\Analyser\MutatingScope))                                                                                                                                                              
     #3 phar://<my-application-path>/vendor/phpstan/phpstan/phpstan.phar/src/Analyser/MutatingScope.php(1365):                                                                    
     PHPStan\Analyser\MutatingScope->methodCallReturnType(Object(PHPStan\Type\ObjectType), 'getOption', Object(PhpParser\Node\Expr\MethodCall))                                                           
     #4 phar://<my-application-path>/vendor/phpstan/phpstan/phpstan.phar/src/Analyser/MutatingScope.php(1371): PHPStan\Analyser\MutatingScope->PHPStan\Analyser\{closure}()       
     #5 phar://<my-application-path>/vendor/phpstan/phpstan/phpstan.phar/src/Analyser/MutatingScope.php(557): PHPStan\Analyser\MutatingScope->resolveType('$input->getOpti...',   
     Object(PhpParser\Node\Expr\MethodCall))                                                                                                                                                              
     #6 phar://<my-application-path>/vendor/phpstan/phpstan/phpstan.phar/src/Analyser/MutatingScope.php(777):                                                                     
     PHPStan\Analyser\MutatingScope->getType(Object(PhpParser\Node\Expr\MethodCall))                                                                                                                      
     #7 phar://<my-application-path>/vendor/phpstan/phpstan/phpstan.phar/src/Analyser/MutatingScope.php(557): PHPStan\Analyser\MutatingScope->resolveType('$days = $input-...',   
     Object(PhpParser\Node\Expr\Assign))                                                                                                                                                                  
     #8 phar://<my-application-path>/vendor/phpstan/phpstan/phpstan.phar/src/Analyser/NodeScopeResolver.php(1446):                                                                
     PHPStan\Analyser\MutatingScope->getType(Object(PhpParser\Node\Expr\Assign))                                                                                                                          
     #9 phar://<my-application-path>/vendor/phpstan/phpstan/phpstan.phar/src/Analyser/NodeScopeResolver.php(557):                                                                 
     PHPStan\Analyser\NodeScopeResolver->findEarlyTerminatingExpr(Object(PhpParser\Node\Expr\Assign), Object(PHPStan\Analyser\MutatingScope))                                                             
     #10 phar://<my-application-path>/vendor/phpstan/phpstan/phpstan.phar/src/Analyser/NodeScopeResolver.php(360):                                                                
     PHPStan\Analyser\NodeScopeResolver->processStmtNode(Object(PhpParser\Node\Stmt\Expression), Object(PHPStan\Analyser\MutatingScope), Object(Closure), Object(PHPStan\Analyser\StatementContext))      
     #11 phar://<my-application-path>/vendor/phpstan/phpstan/phpstan.phar/src/Analyser/NodeScopeResolver.php(521):                                                                
     PHPStan\Analyser\NodeScopeResolver->processStmtNodes(Object(PhpParser\Node\Stmt\ClassMethod), Array, Object(PHPStan\Analyser\MutatingScope), Object(Closure),                                        
     Object(PHPStan\Analyser\StatementContext))                                                                                                                                                           
     #12 phar://<my-application-path>/vendor/phpstan/phpstan/phpstan.phar/src/Analyser/NodeScopeResolver.php(360):                                                                
     PHPStan\Analyser\NodeScopeResolver->processStmtNode(Object(PhpParser\Node\Stmt\ClassMethod), Object(PHPStan\Analyser\MutatingScope), Object(PHPStan\Node\ClassStatementsGatherer),                   
     Object(PHPStan\Analyser\StatementContext))                                                                                                                                                           
     #13 phar://<my-application-path>/vendor/phpstan/phpstan/phpstan.phar/src/Analyser/NodeScopeResolver.php(599):                                                                
     PHPStan\Analyser\NodeScopeResolver->processStmtNodes(Object(PhpParser\Node\Stmt\Class_), Array, Object(PHPStan\Analyser\MutatingScope), Object(PHPStan\Node\ClassStatementsGatherer),                
     Object(PHPStan\Analyser\StatementContext))                                                                                                                                                           
     #14 phar://<my-application-path>/vendor/phpstan/phpstan/phpstan.phar/src/Analyser/NodeScopeResolver.php(360):                                                                
     PHPStan\Analyser\NodeScopeResolver->processStmtNode(Object(PhpParser\Node\Stmt\Class_), Object(PHPStan\Analyser\MutatingScope), Object(Closure), Object(PHPStan\Analyser\StatementContext))          
     #15 phar://<my-application-path>/vendor/phpstan/phpstan/phpstan.phar/src/Analyser/NodeScopeResolver.php(571):                                                                
     PHPStan\Analyser\NodeScopeResolver->processStmtNodes(Object(PhpParser\Node\Stmt\Namespace_), Array, Object(PHPStan\Analyser\MutatingScope), Object(Closure),                                         
     Object(PHPStan\Analyser\StatementContext))                                                                                                                                                           
     #16 phar://<my-application-path>/vendor/phpstan/phpstan/phpstan.phar/src/Analyser/NodeScopeResolver.php(327):                                                                
     PHPStan\Analyser\NodeScopeResolver->processStmtNode(Object(PhpParser\Node\Stmt\Namespace_), Object(PHPStan\Analyser\MutatingScope), Object(Closure), Object(PHPStan\Analyser\StatementContext))      
     #17 phar://<my-application-path>/vendor/phpstan/phpstan/phpstan.phar/src/Analyser/FileAnalyser.php(175): PHPStan\Analyser\NodeScopeResolver->processNodes(Array,             
     Object(PHPStan\Analyser\MutatingScope), Object(Closure))                                                                                                                                             
     #18 phar://<my-application-path>/vendor/phpstan/phpstan/phpstan.phar/src/Command/WorkerCommand.php(148): PHPStan\Analyser\FileAnalyser->analyseFile('<my-home-dir>/...',    
     Array, Object(PHPStan\Rules\LazyRegistry), Object(PHPStan\Collectors\Registry), NULL)                                                                                                                
     #19 phar://<my-application-path>/vendor/phpstan/phpstan/phpstan.phar/vendor/evenement/evenement/src/Evenement/EventEmitterTrait.php(97):                                     
     PHPStan\Command\WorkerCommand->PHPStan\Command\{closure}(Array)                                                                                                                                      
     #20 phar://<my-application-path>/vendor/phpstan/phpstan/phpstan.phar/vendor/clue/ndjson-react/src/Decoder.php(110): _PHPStan_d3e3292d7\Evenement\EventEmitter->emit('data',  
     Array)                                                                                                                                                                                               
     #21 phar://<my-application-path>/vendor/phpstan/phpstan/phpstan.phar/vendor/evenement/evenement/src/Evenement/EventEmitterTrait.php(97):                                     
     _PHPStan_d3e3292d7\Clue\React\NDJson\Decoder->handleData(Array)                                                                                                                                      
     #22 phar://<my-application-path>/vendor/phpstan/phpstan/phpstan.phar/vendor/react/stream/src/Util.php(62): _PHPStan_d3e3292d7\Evenement\EventEmitter->emit('data', Array)    
     #23 phar://<my-application-path>/vendor/phpstan/phpstan/phpstan.phar/vendor/evenement/evenement/src/Evenement/EventEmitterTrait.php(97):                                     
     _PHPStan_d3e3292d7\React\Stream\Util::_PHPStan_d3e3292d7\React\Stream\{closure}('{"action":"anal...')                                                                                                
     #24 phar://<my-application-path>/vendor/phpstan/phpstan/phpstan.phar/vendor/react/stream/src/DuplexResourceStream.php(154):                                                  
     _PHPStan_d3e3292d7\Evenement\EventEmitter->emit('data', Array)                                                                                                                                       
     #25 phar://<my-application-path>/vendor/phpstan/phpstan/phpstan.phar/vendor/react/event-loop/src/StreamSelectLoop.php(201):                                                  
     _PHPStan_d3e3292d7\React\Stream\DuplexResourceStream->handleData(Resource id #3637)                                                                                                                  
     #26 phar://<my-application-path>/vendor/phpstan/phpstan/phpstan.phar/vendor/react/event-loop/src/StreamSelectLoop.php(173):                                                  
     _PHPStan_d3e3292d7\React\EventLoop\StreamSelectLoop->waitForStreamActivity(NULL)                                                                                                                     
     #27 phar://<my-application-path>/vendor/phpstan/phpstan/phpstan.phar/src/Command/WorkerCommand.php(108): _PHPStan_d3e3292d7\React\EventLoop\StreamSelectLoop->run()          
     #28 phar://<my-application-path>/vendor/phpstan/phpstan/phpstan.phar/vendor/symfony/console/Command/Command.php(259):                                                        
     PHPStan\Command\WorkerCommand->execute(Object(_PHPStan_d3e3292d7\Symfony\Component\Console\Input\ArgvInput), Object(_PHPStan_d3e3292d7\Symfony\Component\Console\Output\ConsoleOutput))              
     #29 phar://<my-application-path>/vendor/phpstan/phpstan/phpstan.phar/vendor/symfony/console/Application.php(870):                                                            
     _PHPStan_d3e3292d7\Symfony\Component\Console\Command\Command->run(Object(_PHPStan_d3e3292d7\Symfony\Component\Console\Input\ArgvInput),                                                              
     Object(_PHPStan_d3e3292d7\Symfony\Component\Console\Output\ConsoleOutput))                                                                                                                           
     #30 phar://<my-application-path>/vendor/phpstan/phpstan/phpstan.phar/vendor/symfony/console/Application.php(261):                                                            
     _PHPStan_d3e3292d7\Symfony\Component\Console\Application->doRunCommand(Object(PHPStan\Command\WorkerCommand), Object(_PHPStan_d3e3292d7\Symfony\Component\Console\Input\ArgvInput),                  
     Object(_PHPStan_d3e3292d7\Symfony\Component\Console\Output\ConsoleOutput))                                                                                                                           
     #31 phar://<my-application-path>/vendor/phpstan/phpstan/phpstan.phar/vendor/symfony/console/Application.php(157):                                                            
     _PHPStan_d3e3292d7\Symfony\Component\Console\Application->doRun(Object(_PHPStan_d3e3292d7\Symfony\Component\Console\Input\ArgvInput),                                                                
     Object(_PHPStan_d3e3292d7\Symfony\Component\Console\Output\ConsoleOutput))                                                                                                                           
     #32 phar://<my-application-path>/vendor/phpstan/phpstan/phpstan.phar/bin/phpstan(124): _PHPStan_d3e3292d7\Symfony\Component\Console\Application->run()                       
     #33 phar://<my-application-path>/vendor/phpstan/phpstan/phpstan.phar/bin/phpstan(125): _PHPStan_d3e3292d7\{closure}()                                                        
     #34 <my-application-path>/vendor/phpstan/phpstan/phpstan(7): require('phar:///<my-home-dir>/...')                                                                                   
     #35 <my-application-path>/vendor/bin/phpstan(112): include('/Users/aphilip/...')                                                                                             
     #36 {main}                                                                                                                                                                                           
     Internal error: Internal error: Return value of PHPStan\Symfony\ConsoleApplicationResolver::getConsoleApplication() must be an instance of Symfony\Component\Console\Application or null, instance   
     of Closure returned in file <my-application-path>/src/Command/MySymfonyCommand.php

The contents of my bin/console is a modified version of the default Symfony console entrypoint : https://github.com/symfony/demo/blob/main/bin/console . Does anyone have any ideas of what might be wrong? Is the returned closure in the default bin/console code an unsupported workflow in phpstan-symfony?

You need to return Application, not Closure. Examples are described in the README: https://github.com/phpstan/phpstan-symfony#analysis-of-symfony-console-commands

@ondrejmirtes So is the expectation that PHPStan will not be compatible with symfony/runtime going forward?

@DAcodedBEAT It doesn't mean that. It just means that your bin/console file cannot be used as consoleApplicationLoader. You must write a separate script for that.

Okay, thanks for the clarification!

This thread has been automatically locked since there has not been any recent activity after it was closed. Please open a new issue for related bugs.