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

Most upvoted comments

@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.1

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 😃