From 57b3876796fc6cefae03edf1f098e796bb67aedc Mon Sep 17 00:00:00 2001 From: andrew Date: Thu, 4 May 2023 10:52:50 +0300 Subject: [PATCH] Fix invalid cast for templated class-string --- .../Type/Comparator/ClassLikeStringComparator.php | 13 ++++++++++++- tests/FunctionCallTest.php | 13 +++++++++++++ 2 files changed, 25 insertions(+), 1 deletion(-) diff --git a/src/Psalm/Internal/Type/Comparator/ClassLikeStringComparator.php b/src/Psalm/Internal/Type/Comparator/ClassLikeStringComparator.php index c074efd8596..a3830ea83d4 100644 --- a/src/Psalm/Internal/Type/Comparator/ClassLikeStringComparator.php +++ b/src/Psalm/Internal/Type/Comparator/ClassLikeStringComparator.php @@ -80,7 +80,7 @@ public static function isContainedBy( : $input_type_part->value, ); - return AtomicTypeComparator::isContainedBy( + $isContainedBy = AtomicTypeComparator::isContainedBy( $codebase, $fake_input_object, $fake_container_object, @@ -88,5 +88,16 @@ public static function isContainedBy( false, $atomic_comparison_result, ); + + if ($atomic_comparison_result + && $atomic_comparison_result->replacement_atomic_type instanceof TNamedObject + ) { + $atomic_comparison_result->replacement_atomic_type = new TClassString( + 'object', + $atomic_comparison_result->replacement_atomic_type, + ); + } + + return $isContainedBy; } } diff --git a/tests/FunctionCallTest.php b/tests/FunctionCallTest.php index 9342a63e547..690013c87cb 100644 --- a/tests/FunctionCallTest.php +++ b/tests/FunctionCallTest.php @@ -17,6 +17,19 @@ class FunctionCallTest extends TestCase public function providerValidCodeParse(): iterable { return [ + 'callFunctionWithTemplateClassStringWillNotFail' => [ + 'code' => '> $classString */ + function acceptTemplatedClassString(string $classString): void + { + } + + /** @param class-string> $classString */ + function app(string $classString): void + { + acceptTemplatedClassString($classString); + }', + ], 'inferGenericListFromTuple' => [ 'code' => '