Skip to content

Commit b5ecab0

Browse files
Improve loose comparison on uppercase/lowercase string
Co-Authored-By: Vincent Langlet <[email protected]>
1 parent 07c6a0d commit b5ecab0

File tree

3 files changed

+28
-17
lines changed

3 files changed

+28
-17
lines changed

src/Type/Accessory/AccessoryLowercaseStringType.php

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111
use PHPStan\Type\BooleanType;
1212
use PHPStan\Type\CompoundType;
1313
use PHPStan\Type\Constant\ConstantArrayType;
14+
use PHPStan\Type\Constant\ConstantBooleanType;
1415
use PHPStan\Type\Constant\ConstantIntegerType;
1516
use PHPStan\Type\ErrorType;
1617
use PHPStan\Type\FloatType;
@@ -326,6 +327,10 @@ public function isScalar(): TrinaryLogic
326327

327328
public function looseCompare(Type $type, PhpVersion $phpVersion): BooleanType
328329
{
330+
if ($type->isString()->yes() && $type->isLowercaseString()->no()) {
331+
return new ConstantBooleanType(false);
332+
}
333+
329334
return new BooleanType();
330335
}
331336

src/Type/Accessory/AccessoryUppercaseStringType.php

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111
use PHPStan\Type\BooleanType;
1212
use PHPStan\Type\CompoundType;
1313
use PHPStan\Type\Constant\ConstantArrayType;
14+
use PHPStan\Type\Constant\ConstantBooleanType;
1415
use PHPStan\Type\Constant\ConstantIntegerType;
1516
use PHPStan\Type\ErrorType;
1617
use PHPStan\Type\FloatType;
@@ -326,6 +327,10 @@ public function isScalar(): TrinaryLogic
326327

327328
public function looseCompare(Type $type, PhpVersion $phpVersion): BooleanType
328329
{
330+
if ($type->isString()->yes() && $type->isUppercaseString()->no()) {
331+
return new ConstantBooleanType(false);
332+
}
333+
329334
return new BooleanType();
330335
}
331336

tests/PHPStan/Analyser/nsrt/loose-comparisons.php

Lines changed: 18 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -717,28 +717,21 @@ public function sayIntersection(
717717
): void
718718
{
719719
assertType('bool', '' == $upper);
720-
if ($upper != '') {
721-
assertType('false', '' == $upper);
722-
}
723720
assertType('bool', '0' == $upper);
724-
assertType('bool', 'a' == $upper); // should be false
725-
assertType('bool', 'abc' == $upper); // should be false
726-
assertType('bool', 'aBc' == $upper);
721+
assertType('false', 'a' == $upper);
722+
assertType('false', 'abc' == $upper);
723+
assertType('false', 'aBc' == $upper);
727724
assertType('bool', strtoupper($s) == $upper);
728-
assertType('bool', strtolower($s) == $upper); // should be false
729-
assertType('bool', $upper == $lower); // should be false
725+
assertType('bool', strtolower($s) == $upper);
726+
assertType('bool', $upper == $lower);
730727

731-
assertType('bool', '' == $lower);
732-
if ($lower != '') {
733-
assertType('false', '' == $lower);
734-
}
735728
assertType('bool', '0' == $lower);
736-
assertType('bool', 'A' == $lower); // should be false
737-
assertType('bool', 'ABC' == $lower); // should be false
738-
assertType('bool', 'AbC' == $lower);
739-
assertType('bool', strtoupper($s) == $lower); // should be false
729+
assertType('false', 'A' == $lower);
730+
assertType('false', 'ABC' == $lower);
731+
assertType('false', 'AbC' == $lower);
732+
assertType('bool', strtoupper($s) == $lower);
740733
assertType('bool', strtolower($s) == $lower);
741-
assertType('bool', $lower == $upper); // should be false
734+
assertType('bool', $lower == $upper);
742735

743736
assertType('false', $arr == $i);
744737
assertType('false', $nonEmptyArr == $i);
@@ -748,6 +741,14 @@ public function sayIntersection(
748741
assertType('false', $nonEmptyArr == $emptyArr);
749742
assertType('bool', $arr == $nonEmptyArr);
750743
assertType('bool', $nonEmptyArr == $arr);
744+
745+
assertType('bool', '' == $lower);
746+
if ($lower != '') {
747+
assertType('false', '' == $lower);
748+
}
749+
if ($upper != '') {
750+
assertType('false', '' == $upper);
751+
}
751752
}
752753

753754
}

0 commit comments

Comments
 (0)