From dfa885435474d41498e211a78b69132a3bf0d367 Mon Sep 17 00:00:00 2001 From: Matt Brown Date: Mon, 12 Oct 2020 14:45:11 -0400 Subject: [PATCH] Fix #4310 - prevent literal class check on union --- .../Expression/Call/ArgumentAnalyzer.php | 2 +- tests/Template/ConditionalReturnTypeTest.php | 33 +++++++++++++++++++ 2 files changed, 34 insertions(+), 1 deletion(-) diff --git a/src/Psalm/Internal/Analyzer/Statements/Expression/Call/ArgumentAnalyzer.php b/src/Psalm/Internal/Analyzer/Statements/Expression/Call/ArgumentAnalyzer.php index 608b8f4a852..918855609fd 100644 --- a/src/Psalm/Internal/Analyzer/Statements/Expression/Call/ArgumentAnalyzer.php +++ b/src/Psalm/Internal/Analyzer/Statements/Expression/Call/ArgumentAnalyzer.php @@ -851,7 +851,7 @@ public static function verifyType( foreach ($param_type->getAtomicTypes() as $param_type_part) { if ($param_type_part instanceof TClassString && $input_expr instanceof PhpParser\Node\Scalar\String_ - && !$param_type->getLiteralStrings() + && $param_type->isSingle() ) { if (ClassLikeAnalyzer::checkFullyQualifiedClassLikeName( $statements_analyzer, diff --git a/tests/Template/ConditionalReturnTypeTest.php b/tests/Template/ConditionalReturnTypeTest.php index 02a6db973d5..aa5f781ad1b 100644 --- a/tests/Template/ConditionalReturnTypeTest.php +++ b/tests/Template/ConditionalReturnTypeTest.php @@ -621,6 +621,39 @@ public function get_liste_tdm_by_cod_s(bool $id_only = false): array { } }' ], + 'stringOrClassStringT' => [ + ' $name + * @return ($name is class-string ? T : mixed) + */ + function get(string $name) { + return; + } + + $lowercase_a = "a"; + + /** @var class-string $class_string */ + $class_string = "b"; + + /** @psalm-suppress MixedAssignment */ + $expect_mixed = get($lowercase_a); + $expect_object = get($class_string); + + $expect_a_object = get(A::class); + + /** @psalm-suppress MixedAssignment */ + $expect_mixed_from_literal = get("LiteralDirect");', + [ + '$expect_mixed' => 'mixed', + '$expect_object' => 'object', + '$expect_a_object' => 'A', + '$expect_mixed_from_literal' => 'mixed', + ] + ], ]; } }