psalm: 5.22.0 regression: Could not get class storage for psl\range\upperboundrangeinterface
It was fine in 5.21.1
Target PHP version: 8.3 (inferred from current PHP version).
Scanning files...
Uncaught InvalidArgumentException: Could not get class storage for psl\range\upperboundrangeinterface in /app-appname/vendor/vimeo/psalm/src/Psalm/Internal/Provider/ClassLikeStorageProvider.php:45
Stack trace:
#0 /app-appname/vendor/vimeo/psalm/src/Psalm/Internal/Codebase/ClassLikes.php(726): Psalm\Internal\Provider\ClassLikeStorageProvider->get()
#1 /app-appname/vendor/vimeo/psalm/src/Psalm/Internal/Codebase/ClassLikes.php(716): Psalm\Internal\Codebase\ClassLikes->getParentInterfaces()
#2 /app-appname/vendor/vimeo/psalm/src/Psalm/Codebase.php(763): Psalm\Internal\Codebase\ClassLikes->interfaceExtends()
#3 /app-appname/vendor/vimeo/psalm/src/Psalm/Internal/Type/Comparator/ObjectComparator.php(357): Psalm\Codebase->interfaceExtends()
#4 /app-appname/vendor/vimeo/psalm/src/Psalm/Internal/Type/Comparator/ObjectComparator.php(117): Psalm\Internal\Type\Comparator\ObjectComparator::isIntersectionShallowlyContainedBy()
#5 /app-appname/vendor/vimeo/psalm/src/Psalm/Internal/Type/Comparator/AtomicTypeComparator.php(350): Psalm\Internal\Type\Comparator\ObjectComparator::isShallowlyContainedBy()
#6 /app-appname/vendor/vimeo/psalm/src/Psalm/Type.php(891): Psalm\Internal\Type\Comparator\AtomicTypeComparator::isContainedBy()
#7 /app-appname/vendor/vimeo/psalm/src/Psalm/Type.php(768): Psalm\Type::intersectAtomicTypes()
#8 /app-appname/vendor/vimeo/psalm/src/Psalm/Internal/PhpVisitor/Reflector/TypeHintResolver.php(112): Psalm\Type::intersectUnionTypes()
#9 /app-appname/vendor/vimeo/psalm/src/Psalm/Internal/PhpVisitor/Reflector/FunctionLikeNodeScanner.php(405): Psalm\Internal\PhpVisitor\Reflector\TypeHintResolver::resolve()
#10 /app-appname/vendor/vimeo/psalm/src/Psalm/Internal/PhpVisitor/ReflectorVisitor.php(207): Psalm\Internal\PhpVisitor\Reflector\FunctionLikeNodeScanner->start()
#11 /app-appname/vendor/nikic/php-parser/lib/PhpParser/NodeTraverser.php(200): Psalm\Internal\PhpVisitor\ReflectorVisitor->enterNode()
#12 /app-appname/vendor/nikic/php-parser/lib/PhpParser/NodeTraverser.php(114): PhpParser\NodeTraverser->traverseArray()
#13 /app-appname/vendor/nikic/php-parser/lib/PhpParser/NodeTraverser.php(223): PhpParser\NodeTraverser->traverseNode()
#14 /app-appname/vendor/nikic/php-parser/lib/PhpParser/NodeTraverser.php(114): PhpParser\NodeTraverser->traverseArray()
#15 /app-appname/vendor/nikic/php-parser/lib/PhpParser/NodeTraverser.php(223): PhpParser\NodeTraverser->traverseNode()
#16 /app-appname/vendor/nikic/php-parser/lib/PhpParser/NodeTraverser.php(91): PhpParser\NodeTraverser->traverseArray()
#17 /app-appname/vendor/vimeo/psalm/src/Psalm/Internal/Scanner/FileScanner.php(79): PhpParser\NodeTraverser->traverse()
#18 /app-appname/vendor/vimeo/psalm/src/Psalm/Internal/Codebase/Scanner.php(554): Psalm\Internal\Scanner\FileScanner->scan()
#19 /app-appname/vendor/vimeo/psalm/src/Psalm/Internal/Codebase/Scanner.php(782): Psalm\Internal\Codebase\Scanner->scanFile()
#20 /app-appname/vendor/vimeo/psalm/src/Psalm/Internal/Codebase/Scanner.php(428): Psalm\Internal\Codebase\Scanner->scanAPath()
#21 /app-appname/vendor/vimeo/psalm/src/Psalm/Internal/Codebase/Scanner.php(280): Psalm\Internal\Codebase\Scanner->scanFilePaths()
#22 /app-appname/vendor/vimeo/psalm/src/Psalm/Config.php(2576): Psalm\Internal\Codebase\Scanner->scanFiles()
#23 /app-appname/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/ProjectAnalyzer.php(372): Psalm\Config->visitComposerAutoloadFiles()
#24 /app-appname/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/ProjectAnalyzer.php(502): Psalm\Internal\Analyzer\ProjectAnalyzer->visitAutoloadFiles()
#25 /app-appname/vendor/vimeo/psalm/src/Psalm/Internal/Cli/Psalm.php(374): Psalm\Internal\Analyzer\ProjectAnalyzer->check()
#26 /app-appname/vendor/vimeo/psalm/psalm(9): Psalm\Internal\Cli\Psalm::run()
#27 /app-appname/vendor/bin/psalm(119): include('...')
#28 {main}
(Psalm 5.22.0@fe2c67ec89f358940f90db05efd2d663388b45a6 crashed due to an uncaught Throwable)
file under test:
<?php
declare(strict_types=1);
// empty file, correct
command:
./vendor/bin/psalm -c configs/<redacted>/psalm.xml configs/<redacted>/a.php --no-cache
<?xml version="1.0"?>
<psalm xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="https://getpsalm.org/schema/config" errorLevel="1" findUnusedCode="false" findUnusedBaselineEntry="true" xsi:schemaLocation="https://getpsalm.org/schema/config vendor/vimeo/psalm/config.xsd" autoloader="/app-appname/src-dev/psalm-autoload.php">
<projectFiles>
<directory name="."/>
<ignoreFiles>
<directory name="vendor"/>
</ignoreFiles>
</projectFiles>
<issueHandlers>
<UnusedClass>
<errorLevel type="suppress">
<directory name="."/>
</errorLevel>
</UnusedClass>
</issueHandlers>
<plugins>
<pluginClass class="Psl\Psalm\Plugin"/>
</plugins>
</psalm>
Removing plugin changes nothing
psalm-autoload.php:
<?php
declare(strict_types=1);
function maybeAutoload(string $path): void
{
if (!is_file($path)) {
return;
}
require_once $path;
}
maybeAutoload('/app/vendor/autoload.php');
maybeAutoload(getcwd() . '/vendor/autoload.php');
It totally has something to do with autoloader: as if I remove the first autoload.php - it then works fine.
About this issue
- Original URL
- State: closed
- Created 5 months ago
- Reactions: 1
- Comments: 25 (13 by maintainers)
Commits related to this issue
- Catch missing classlike exceptions during scanning This may resolve #10706, although I'm not exactly convinced it's the best way. — committed to vimeo/psalm by weirdan 4 months ago
- Catch missing classlike exceptions during scanning This may resolve #10706, although I'm not exactly convinced it's the best way. — committed to vimeo/psalm by weirdan 4 months ago
- Catch missing classlike exceptions during scanning This may resolve #10706, although I'm not exactly convinced it's the best way. — committed to vimeo/psalm by weirdan 4 months ago
@boesing the issue looks remotely similar but not the same (i.e. not about intersections it appears). I extracted it in #10739.
@weirdan that branch now runs fine: it does not crash and there are no unexpected warnings reported.
@zerkms would you mind trying with
dev-10706-catch-intersection-exceptions-during-scanning(composer require --dev vimeo/psalm:dev-10706-catch-intersection-exceptions-during-scanning) with your actual project? It does fix the crash, but I’m particularly interested if it starts reporting some false positives / negatives compared to 5.21.1Here is a repro repository: https://github.com/zerkms/psalm-10706-repro
Psalm.dev isn’t threaded which is also part of the issue.
@weirdan (and all) sorry I didn’t provide the actual repro repository in the beginning. It’s Friday afternoon here, and I’m quite busy doing something else. I promise to provide a repository on Monday, Feb 19th, when I’m back to my development tasks. Sorry again 😃