From 89a1c5acbcca54f5a993ee60290ef29842266a63 Mon Sep 17 00:00:00 2001 From: Matthew Brown Date: Thu, 16 Dec 2021 16:39:08 +0000 Subject: [PATCH] Fix faulty comparison with typed closure --- .../Type/Comparator/AtomicTypeComparator.php | 40 ++++++------------- tests/ClosureTest.php | 8 ++++ 2 files changed, 20 insertions(+), 28 deletions(-) diff --git a/src/Psalm/Internal/Type/Comparator/AtomicTypeComparator.php b/src/Psalm/Internal/Type/Comparator/AtomicTypeComparator.php index 360dafa940b..109923c6182 100644 --- a/src/Psalm/Internal/Type/Comparator/AtomicTypeComparator.php +++ b/src/Psalm/Internal/Type/Comparator/AtomicTypeComparator.php @@ -165,40 +165,24 @@ public static function isContainedBy( ); } - if ($container_type_part instanceof TClosure && $input_type_part instanceof TCallable) { - if (CallableTypeComparator::isContainedBy( - $codebase, - $input_type_part, - $container_type_part, - $atomic_comparison_result - ) === false - ) { - return false; - } - - if ($atomic_comparison_result) { - $atomic_comparison_result->type_coerced = true; - } - - return false; - } - if ($container_type_part instanceof TClosure) { - if (!$input_type_part instanceof TClosure) { + if ($input_type_part instanceof TCallable) { + if (CallableTypeComparator::isContainedBy( + $codebase, + $input_type_part, + $container_type_part, + $atomic_comparison_result + ) === false + ) { + return false; + } + if ($atomic_comparison_result) { $atomic_comparison_result->type_coerced = true; - $atomic_comparison_result->type_coerced_from_mixed = true; } - - return false; } - return CallableTypeComparator::isContainedBy( - $codebase, - $input_type_part, - $container_type_part, - $atomic_comparison_result - ); + return false; } if ($container_type_part instanceof TCallable && $input_type_part instanceof TClosure) { diff --git a/tests/ClosureTest.php b/tests/ClosureTest.php index 85fa896501c..4fd04e84d7f 100644 --- a/tests/ClosureTest.php +++ b/tests/ClosureTest.php @@ -1043,6 +1043,14 @@ function (): void {}; false, '7.4' ], + 'closureInvalidArg' => [ + ' 'InvalidArgument', + ], ]; } }