Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Crash after upgrade to 3.16 in TypeCombination: There should be types here #4287

Closed
Majkl578 opened this issue Oct 6, 2020 · 2 comments
Closed
Labels

Comments

@Majkl578
Copy link

Majkl578 commented Oct 6, 2020

After upgrading from 3.15 to 3.16 I am seeing the following crash:

``` Uncaught UnexpectedValueException: There should be types here in /app/vendor/vimeo/psalm/src/Psalm/Internal/Type/TypeCombination.php:602 Stack trace: #0 /app/vendor/vimeo/psalm/src/Psalm/Type/Atomic/ObjectLike.php(275): Psalm\Internal\Type\TypeCombination::combineTypes(Array) #1 /app/vendor/vimeo/psalm/src/Psalm/Internal/Type/Comparator/ArrayTypeComparator.php(113): Psalm\Type\Atomic\ObjectLike->getGenericArrayType() #2 /app/vendor/vimeo/psalm/src/Psalm/Internal/Type/Comparator/AtomicTypeComparator.php(246): Psalm\Internal\Type\Comparator\ArrayTypeComparator::isContainedBy(Object(Psalm\Codebase), Object(Psalm\Type\Atomic\ObjectLike), Object(Psalm\Type\Atomic\TArray), false, NULL) #3 /app/vendor/vimeo/psalm/src/Psalm/Internal/Type/Comparator/UnionTypeComparator.php(106): Psalm\Internal\Type\Comparator\AtomicTypeComparator::isContainedBy(Object(Psalm\Codebase), Object(Psalm\Type\Atomic\ObjectLike), Object(Psalm\Type\Atomic\TArray), false, true, NULL) #4 /app/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/FunctionLike/ReturnTypeAnalyzer.php(808): Psalm\Internal\Type\Comparator\UnionTypeComparator::isContainedBy(Object(Psalm\Codebase), Object(Psalm\Type\Union), Object(Psalm\Type\Union)) #5 /app/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/FunctionLikeAnalyzer.php(538): Psalm\Internal\Analyzer\FunctionLike\ReturnTypeAnalyzer::checkReturnType(Object(PhpParser\Node\Stmt\ClassMethod), Object(Psalm\Internal\Analyzer\ProjectAnalyzer), Object(Psalm\Internal\Analyzer\MethodAnalyzer), Object(Psalm\Storage\MethodStorage), Object(Psalm\Context)) #6 /app/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/ClassAnalyzer.php(1897): Psalm\Internal\Analyzer\FunctionLikeAnalyzer->analyze(Object(Psalm\Context), Object(Psalm\Internal\Provider\NodeDataProvider), Object(Psalm\Context)) #7 /app/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/ClassAnalyzer.php(734): Psalm\Internal\Analyzer\ClassAnalyzer->analyzeClassMethod(Object(PhpParser\Node\Stmt\ClassMethod), Object(Psalm\Storage\ClassLikeStorage), Object(Psalm\Internal\Analyzer\ClassAnalyzer), Object(Psalm\Context), Object(Psalm\Context)) #8 /app/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/FileAnalyzer.php(215): Psalm\Internal\Analyzer\ClassAnalyzer->analyze(Object(Psalm\Context), Object(Psalm\Context)) #9 /app/vendor/vimeo/psalm/src/Psalm/Internal/Codebase/Analyzer.php(336): Psalm\Internal\Analyzer\FileAnalyzer->analyze(NULL) #10 /app/vendor/vimeo/psalm/src/Psalm/Internal/Codebase/Analyzer.php(576): Psalm\Internal\Codebase\Analyzer->Psalm\Internal\Codebase\{closure}(0, '/app/src/Fulfil...') #11 /app/vendor/vimeo/psalm/src/Psalm/Internal/Codebase/Analyzer.php(268): Psalm\Internal\Codebase\Analyzer->doAnalysis(Object(Psalm\Internal\Analyzer\ProjectAnalyzer), 1) #12 /app/vendor/vimeo/psalm/src/Psalm/Internal/Analyzer/ProjectAnalyzer.php(1178): Psalm\Internal\Codebase\Analyzer->analyzeFiles(Object(Psalm\Internal\Analyzer\ProjectAnalyzer), 1, false, false) #13 /app/vendor/vimeo/psalm/src/psalm.php(679): Psalm\Internal\Analyzer\ProjectAnalyzer->checkPaths(Array) #14 /app/vendor/vimeo/psalm/psalm(2): require_once('/app/vendor/vim...') #15 {main} (Psalm 3.16@d03e5ef057d6adc656c0ff7e166c50b73b4f48f3 crashed due to an uncaught Throwable) ```

This seems to be caused by this phpDoc type declaration e.g. in @return as when I change it to array<string, string> the crash goes away:

string[]&array<string, string>

PHP 7.4.10

@Majkl578
Copy link
Author

Majkl578 commented Oct 6, 2020

Reproducible with:

<?php

class Foo implements JsonSerializable
{
    /**
     * @return string[]&array<string, string>
     */
	public function jsonSerialize(): array
    {
        return ['foo' => 'bar'];
    }
}

under Psalm 3.16 locally. Not reproducible on psalm.dev - seems it's running different version than 3.16 tag with no way to choose version explicitly.

@Majkl578
Copy link
Author

Majkl578 commented Oct 6, 2020

Probably relevant - I also see the following:

PHP Notice:  Undefined property: Psalm\Type\Atomic\TArray::$properties in /app/vendor/vimeo/psalm/src/Psalm/Internal/Type/TypeParser.php on line 446
Notice: Undefined property: Psalm\Type\Atomic\TArray::$properties in /app/vendor/vimeo/psalm/src/Psalm/Internal/Type/TypeParser.php on line 446
PHP Warning:  Invalid argument supplied for foreach() in /app/vendor/vimeo/psalm/src/Psalm/Internal/Type/TypeParser.php on line 446

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
Projects
None yet
Development

No branches or pull requests

2 participants