From 3ee1819ad5deb34c51c442d1542f0269940f48e0 Mon Sep 17 00:00:00 2001 From: Markus Staab Date: Sat, 21 Dec 2024 16:48:07 +0100 Subject: [PATCH] Improve loose comparison on boolean --- src/Type/BooleanType.php | 4 ++ .../Analyser/nsrt/loose-comparisons.php | 48 +++++++++++++++++++ 2 files changed, 52 insertions(+) diff --git a/src/Type/BooleanType.php b/src/Type/BooleanType.php index df059481e6..e49579a00b 100644 --- a/src/Type/BooleanType.php +++ b/src/Type/BooleanType.php @@ -133,6 +133,10 @@ public function isScalar(): TrinaryLogic public function looseCompare(Type $type, PhpVersion $phpVersion): BooleanType { + if ($type->isTrue()->yes() || $type->isFalse()->yes()) { + return $type->toBoolean(); + } + return new BooleanType(); } diff --git a/tests/PHPStan/Analyser/nsrt/loose-comparisons.php b/tests/PHPStan/Analyser/nsrt/loose-comparisons.php index 92bec36518..3d6c4b42b9 100644 --- a/tests/PHPStan/Analyser/nsrt/loose-comparisons.php +++ b/tests/PHPStan/Analyser/nsrt/loose-comparisons.php @@ -601,4 +601,52 @@ public function sayEmptyStr( assertType('false', $emptyStr == $phpStr); assertType('true', $emptyStr == $emptyStr); } + + /** + * @param true $true + * @param false $false + * @param 1 $one + * @param 0 $zero + * @param -1 $minusOne + * @param '1' $oneStr + * @param '0' $zeroStr + * @param '-1' $minusOneStr + * @param '+1' $plusOneStr + * @param null $null + * @param array{} $emptyArr + * @param 'php' $phpStr + * @param '' $emptyStr + */ + public function sayBool( + $true, + $false, + $one, + $zero, + $minusOne, + $oneStr, + $zeroStr, + $minusOneStr, + $plusOneStr, + $null, + $emptyArr, + $phpStr, + $emptyStr, + bool $bool + ): void + { + assertType('true', $bool == $true); + assertType('false', $bool == $false); + assertType('bool', $bool == $one); + assertType('bool', $bool == $zero); + assertType('bool', $bool == $minusOne); + assertType('bool', $bool == $oneStr); + assertType('bool', $bool == $zeroStr); + assertType('bool', $bool == $minusOneStr); + assertType('bool', $bool == $plusOneStr); + assertType('bool', $bool == $null); + assertType('bool', $bool == $emptyArr); + assertType('bool', $bool == $phpStr); + assertType('bool', $bool == $emptyStr); + } + }