Skip to content

Could not get class storage for redis #10152

@thomas-0816

Description

@thomas-0816

Psalm 5.15 crashes with:

public Redis&App $redis;

but succeeds with:

private Redis $redis;

https://psalm.dev/r/8eca4012df
https://psalm.dev/r/8c20742f57

Target PHP version: 8.2 (inferred from current PHP version) Enabled extensions: pdo, redis (unsupported extensions: pdo_pgsql, spl, pcre, zend-opcache).
Scanning files...
Uncaught InvalidArgumentException: Could not get class storage for redis in /var/www/tests/vendor/vimeo/psalm/src/Psalm/Internal/Provider/ClassLikeStorageProvider.php:45
Stack trace:
#0 /var/www/tests/vendor/vimeo/psalm/src/Psalm/Internal/Codebase/ClassLikes.php(613): Psalm\Internal\Provider\ClassLikeStorageProvider->get('redis')
#1 /var/www/tests/vendor/vimeo/psalm/src/Psalm/Codebase.php(705): Psalm\Internal\Codebase\ClassLikes->classExtends('redis', 'pdo')
#2 /var/www/tests/vendor/vimeo/psalm/src/Psalm/Internal/Type/Comparator/ObjectComparator.php(340): Psalm\Codebase->classExtendsOrImplements('redis', 'pdo')
#3 /var/www/tests/vendor/vimeo/psalm/src/Psalm/Internal/Type/Comparator/ObjectComparator.php(117): Psalm\Internal\Type\Comparator\ObjectComparator::isIntersectionShallowlyContainedBy(Object(Psalm\Codebase), Object(Psalm\Type\Atomic\TNamedObject), Object(Psalm\Type\Atomic\TNamedObject), 'pdo', false, false, NULL)
#4 /var/www/tests/vendor/vimeo/psalm/src/Psalm/Internal/Type/Comparator/AtomicTypeComparator.php(354): Psalm\Internal\Type\Comparator\ObjectComparator::isShallowlyContainedBy(Object(Psalm\Codebase), Object(Psalm\Type\Atomic\TNamedObject), Object(Psalm\Type\Atomic\TNamedObject), false, NULL)
#5 /var/www/tests/vendor/vimeo/psalm/src/Psalm/Type.php(869): Psalm\Internal\Type\Comparator\AtomicTypeComparator::isContainedBy(Object(Psalm\Codebase), Object(Psalm\Type\Atomic\TNamedObject), Object(Psalm\Type\Atomic\TNamedObject))
#6 /var/www/tests/vendor/vimeo/psalm/src/Psalm/Type.php(750): Psalm\Type::intersectAtomicTypes(Object(Psalm\Type\Atomic\TNamedObject), Object(Psalm\Type\Atomic\TNamedObject), Object(Psalm\Codebase), false)
#7 /var/www/tests/vendor/vimeo/psalm/src/Psalm/Internal/PhpVisitor/Reflector/TypeHintResolver.php(112): Psalm\Type::intersectUnionTypes(Object(Psalm\Type\Union), Object(Psalm\Type\Union), Object(Psalm\Codebase))
#8 /var/www/tests/vendor/vimeo/psalm/src/Psalm/Internal/PhpVisitor/Reflector/ClassLikeNodeScanner.php(1600): Psalm\Internal\PhpVisitor\Reflector\TypeHintResolver::resolve(Object(PhpParser\Node\IntersectionType), Object(Psalm\CodeLocation), Object(Psalm\Codebase), Object(Psalm\Storage\FileStorage), Object(Psalm\Storage\ClassLikeStorage), Object(Psalm\Aliases), 80208)
#9 /var/www/tests/vendor/vimeo/psalm/src/Psalm/Internal/PhpVisitor/Reflector/ClassLikeNodeScanner.php(766): Psalm\Internal\PhpVisitor\Reflector\ClassLikeNodeScanner->visitPropertyDeclaration(Object(PhpParser\Node\Stmt\Property), Object(Psalm\Config), Object(Psalm\Storage\ClassLikeStorage), 'AppMock2')
#10 /var/www/tests/vendor/vimeo/psalm/src/Psalm/Internal/PhpVisitor/ReflectorVisitor.php(157): Psalm\Internal\PhpVisitor\Reflector\ClassLikeNodeScanner->start(Object(PhpParser\Node\Stmt\Class_))
#11 /var/www/tests/vendor/nikic/php-parser/lib/PhpParser/NodeTraverser.php(200): Psalm\Internal\PhpVisitor\ReflectorVisitor->enterNode(Object(PhpParser\Node\Stmt\Class_))
#12 /var/www/tests/vendor/nikic/php-parser/lib/PhpParser/NodeTraverser.php(91): PhpParser\NodeTraverser->traverseArray(Array)
#13 /var/www/tests/vendor/vimeo/psalm/src/Psalm/Internal/Scanner/FileScanner.php(79): PhpParser\NodeTraverser->traverse(Array)
#14 /var/www/tests/vendor/vimeo/psalm/src/Psalm/Internal/Codebase/Scanner.php(554): Psalm\Internal\Scanner\FileScanner->scan(Object(Psalm\Codebase), Object(Psalm\Storage\FileStorage), false, Object(Psalm\Progress\DefaultProgress))
#15 /var/www/tests/vendor/vimeo/psalm/src/Psalm/Internal/Codebase/Scanner.php(782): Psalm\Internal\Codebase\Scanner->scanFile('/var/www/tests/...', Array, true)
#16 /var/www/tests/vendor/vimeo/psalm/src/Psalm/Internal/Codebase/Scanner.php(428): Psalm\Internal\Codebase\Scanner->scanAPath(58, '/var/www/tests/...')
#17 /var/www/tests/vendor/vimeo/psalm/src/Psalm/Internal/Codebase/Scanner.php(280): Psalm\Internal\Codebase\Scanner->scanFilePaths(1)
#18 /var/www/tests/vendor/vimeo/psalm/src/Psalm/Codebase.php(505): Psalm\Internal\Codebase\Scanner->scanFiles(Object(Psalm\Internal\Codebase\ClassLikes), 1)
#19 /var/www/tests/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/ProjectAnalyzer.php(522): Psalm\Codebase->scanFiles(1)
#20 /var/www/tests/vendor/vimeo/psalm/src/Psalm/Internal/Cli/Psalm.php(379): Psalm\Internal\Analyzer\ProjectAnalyzer->check('/var/www/', true)
#21 /var/www/tests/vendor/vimeo/psalm/psalm(9): Psalm\Internal\Cli\Psalm::run(Array)
#22 /var/www/tests/vendor/bin/psalm(119): include('/var/www/tests/...')
#23 {main}
(Psalm 5.15.0@5c774aca4746caf3d239d9c8cadb9f882ca29352 crashed due to an uncaught Throwable)

Metadata

Metadata

Assignees

No one assigned

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions