psalm icon indicating copy to clipboard operation
psalm copied to clipboard

Could not get class storage for appmodel

Open gemal opened this issue 1 year ago • 7 comments

(Psalm 5.15.0@5c774aca4746caf3d239d9c8cadb9f882ca29352 crashed due to an uncaught Throwable)

Calculating best config level based on project files

Install the opcache extension to make use of JIT on PHP 8.0+ for a 20%+ performance boost!

Target PHP version: 7.4 (inferred from composer.json) Enabled extensions: mysqli.
Scanning files...
Analyzing files...

Uncaught InvalidArgumentException: Could not get class storage for appmodel in C:\Users\henri\AppData\Roaming\Composer\vendor\vimeo\psalm\src\Psalm\Internal\Provider\ClassLikeStorageProvider.php:45
Stack trace:
#0 C:\Users\henri\AppData\Roaming\Composer\vendor\vimeo\psalm\src\Psalm\Internal\Analyzer\Statements\Expression\Call\Method\AtomicMethodCallAnalyzer.php(194): Psalm\Internal\Provider\ClassLikeStorageProvider->get('AppModel')
#1 C:\Users\henri\AppData\Roaming\Composer\vendor\vimeo\psalm\src\Psalm\Internal\Analyzer\Statements\Expression\Call\MethodCallAnalyzer.php(198): Psalm\Internal\Analyzer\Statements\Expression\Call\Method\AtomicMethodCallAnalyzer::analyze(Object(Psalm\Internal\Analyzer\StatementsAnalyzer), Object(PhpParser\Node\Expr\MethodCall), Object(Psalm\Codebase), Object(Psalm\Context), Object(Psalm\Type\Union), Object(Psalm\Type\Atomic\TNamedObject), Object(Psalm\Type\Atomic\TNamedObject), false, '$this', Object(Psalm\Internal\Analyzer\Statements\Expression\Call\Method\AtomicMethodCallAnalysisResult), NULL)
#2 C:\Users\henri\AppData\Roaming\Composer\vendor\vimeo\psalm\src\Psalm\Internal\Analyzer\Statements\ExpressionAnalyzer.php(177): Psalm\Internal\Analyzer\Statements\Expression\Call\MethodCallAnalyzer::analyze(Object(Psalm\Internal\Analyzer\StatementsAnalyzer), Object(PhpParser\Node\Expr\MethodCall), Object(Psalm\Context), true, NULL)
#3 C:\Users\henri\AppData\Roaming\Composer\vendor\vimeo\psalm\src\Psalm\Internal\Analyzer\Statements\ExpressionAnalyzer.php(91): Psalm\Internal\Analyzer\Statements\ExpressionAnalyzer::handleExpression(Object(Psalm\Internal\Analyzer\StatementsAnalyzer), Object(PhpParser\Node\Expr\MethodCall), Object(Psalm\Context), false, NULL, true, NULL, false)
#4 C:\Users\henri\AppData\Roaming\Composer\vendor\vimeo\psalm\src\Psalm\Internal\Analyzer\StatementsAnalyzer.php(566): Psalm\Internal\Analyzer\Statements\ExpressionAnalyzer::analyze(Object(Psalm\Internal\Analyzer\StatementsAnalyzer), Object(PhpParser\Node\Expr\MethodCall), Object(Psalm\Context), false, NULL, true)
#5 C:\Users\henri\AppData\Roaming\Composer\vendor\vimeo\psalm\src\Psalm\Internal\Analyzer\StatementsAnalyzer.php(194): Psalm\Internal\Analyzer\StatementsAnalyzer::analyzeStatement(Object(Psalm\Internal\Analyzer\StatementsAnalyzer), Object(PhpParser\Node\Stmt\Expression), Object(Psalm\Context), NULL)
#6 C:\Users\henri\AppData\Roaming\Composer\vendor\vimeo\psalm\src\Psalm\Internal\Analyzer\Statements\Block\IfElse\IfAnalyzer.php(162): Psalm\Internal\Analyzer\StatementsAnalyzer->analyze(Array, Object(Psalm\Context))
#7 C:\Users\henri\AppData\Roaming\Composer\vendor\vimeo\psalm\src\Psalm\Internal\Analyzer\Statements\Block\IfElseAnalyzer.php(261): Psalm\Internal\Analyzer\Statements\Block\IfElse\IfAnalyzer::analyze(Object(Psalm\Internal\Analyzer\StatementsAnalyzer), Object(PhpParser\Node\Stmt\If_), Object(Psalm\Internal\Scope\IfScope), Object(Psalm\Internal\Scope\IfConditionalScope), Object(Psalm\Context), Object(Psalm\Context), Array)
#8 C:\Users\henri\AppData\Roaming\Composer\vendor\vimeo\psalm\src\Psalm\Internal\Analyzer\StatementsAnalyzer.php(514): Psalm\Internal\Analyzer\Statements\Block\IfElseAnalyzer::analyze(Object(Psalm\Internal\Analyzer\StatementsAnalyzer), Object(PhpParser\Node\Stmt\If_), Object(Psalm\Context))
#9 C:\Users\henri\AppData\Roaming\Composer\vendor\vimeo\psalm\src\Psalm\Internal\Analyzer\StatementsAnalyzer.php(194): Psalm\Internal\Analyzer\StatementsAnalyzer::analyzeStatement(Object(Psalm\Internal\Analyzer\StatementsAnalyzer), Object(PhpParser\Node\Stmt\If_), Object(Psalm\Context), NULL)
#10 C:\Users\henri\AppData\Roaming\Composer\vendor\vimeo\psalm\src\Psalm\Internal\Analyzer\Statements\Block\IfElse\IfAnalyzer.php(162): Psalm\Internal\Analyzer\StatementsAnalyzer->analyze(Array, Object(Psalm\Context))
#11 C:\Users\henri\AppData\Roaming\Composer\vendor\vimeo\psalm\src\Psalm\Internal\Analyzer\Statements\Block\IfElseAnalyzer.php(261): Psalm\Internal\Analyzer\Statements\Block\IfElse\IfAnalyzer::analyze(Object(Psalm\Internal\Analyzer\StatementsAnalyzer), Object(PhpParser\Node\Stmt\If_), Object(Psalm\Internal\Scope\IfScope), Object(Psalm\Internal\Scope\IfConditionalScope), Object(Psalm\Context), Object(Psalm\Context), Array)
#12 C:\Users\henri\AppData\Roaming\Composer\vendor\vimeo\psalm\src\Psalm\Internal\Analyzer\StatementsAnalyzer.php(514): Psalm\Internal\Analyzer\Statements\Block\IfElseAnalyzer::analyze(Object(Psalm\Internal\Analyzer\StatementsAnalyzer), Object(PhpParser\Node\Stmt\If_), Object(Psalm\Context))
#13 C:\Users\henri\AppData\Roaming\Composer\vendor\vimeo\psalm\src\Psalm\Internal\Analyzer\StatementsAnalyzer.php(194): Psalm\Internal\Analyzer\StatementsAnalyzer::analyzeStatement(Object(Psalm\Internal\Analyzer\StatementsAnalyzer), Object(PhpParser\Node\Stmt\If_), Object(Psalm\Context), NULL)
#14 C:\Users\henri\AppData\Roaming\Composer\vendor\vimeo\psalm\src\Psalm\Internal\Analyzer\FunctionLikeAnalyzer.php(471): Psalm\Internal\Analyzer\StatementsAnalyzer->analyze(Array, Object(Psalm\Context), NULL, true)
#15 C:\Users\henri\AppData\Roaming\Composer\vendor\vimeo\psalm\src\Psalm\Internal\Analyzer\ClassLikeAnalyzer.php(127): Psalm\Internal\Analyzer\FunctionLikeAnalyzer->analyze(Object(Psalm\Context), Object(Psalm\Internal\Provider\NodeDataProvider), NULL, true)
#16 C:\Users\henri\AppData\Roaming\Composer\vendor\vimeo\psalm\src\Psalm\Internal\Analyzer\FileAnalyzer.php(413): Psalm\Internal\Analyzer\ClassLikeAnalyzer->getMethodMutations('__construct', Object(Psalm\Context))
#17 C:\Users\henri\AppData\Roaming\Composer\vendor\vimeo\psalm\src\Psalm\Internal\Analyzer\ProjectAnalyzer.php(1314): Psalm\Internal\Analyzer\FileAnalyzer->getMethodMutations(Object(Psalm\Internal\MethodIdentifier), Object(Psalm\Context), true)
#18 C:\Users\henri\AppData\Roaming\Composer\vendor\vimeo\psalm\src\Psalm\Internal\Analyzer\FileAnalyzer.php(380): Psalm\Internal\Analyzer\ProjectAnalyzer->getMethodMutations(Object(Psalm\Internal\MethodIdentifier), Object(Psalm\Context), 'C:\\Development\\...', 'app/src/Model/S...')
#19 C:\Users\henri\AppData\Roaming\Composer\vendor\vimeo\psalm\src\Psalm\Internal\Analyzer\Statements\Expression\Call\StaticMethod\ExistingAtomicStaticCallAnalyzer.php(131): Psalm\Internal\Analyzer\FileAnalyzer->getMethodMutations(Object(Psalm\Internal\MethodIdentifier), Object(Psalm\Context))
#20 C:\Users\henri\AppData\Roaming\Composer\vendor\vimeo\psalm\src\Psalm\Internal\Analyzer\Statements\Expression\Call\StaticMethod\AtomicStaticCallAnalyzer.php(882): Psalm\Internal\Analyzer\Statements\Expression\Call\StaticMethod\ExistingAtomicStaticCallAnalyzer::analyze(Object(Psalm\Internal\Analyzer\StatementsAnalyzer), Object(PhpParser\Node\Expr\StaticCall), Object(PhpParser\Node\Identifier), Array, Object(Psalm\Context), Object(Psalm\Type\Atomic\TNamedObject), Object(Psalm\Internal\MethodIdentifier), 'Model::__constr...', Object(Psalm\Storage\ClassLikeStorage), false, NULL)
#21 C:\Users\henri\AppData\Roaming\Composer\vendor\vimeo\psalm\src\Psalm\Internal\Analyzer\Statements\Expression\Call\StaticMethod\AtomicStaticCallAnalyzer.php(207): Psalm\Internal\Analyzer\Statements\Expression\Call\StaticMethod\AtomicStaticCallAnalyzer::handleNamedCall(Object(Psalm\Internal\Analyzer\StatementsAnalyzer), Object(PhpParser\Node\Expr\StaticCall), Object(PhpParser\Node\Identifier), Object(Psalm\Context), Object(Psalm\Type\Atomic\TNamedObject), Array, 'Model', false, true, NULL)
#22 C:\Users\henri\AppData\Roaming\Composer\vendor\vimeo\psalm\src\Psalm\Internal\Analyzer\Statements\Expression\Call\StaticCallAnalyzer.php(208): Psalm\Internal\Analyzer\Statements\Expression\Call\StaticMethod\AtomicStaticCallAnalyzer::analyze(Object(Psalm\Internal\Analyzer\StatementsAnalyzer), Object(PhpParser\Node\Expr\StaticCall), Object(Psalm\Context), Object(Psalm\Type\Atomic\TNamedObject), false, false, false, true, NULL)
#23 C:\Users\henri\AppData\Roaming\Composer\vendor\vimeo\psalm\src\Psalm\Internal\Analyzer\Statements\ExpressionAnalyzer.php(181): Psalm\Internal\Analyzer\Statements\Expression\Call\StaticCallAnalyzer::analyze(Object(Psalm\Internal\Analyzer\StatementsAnalyzer), Object(PhpParser\Node\Expr\StaticCall), Object(Psalm\Context), NULL)
#24 C:\Users\henri\AppData\Roaming\Composer\vendor\vimeo\psalm\src\Psalm\Internal\Analyzer\Statements\ExpressionAnalyzer.php(91): Psalm\Internal\Analyzer\Statements\ExpressionAnalyzer::handleExpression(Object(Psalm\Internal\Analyzer\StatementsAnalyzer), Object(PhpParser\Node\Expr\StaticCall), Object(Psalm\Context), false, NULL, true, NULL, false)
#25 C:\Users\henri\AppData\Roaming\Composer\vendor\vimeo\psalm\src\Psalm\Internal\Analyzer\StatementsAnalyzer.php(566): Psalm\Internal\Analyzer\Statements\ExpressionAnalyzer::analyze(Object(Psalm\Internal\Analyzer\StatementsAnalyzer), Object(PhpParser\Node\Expr\StaticCall), Object(Psalm\Context), false, NULL, true)
#26 C:\Users\henri\AppData\Roaming\Composer\vendor\vimeo\psalm\src\Psalm\Internal\Analyzer\StatementsAnalyzer.php(194): Psalm\Internal\Analyzer\StatementsAnalyzer::analyzeStatement(Object(Psalm\Internal\Analyzer\StatementsAnalyzer), Object(PhpParser\Node\Stmt\Expression), Object(Psalm\Context), NULL)
#27 C:\Users\henri\AppData\Roaming\Composer\vendor\vimeo\psalm\src\Psalm\Internal\Analyzer\FunctionLikeAnalyzer.php(471): Psalm\Internal\Analyzer\StatementsAnalyzer->analyze(Array, Object(Psalm\Context), NULL, true)
#28 C:\Users\henri\AppData\Roaming\Composer\vendor\vimeo\psalm\src\Psalm\Internal\Analyzer\ClassLikeAnalyzer.php(127): Psalm\Internal\Analyzer\FunctionLikeAnalyzer->analyze(Object(Psalm\Context), Object(Psalm\Internal\Provider\NodeDataProvider), NULL, true)
#29 C:\Users\henri\AppData\Roaming\Composer\vendor\vimeo\psalm\src\Psalm\Internal\Analyzer\FileAnalyzer.php(413): Psalm\Internal\Analyzer\ClassLikeAnalyzer->getMethodMutations('__construct', Object(Psalm\Context))
#30 C:\Users\henri\AppData\Roaming\Composer\vendor\vimeo\psalm\src\Psalm\Internal\Analyzer\ProjectAnalyzer.php(1314): Psalm\Internal\Analyzer\FileAnalyzer->getMethodMutations(Object(Psalm\Internal\MethodIdentifier), Object(Psalm\Context), true)
#31 C:\Users\henri\AppData\Roaming\Composer\vendor\vimeo\psalm\src\Psalm\Internal\Analyzer\FileAnalyzer.php(380): Psalm\Internal\Analyzer\ProjectAnalyzer->getMethodMutations(Object(Psalm\Internal\MethodIdentifier), Object(Psalm\Context), 'C:\\Development\\...', 'app/src/Model/S...')
#32 C:\Users\henri\AppData\Roaming\Composer\vendor\vimeo\psalm\src\Psalm\Internal\Analyzer\Statements\Expression\Call\StaticMethod\ExistingAtomicStaticCallAnalyzer.php(131): Psalm\Internal\Analyzer\FileAnalyzer->getMethodMutations(Object(Psalm\Internal\MethodIdentifier), Object(Psalm\Context))
#33 C:\Users\henri\AppData\Roaming\Composer\vendor\vimeo\psalm\src\Psalm\Internal\Analyzer\Statements\Expression\Call\StaticMethod\AtomicStaticCallAnalyzer.php(882): Psalm\Internal\Analyzer\Statements\Expression\Call\StaticMethod\ExistingAtomicStaticCallAnalyzer::analyze(Object(Psalm\Internal\Analyzer\StatementsAnalyzer), Object(Psalm\Node\Expr\VirtualStaticCall), Object(Psalm\Node\VirtualIdentifier), Array, Object(Psalm\Context), Object(Psalm\Type\Atomic\TNamedObject), Object(Psalm\Internal\MethodIdentifier), 'ShimModel::__co...', Object(Psalm\Storage\ClassLikeStorage), false, NULL)
#34 C:\Users\henri\AppData\Roaming\Composer\vendor\vimeo\psalm\src\Psalm\Internal\Analyzer\Statements\Expression\Call\StaticMethod\AtomicStaticCallAnalyzer.php(207): Psalm\Internal\Analyzer\Statements\Expression\Call\StaticMethod\AtomicStaticCallAnalyzer::handleNamedCall(Object(Psalm\Internal\Analyzer\StatementsAnalyzer), Object(Psalm\Node\Expr\VirtualStaticCall), Object(Psalm\Node\VirtualIdentifier), Object(Psalm\Context), Object(Psalm\Type\Atomic\TNamedObject), Array, 'ShimModel', false, true, NULL)
#35 C:\Users\henri\AppData\Roaming\Composer\vendor\vimeo\psalm\src\Psalm\Internal\Analyzer\Statements\Expression\Call\StaticCallAnalyzer.php(208): Psalm\Internal\Analyzer\Statements\Expression\Call\StaticMethod\AtomicStaticCallAnalyzer::analyze(Object(Psalm\Internal\Analyzer\StatementsAnalyzer), Object(Psalm\Node\Expr\VirtualStaticCall), Object(Psalm\Context), Object(Psalm\Type\Atomic\TNamedObject), false, false, false, true, NULL)
#36 C:\Users\henri\AppData\Roaming\Composer\vendor\vimeo\psalm\src\Psalm\Internal\Analyzer\Statements\ExpressionAnalyzer.php(181): Psalm\Internal\Analyzer\Statements\Expression\Call\StaticCallAnalyzer::analyze(Object(Psalm\Internal\Analyzer\StatementsAnalyzer), Object(Psalm\Node\Expr\VirtualStaticCall), Object(Psalm\Context), NULL)
#37 C:\Users\henri\AppData\Roaming\Composer\vendor\vimeo\psalm\src\Psalm\Internal\Analyzer\Statements\ExpressionAnalyzer.php(91): Psalm\Internal\Analyzer\Statements\ExpressionAnalyzer::handleExpression(Object(Psalm\Internal\Analyzer\StatementsAnalyzer), Object(Psalm\Node\Expr\VirtualStaticCall), Object(Psalm\Context), false, Object(Psalm\Context), true, NULL, false)
#38 C:\Users\henri\AppData\Roaming\Composer\vendor\vimeo\psalm\src\Psalm\Internal\Analyzer\StatementsAnalyzer.php(566): Psalm\Internal\Analyzer\Statements\ExpressionAnalyzer::analyze(Object(Psalm\Internal\Analyzer\StatementsAnalyzer), Object(Psalm\Node\Expr\VirtualStaticCall), Object(Psalm\Context), false, Object(Psalm\Context), true)
#39 C:\Users\henri\AppData\Roaming\Composer\vendor\vimeo\psalm\src\Psalm\Internal\Analyzer\StatementsAnalyzer.php(194): Psalm\Internal\Analyzer\StatementsAnalyzer::analyzeStatement(Object(Psalm\Internal\Analyzer\StatementsAnalyzer), Object(Psalm\Node\Stmt\VirtualExpression), Object(Psalm\Context), Object(Psalm\Context))
#40 C:\Users\henri\AppData\Roaming\Composer\vendor\vimeo\psalm\src\Psalm\Internal\Analyzer\FunctionLikeAnalyzer.php(471): Psalm\Internal\Analyzer\StatementsAnalyzer->analyze(Array, Object(Psalm\Context), Object(Psalm\Context), true)
#41 C:\Users\henri\AppData\Roaming\Composer\vendor\vimeo\psalm\src\Psalm\Internal\Analyzer\ClassAnalyzer.php(1805): Psalm\Internal\Analyzer\FunctionLikeAnalyzer->analyze(Object(Psalm\Context), Object(Psalm\Internal\Provider\NodeDataProvider), Object(Psalm\Context))
#42 C:\Users\henri\AppData\Roaming\Composer\vendor\vimeo\psalm\src\Psalm\Internal\Analyzer\ClassAnalyzer.php(1234): Psalm\Internal\Analyzer\ClassAnalyzer->analyzeClassMethod(Object(Psalm\Node\Stmt\VirtualClassMethod), Object(Psalm\Storage\ClassLikeStorage), Object(Psalm\Internal\Analyzer\ClassAnalyzer), Object(Psalm\Context), Object(Psalm\Context), true)
#43 C:\Users\henri\AppData\Roaming\Composer\vendor\vimeo\psalm\src\Psalm\Internal\Analyzer\ClassAnalyzer.php(541): Psalm\Internal\Analyzer\ClassAnalyzer->checkPropertyInitialization(Object(Psalm\Codebase), Object(Psalm\Config), Object(Psalm\Storage\ClassLikeStorage), Object(Psalm\Context), Object(Psalm\Context), NULL)
#44 C:\Users\henri\AppData\Roaming\Composer\vendor\vimeo\psalm\src\Psalm\Internal\Analyzer\FileAnalyzer.php(202): Psalm\Internal\Analyzer\ClassAnalyzer->analyze(Object(Psalm\Context), Object(Psalm\Context))
#45 C:\Users\henri\AppData\Roaming\Composer\vendor\vimeo\psalm\src\Psalm\Internal\Codebase\Analyzer.php(1591): Psalm\Internal\Analyzer\FileAnalyzer->analyze()
#46 C:\Users\henri\AppData\Roaming\Composer\vendor\vimeo\psalm\src\Psalm\Internal\Codebase\Analyzer.php(522): Psalm\Internal\Codebase\Analyzer->analysisWorker(771, 'C:\\Development\\...')
#47 C:\Users\henri\AppData\Roaming\Composer\vendor\vimeo\psalm\src\Psalm\Internal\Codebase\Analyzer.php(272): Psalm\Internal\Codebase\Analyzer->doAnalysis(Object(Psalm\Internal\Analyzer\ProjectAnalyzer), 1)
#48 C:\Users\henri\AppData\Roaming\Composer\vendor\vimeo\psalm\src\Psalm\Internal\Analyzer\ProjectAnalyzer.php(568): Psalm\Internal\Codebase\Analyzer->analyzeFiles(Object(Psalm\Internal\Analyzer\ProjectAnalyzer), 1, false, true)
#49 C:\Users\henri\AppData\Roaming\Composer\vendor\vimeo\psalm\src\Psalm\Internal\Cli\Psalm.php(379): Psalm\Internal\Analyzer\ProjectAnalyzer->check('C:\\Development\\...', true)
#50 C:\Users\henri\AppData\Roaming\Composer\vendor\vimeo\psalm\psalm(8): Psalm\Internal\Cli\Psalm::run(Array)
#51 C:\Users\henri\AppData\Roaming\Composer\vendor\bin\psalm(115): include('C:\\Users\\henri\\...')
#52 {main}
(Psalm 5.15.0@5c774aca4746caf3d239d9c8cadb9f882ca29352 crashed due to an uncaught Throwable)

gemal avatar Oct 30 '23 12:10 gemal

Hey @gemal, can you reproduce the issue on https://psalm.dev ?

psalm-github-bot[bot] avatar Oct 30 '23 12:10 psalm-github-bot[bot]

trying to parse a cakephp file

Parsing C:\Development\cakephp\cakephp\lib\Cake\Core\CakeObject.php
Uncaught InvalidArgumentException: Could not get class storage for appmodel in C:\Users\henri\AppData\Roaming\Composer\vendor\vimeo\psalm\src\Psalm\Internal\Provider\ClassLikeStorageProvider.php:45

gemal avatar Oct 30 '23 13:10 gemal

Hi @gemal, any chance you could provide a minimal reproducer for this?

Looks like you're running psalm --init. I've just run that in a new CakePHP project without issue.

robchett avatar Nov 02 '23 14:11 robchett

@gemal Can you please share a link to the CakeObject.php sources? This issue looks a bit like #10350

ohader avatar Nov 06 '23 22:11 ohader

@gemal Can you please share a link to the CakeObject.php sources? This issue looks a bit like #10350

https://github.com/cakephp/cakephp/blob/2.10.24/lib/Cake/Core/CakeObject.php

gemal avatar Nov 07 '23 16:11 gemal

@ohader #10350 is about intersections, and there seems to be nothing intersection-related in the stack trace here.

weirdan avatar Feb 19 '24 01:02 weirdan

@ohader #10350 is about intersections, and there seems to be nothing intersection-related in the stack trace here.

@weirdan Your observation is correct, it is not related to #10350.

(Back then, in November 2023, I was searching for similar reports and tried to connect them to previous changes/commits. However, the exception Could not get class storage was basically to generic for that approach...)

ohader avatar Feb 19 '24 09:02 ohader