Skip to content

Internal error: NodeScopeResolver::processClosureNode() #9459

@zonuexe

Description

@zonuexe

Bug report

I use PHPStan 1.10.19, I got an error with the code below.

I know this @var doesn't make sense, but I found this pattern in code written by a colleague.

<?php declare(strict_types = 1);

class HelloWorld
{
	public function sayHello(): Closure
	{
		/** @var callable(): array */
		return function (): array { return []; };
	}
}
Backtrace
     Post the following stack trace to https://github.com/phpstan/phpstan/issues/new?template=Bug_report.yaml:
     #0 phar:///home/tadsan/pixiv/vendor/phpstan/phpstan/phpstan.phar/src/Analyser/NodeScopeResolver.php(2671): PHPStan\Analyser\MutatingScope->enterAnonymousFunction(Object(PhpParser\Node\Expr\Closure), NULL)
     #1 phar:///home/tadsan/pixiv/vendor/phpstan/phpstan/phpstan.phar/src/Analyser/NodeScopeResolver.php(1902): PHPStan\Analyser\NodeScopeResolver->processClosureNode(Object(PhpParser\Node\Expr\Closure), Object(PHPStan\Analyser\MutatingScope),
     Object(Closure), Object(PHPStan\Analyser\ExpressionContext), NULL)
     #2 phar:///home/tadsan/pixiv/vendor/phpstan/phpstan/phpstan.phar/src/Analyser/NodeScopeResolver.php(554): PHPStan\Analyser\NodeScopeResolver->processExprNode(Object(PhpParser\Node\Expr\Closure), Object(PHPStan\Analyser\MutatingScope),
     Object(Closure), Object(PHPStan\Analyser\ExpressionContext))
     #3 phar:///home/tadsan/pixiv/vendor/phpstan/phpstan/phpstan.phar/src/Analyser/NodeScopeResolver.php(370): PHPStan\Analyser\NodeScopeResolver->processStmtNode(Object(PhpParser\Node\Stmt\Return_), Object(PHPStan\Analyser\MutatingScope),
     Object(Closure), Object(PHPStan\Analyser\StatementContext))
     #4 phar:///home/tadsan/pixiv/vendor/phpstan/phpstan/phpstan.phar/src/Analyser/MutatingScope.php(1026): PHPStan\Analyser\NodeScopeResolver->processStmtNodes(Object(PhpParser\Node\Expr\Closure), Array, Object(PHPStan\Analyser\MutatingScope),
     Object(Closure), Object(PHPStan\Analyser\StatementContext))
     #5 phar:///home/tadsan/pixiv/vendor/phpstan/phpstan/phpstan.phar/src/Analyser/MutatingScope.php(559): PHPStan\Analyser\MutatingScope->resolveType('function () {\n ...', Object(PhpParser\Node\Expr\Closure))
     #6 phar:///home/tadsan/pixiv/vendor/phpstan/phpstan/phpstan.phar/src/Rules/FunctionCallParametersCheck.php(114): PHPStan\Analyser\MutatingScope->getType(Object(PhpParser\Node\Expr\Closure))
     #7 phar:///home/tadsan/pixiv/vendor/phpstan/phpstan/phpstan.phar/src/Rules/Methods/CallStaticMethodsRule.php(49): PHPStan\Rules\FunctionCallParametersCheck->check(Object(PHPStan\Reflection\ResolvedFunctionVariant),
     Object(PHPStan\Analyser\MutatingScope), false, Object(PhpParser\Node\Expr\StaticCall), Array)
     #8 phar:///home/tadsan/pixiv/vendor/phpstan/phpstan/phpstan.phar/src/Analyser/FileAnalyser.php(104): PHPStan\Rules\Methods\CallStaticMethodsRule->processNode(Object(PhpParser\Node\Expr\StaticCall), Object(PHPStan\Analyser\MutatingScope))
     #9 phar:///home/tadsan/pixiv/vendor/phpstan/phpstan/phpstan.phar/src/Node/ClassStatementsGatherer.php(98): PHPStan\Analyser\FileAnalyser->PHPStan\Analyser\{closure}(Object(PhpParser\Node\Expr\StaticCall),
     Object(PHPStan\Analyser\MutatingScope))
     #10 phar:///home/tadsan/pixiv/vendor/phpstan/phpstan/phpstan.phar/src/Analyser/NodeScopeResolver.php(521): PHPStan\Node\ClassStatementsGatherer->__invoke(Object(PhpParser\Node\Expr\StaticCall), Object(PHPStan\Analyser\MutatingScope))
     #11 phar:///home/tadsan/pixiv/vendor/phpstan/phpstan/phpstan.phar/src/Analyser/NodeScopeResolver.php(2594): PHPStan\Analyser\NodeScopeResolver::PHPStan\Analyser\{closure}(Object(PhpParser\Node\Expr\StaticCall),
     Object(PHPStan\Analyser\MutatingScope))
     #12 phar:///home/tadsan/pixiv/vendor/phpstan/phpstan/phpstan.phar/src/Analyser/NodeScopeResolver.php(1545): PHPStan\Analyser\NodeScopeResolver->callNodeCallbackWithExpression(Object(Closure), Object(PhpParser\Node\Expr\StaticCall),
     Object(PHPStan\Analyser\MutatingScope), Object(PHPStan\Analyser\ExpressionContext))
     #13 phar:///home/tadsan/pixiv/vendor/phpstan/phpstan/phpstan.phar/src/Analyser/NodeScopeResolver.php(554): PHPStan\Analyser\NodeScopeResolver->processExprNode(Object(PhpParser\Node\Expr\StaticCall), Object(PHPStan\Analyser\MutatingScope),
     Object(Closure), Object(PHPStan\Analyser\ExpressionContext))
     #14 phar:///home/tadsan/pixiv/vendor/phpstan/phpstan/phpstan.phar/src/Analyser/NodeScopeResolver.php(370): PHPStan\Analyser\NodeScopeResolver->processStmtNode(Object(PhpParser\Node\Stmt\Return_), Object(PHPStan\Analyser\MutatingScope),
     Object(Closure), Object(PHPStan\Analyser\StatementContext))
     #15 phar:///home/tadsan/pixiv/vendor/phpstan/phpstan/phpstan.phar/src/Analyser/NodeScopeResolver.php(539): PHPStan\Analyser\NodeScopeResolver->processStmtNodes(Object(PhpParser\Node\Stmt\ClassMethod), Array,
     Object(PHPStan\Analyser\MutatingScope), Object(Closure), Object(PHPStan\Analyser\StatementContext))
     #16 phar:///home/tadsan/pixiv/vendor/phpstan/phpstan/phpstan.phar/src/Analyser/NodeScopeResolver.php(370): PHPStan\Analyser\NodeScopeResolver->processStmtNode(Object(PhpParser\Node\Stmt\ClassMethod), Object(PHPStan\Analyser\MutatingScope),
     Object(PHPStan\Node\ClassStatementsGatherer), Object(PHPStan\Analyser\StatementContext))
     #17 phar:///home/tadsan/pixiv/vendor/phpstan/phpstan/phpstan.phar/src/Analyser/NodeScopeResolver.php(617): PHPStan\Analyser\NodeScopeResolver->processStmtNodes(Object(PhpParser\Node\Stmt\Class_), Array,
     Object(PHPStan\Analyser\MutatingScope), Object(PHPStan\Node\ClassStatementsGatherer), Object(PHPStan\Analyser\StatementContext))
     #18 phar:///home/tadsan/pixiv/vendor/phpstan/phpstan/phpstan.phar/src/Analyser/NodeScopeResolver.php(339): PHPStan\Analyser\NodeScopeResolver->processStmtNode(Object(PhpParser\Node\Stmt\Class_), Object(PHPStan\Analyser\MutatingScope),
     Object(Closure), Object(PHPStan\Analyser\StatementContext))
     #19 phar:///home/tadsan/pixiv/vendor/phpstan/phpstan/phpstan.phar/src/Analyser/FileAnalyser.php(173): PHPStan\Analyser\NodeScopeResolver->processNodes(Array, Object(PHPStan\Analyser\MutatingScope), Object(Closure))
     #20 phar:///home/tadsan/pixiv/vendor/phpstan/phpstan/phpstan.phar/src/Command/WorkerCommand.php(130): PHPStan\Analyser\FileAnalyser->analyseFile('/home/...', Array, Object(PHPStan\Rules\LazyRegistry),
     Object(PHPStan\Collectors\Registry), NULL)
     #21 phar:///home/tadsan/pixiv/vendor/phpstan/phpstan/phpstan.phar/vendor/evenement/evenement/src/Evenement/EventEmitterTrait.php(97): PHPStan\Command\WorkerCommand->PHPStan\Command\{closure}(Array)
     #22 phar:///home/tadsan/pixiv/vendor/phpstan/phpstan/phpstan.phar/vendor/clue/ndjson-react/src/Decoder.php(117): _PHPStan_978789531\Evenement\EventEmitter->emit('data', Array)
     #23 phar:///home/tadsan/pixiv/vendor/phpstan/phpstan/phpstan.phar/vendor/evenement/evenement/src/Evenement/EventEmitterTrait.php(97): _PHPStan_978789531\Clue\React\NDJson\Decoder->handleData(Array)
     #24 phar:///home/tadsan/pixiv/vendor/phpstan/phpstan/phpstan.phar/vendor/react/stream/src/Util.php(62): _PHPStan_978789531\Evenement\EventEmitter->emit('data', Array)
     #25 phar:///home/tadsan/pixiv/vendor/phpstan/phpstan/phpstan.phar/vendor/evenement/evenement/src/Evenement/EventEmitterTrait.php(97): _PHPStan_978789531\React\Stream\Util::_PHPStan_978789531\React\Stream\{closure}('{"action":"anal...')
     #26 phar:///home/tadsan/pixiv/vendor/phpstan/phpstan/phpstan.phar/vendor/react/stream/src/DuplexResourceStream.php(154): _PHPStan_978789531\Evenement\EventEmitter->emit('data', Array)
     #27 phar:///home/tadsan/pixiv/vendor/phpstan/phpstan/phpstan.phar/vendor/react/event-loop/src/StreamSelectLoop.php(201): _PHPStan_978789531\React\Stream\DuplexResourceStream->handleData(Resource id #6171)
     #28 phar:///home/tadsan/pixiv/vendor/phpstan/phpstan/phpstan.phar/vendor/react/event-loop/src/StreamSelectLoop.php(173): _PHPStan_978789531\React\EventLoop\StreamSelectLoop->waitForStreamActivity(NULL)
     #29 phar:///home/tadsan/pixiv/vendor/phpstan/phpstan/phpstan.phar/src/Command/WorkerCommand.php(96): _PHPStan_978789531\React\EventLoop\StreamSelectLoop->run()
     #30 phar:///home/tadsan/pixiv/vendor/phpstan/phpstan/phpstan.phar/vendor/symfony/console/Command/Command.php(259): PHPStan\Command\WorkerCommand->execute(Object(_PHPStan_978789531\Symfony\Component\Console\Input\ArgvInput),
     Object(_PHPStan_978789531\Symfony\Component\Console\Output\ConsoleOutput))
     #31 phar:///home/tadsan/pixiv/vendor/phpstan/phpstan/phpstan.phar/vendor/symfony/console/Application.php(870):
     _PHPStan_978789531\Symfony\Component\Console\Command\Command->run(Object(_PHPStan_978789531\Symfony\Component\Console\Input\ArgvInput), Object(_PHPStan_978789531\Symfony\Component\Console\Output\ConsoleOutput))
     #32 phar:///home/tadsan/pixiv/vendor/phpstan/phpstan/phpstan.phar/vendor/symfony/console/Application.php(261): _PHPStan_978789531\Symfony\Component\Console\Application->doRunCommand(Object(PHPStan\Command\WorkerCommand),
     Object(_PHPStan_978789531\Symfony\Component\Console\Input\ArgvInput), Object(_PHPStan_978789531\Symfony\Component\Console\Output\ConsoleOutput))
     #33 phar:///home/tadsan/pixiv/vendor/phpstan/phpstan/phpstan.phar/vendor/symfony/console/Application.php(157):
     _PHPStan_978789531\Symfony\Component\Console\Application->doRun(Object(_PHPStan_978789531\Symfony\Component\Console\Input\ArgvInput), Object(_PHPStan_978789531\Symfony\Component\Console\Output\ConsoleOutput))
     #34 phar:///home/tadsan/pixiv/vendor/phpstan/phpstan/phpstan.phar/bin/phpstan(122): _PHPStan_978789531\Symfony\Component\Console\Application->run()
     #35 phar:///home/tadsan/pixiv/vendor/phpstan/phpstan/phpstan.phar/bin/phpstan(123): _PHPStan_978789531\{closure}()
     #36 /home/tadsan/pixiv/vendor/phpstan/phpstan/phpstan(7): require('phar:///mnt/ssd...')
     #37 /home/tadsan/pixiv/vendor/bin/phpstan(115): include('/home/...')
     #38 {main}
     Child process error (exit code 1):

Code snippet that reproduces the problem

https://phpstan.org/r/47108864-844a-4a68-92fd-f87afe71f697

Expected output

No errors.

Did PHPStan help you today? Did it make you happy in any way?

No response

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions