Skip to content

Commit 328b6ad

Browse files
VincentLangletondrejmirtes
authored andcommitted
Int::toString is lowercase
1 parent 83ba597 commit 328b6ad

19 files changed

+74
-69
lines changed

src/Type/IntegerRangeType.php

+3
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010
use PHPStan\PhpDocParser\Ast\Type\TypeNode;
1111
use PHPStan\Reflection\InitializerExprTypeResolver;
1212
use PHPStan\TrinaryLogic;
13+
use PHPStan\Type\Accessory\AccessoryLowercaseStringType;
1314
use PHPStan\Type\Accessory\AccessoryNonFalsyStringType;
1415
use PHPStan\Type\Accessory\AccessoryNumericStringType;
1516
use PHPStan\Type\Constant\ConstantBooleanType;
@@ -474,13 +475,15 @@ public function toString(): Type
474475
if ($isZero->no()) {
475476
return new IntersectionType([
476477
new StringType(),
478+
new AccessoryLowercaseStringType(),
477479
new AccessoryNumericStringType(),
478480
new AccessoryNonFalsyStringType(),
479481
]);
480482
}
481483

482484
return new IntersectionType([
483485
new StringType(),
486+
new AccessoryLowercaseStringType(),
484487
new AccessoryNumericStringType(),
485488
]);
486489
}

src/Type/IntegerType.php

+2
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
use PHPStan\PhpDocParser\Ast\Type\IdentifierTypeNode;
77
use PHPStan\PhpDocParser\Ast\Type\TypeNode;
88
use PHPStan\TrinaryLogic;
9+
use PHPStan\Type\Accessory\AccessoryLowercaseStringType;
910
use PHPStan\Type\Accessory\AccessoryNumericStringType;
1011
use PHPStan\Type\Constant\ConstantArrayType;
1112
use PHPStan\Type\Constant\ConstantIntegerType;
@@ -81,6 +82,7 @@ public function toString(): Type
8182
{
8283
return new IntersectionType([
8384
new StringType(),
85+
new AccessoryLowercaseStringType(),
8486
new AccessoryNumericStringType(),
8587
]);
8688
}

tests/PHPStan/Analyser/nsrt/array-key-exists.php

+4-4
Original file line numberDiff line numberDiff line change
@@ -50,16 +50,16 @@ public function doBar(array $a, array $b, array $c, int $key1, string $key2, int
5050
assertType('int', $key1);
5151
}
5252
if (array_key_exists($key2, $a)) {
53-
assertType('numeric-string', $key2);
53+
assertType('lowercase-string&numeric-string', $key2);
5454
}
5555
if (array_key_exists($key3, $a)) {
56-
assertType('int|numeric-string', $key3);
56+
assertType('int|(lowercase-string&numeric-string)', $key3);
5757
}
5858
if (array_key_exists($key4, $a)) {
59-
assertType('(int|numeric-string)', $key4);
59+
assertType('(int|(lowercase-string&numeric-string))', $key4);
6060
}
6161
if (array_key_exists($key5, $a)) {
62-
assertType('int|numeric-string', $key5);
62+
assertType('int|(lowercase-string&numeric-string)', $key5);
6363
}
6464

6565
if (array_key_exists($key1, $b)) {

tests/PHPStan/Analyser/nsrt/bug-10863.php

+2-2
Original file line numberDiff line numberDiff line change
@@ -12,15 +12,15 @@ class Foo
1212
*/
1313
public function doFoo($b): void
1414
{
15-
assertType('non-falsy-string', '@' . $b);
15+
assertType('lowercase-string&non-falsy-string', '@' . $b);
1616
}
1717

1818
/**
1919
* @param int|false $b
2020
*/
2121
public function doFoo2($b): void
2222
{
23-
assertType('non-falsy-string', '@' . $b);
23+
assertType('lowercase-string&non-falsy-string', '@' . $b);
2424
}
2525

2626
}

tests/PHPStan/Analyser/nsrt/bug-11129.php

+26-26
Original file line numberDiff line numberDiff line change
@@ -21,14 +21,14 @@ public function foo(
2121
$maybeNegativeConstStrings, $maybeNonNumericConstStrings, $maybeFloatConstStrings,
2222
bool $bool, float $float
2323
): void {
24-
assertType('non-falsy-string', '0'.$i);
25-
assertType('non-falsy-string&numeric-string', $i.'0');
24+
assertType('lowercase-string&non-falsy-string', '0'.$i);
25+
assertType('lowercase-string&non-falsy-string&numeric-string', $i.'0');
2626

27-
assertType('non-falsy-string&numeric-string', '0'.$positiveInt);
28-
assertType('non-falsy-string&numeric-string', $positiveInt.'0');
27+
assertType('lowercase-string&non-falsy-string&numeric-string', '0'.$positiveInt);
28+
assertType('lowercase-string&non-falsy-string&numeric-string', $positiveInt.'0');
2929

30-
assertType('non-falsy-string', '0'.$negativeInt);
31-
assertType('non-falsy-string&numeric-string', $negativeInt.'0');
30+
assertType('lowercase-string&non-falsy-string', '0'.$negativeInt);
31+
assertType('lowercase-string&non-falsy-string&numeric-string', $negativeInt.'0');
3232

3333
assertType("'00'|'01'|'02'", '0'.$positiveConstStrings);
3434
assertType( "'00'|'10'|'20'", $positiveConstStrings.'0');
@@ -39,29 +39,29 @@ public function foo(
3939
assertType("'00'|'01'|'0a'", '0'.$maybeNonNumericConstStrings);
4040
assertType("'00'|'10'|'a0'", $maybeNonNumericConstStrings.'0');
4141

42-
assertType('non-falsy-string&numeric-string', $i.$positiveConstStrings);
43-
assertType( 'non-falsy-string', $positiveConstStrings.$i);
42+
assertType('lowercase-string&non-falsy-string&numeric-string', $i.$positiveConstStrings);
43+
assertType('lowercase-string&non-falsy-string', $positiveConstStrings.$i);
4444

45-
assertType('non-falsy-string', $i.$maybeNegativeConstStrings);
46-
assertType('non-falsy-string', $maybeNegativeConstStrings.$i);
45+
assertType('lowercase-string&non-falsy-string', $i.$maybeNegativeConstStrings);
46+
assertType('lowercase-string&non-falsy-string', $maybeNegativeConstStrings.$i);
4747

48-
assertType('non-falsy-string', $i.$maybeNonNumericConstStrings);
49-
assertType('non-falsy-string', $maybeNonNumericConstStrings.$i);
48+
assertType('lowercase-string&non-falsy-string', $i.$maybeNonNumericConstStrings);
49+
assertType('lowercase-string&non-falsy-string', $maybeNonNumericConstStrings.$i);
5050

51-
assertType('non-falsy-string', $i.$maybeFloatConstStrings); // could be 'non-falsy-string&numeric-string'
52-
assertType('non-falsy-string', $maybeFloatConstStrings.$i);
51+
assertType('lowercase-string&non-falsy-string', $i.$maybeFloatConstStrings); // could be 'lowercase-string&non-falsy-string&numeric-string'
52+
assertType('lowercase-string&non-falsy-string', $maybeFloatConstStrings.$i);
5353

54-
assertType('non-empty-string&numeric-string', $i.$bool);
55-
assertType('non-empty-string', $bool.$i);
56-
assertType('non-falsy-string&numeric-string', $positiveInt.$bool);
57-
assertType('non-falsy-string&numeric-string', $bool.$positiveInt);
58-
assertType('non-falsy-string&numeric-string', $negativeInt.$bool);
59-
assertType('non-falsy-string', $bool.$negativeInt);
54+
assertType('lowercase-string&non-empty-string&numeric-string', $i.$bool);
55+
assertType('lowercase-string&non-empty-string', $bool.$i);
56+
assertType('lowercase-string&non-falsy-string&numeric-string', $positiveInt.$bool);
57+
assertType('lowercase-string&non-falsy-string&numeric-string', $bool.$positiveInt);
58+
assertType('lowercase-string&non-falsy-string&numeric-string', $negativeInt.$bool);
59+
assertType('lowercase-string&non-falsy-string', $bool.$negativeInt);
6060

61-
assertType('non-falsy-string', $i.$i);
62-
assertType('non-falsy-string', $negativeInt.$negativeInt);
63-
assertType('non-falsy-string', $maybeNegativeConstStrings.$negativeInt);
64-
assertType('non-falsy-string', $negativeInt.$maybeNegativeConstStrings);
61+
assertType('lowercase-string&non-falsy-string', $i.$i);
62+
assertType('lowercase-string&non-falsy-string', $negativeInt.$negativeInt);
63+
assertType('lowercase-string&non-falsy-string', $maybeNegativeConstStrings.$negativeInt);
64+
assertType('lowercase-string&non-falsy-string', $negativeInt.$maybeNegativeConstStrings);
6565

6666
// https://3v4l.org/BCS2K
6767
assertType('non-falsy-string', $float.$float);
@@ -75,9 +75,9 @@ public function foo(
7575
// https://3v4l.org/Ia4r0
7676
$scientificFloatAsString = '3e4';
7777
assertType('non-falsy-string', $numericString.$scientificFloatAsString);
78-
assertType('non-falsy-string', $i.$scientificFloatAsString);
78+
assertType('lowercase-string&non-falsy-string', $i.$scientificFloatAsString);
7979
assertType('non-falsy-string', $scientificFloatAsString.$numericString);
80-
assertType('non-falsy-string', $scientificFloatAsString.$i);
80+
assertType('lowercase-string&non-falsy-string', $scientificFloatAsString.$i);
8181
}
8282

8383
}

tests/PHPStan/Analyser/nsrt/bug-11716.php

+1-1
Original file line numberDiff line numberDiff line change
@@ -75,7 +75,7 @@ function narrowKey($mixed, string $s, int $i, array $generalArr, array $intKeyed
7575
assertType('int', $i);
7676

7777
if (isset($intKeyedArr[$s])) {
78-
assertType("numeric-string", $s);
78+
assertType("lowercase-string&numeric-string", $s);
7979
} else {
8080
assertType('string', $s);
8181
}

tests/PHPStan/Analyser/nsrt/bug-4587.php

+2-2
Original file line numberDiff line numberDiff line change
@@ -27,11 +27,11 @@ public function b(): void
2727
$type = array_map(static function (array $result): array {
2828
assertType('array{a: int}', $result);
2929
$result['a'] = (string) $result['a'];
30-
assertType('array{a: numeric-string}', $result);
30+
assertType('array{a: lowercase-string&numeric-string}', $result);
3131

3232
return $result;
3333
}, $results);
3434

35-
assertType('list<array{a: numeric-string}>', $type);
35+
assertType('list<array{a: lowercase-string&numeric-string}>', $type);
3636
}
3737
}

tests/PHPStan/Analyser/nsrt/bug-7387.php

+4-4
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@ public function inputTypes(int $i, float $f, string $s, int $intRange) {
2929

3030
public function specifiers(int $i) {
3131
// https://3v4l.org/fmVIg
32-
assertType('numeric-string', sprintf('%14s', $i));
32+
assertType('lowercase-string&numeric-string', sprintf('%14s', $i));
3333

3434
assertType('numeric-string', sprintf('%d', $i));
3535

@@ -59,9 +59,9 @@ public function specifiers(int $i) {
5959
*/
6060
public function positionalArgs($mixed, int $i, float $f, string $s, int $posInt, int $negInt, int $nonZeroIntRange, int $intRange) {
6161
// https://3v4l.org/vVL0c
62-
assertType('numeric-string', sprintf('%2$6s', $mixed, $i));
63-
assertType('non-falsy-string&numeric-string', sprintf('%2$6s', $mixed, $posInt));
64-
assertType('non-falsy-string&numeric-string', sprintf('%2$6s', $mixed, $negInt));
62+
assertType('lowercase-string&numeric-string', sprintf('%2$6s', $mixed, $i));
63+
assertType('lowercase-string&non-falsy-string&numeric-string', sprintf('%2$6s', $mixed, $posInt));
64+
assertType('lowercase-string&non-falsy-string&numeric-string', sprintf('%2$6s', $mixed, $negInt));
6565
assertType("' 1'|' 2'|' 3'|' 4'|' 5'", sprintf('%2$6s', $mixed, $nonZeroIntRange));
6666

6767
// https://3v4l.org/1ECIq

tests/PHPStan/Analyser/nsrt/bug-8568.php

+1-1
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ class HelloWorld
88
{
99
public function sayHello(): void
1010
{
11-
assertType('non-falsy-string', 'a' . $this->get());
11+
assertType('lowercase-string&non-falsy-string', 'a' . $this->get());
1212
}
1313

1414
public function get(): ?int

tests/PHPStan/Analyser/nsrt/bug-8635.php

+1-1
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,6 @@ class HelloWorld
88
{
99
public function EchoInt(int $value): void
1010
{
11-
assertType('numeric-string', "$value");
11+
assertType('lowercase-string&numeric-string', "$value");
1212
}
1313
}

tests/PHPStan/Analyser/nsrt/cast-to-numeric-string.php

+14-14
Original file line numberDiff line numberDiff line change
@@ -13,13 +13,13 @@
1313
* @param 1 $constantInt
1414
*/
1515
function foo(int $a, float $b, $numeric, $numeric2, $number, $positive, $negative, $constantInt): void {
16-
assertType('numeric-string', (string)$a);
16+
assertType('lowercase-string&numeric-string', (string)$a);
1717
assertType('numeric-string', (string)$b);
1818
assertType('numeric-string', (string)$numeric);
1919
assertType('numeric-string', (string)$numeric2);
2020
assertType('numeric-string', (string)$number);
21-
assertType('non-falsy-string&numeric-string', (string)$positive);
22-
assertType('non-falsy-string&numeric-string', (string)$negative);
21+
assertType('lowercase-string&non-falsy-string&numeric-string', (string)$positive);
22+
assertType('lowercase-string&non-falsy-string&numeric-string', (string)$negative);
2323
assertType("'1'", (string)$constantInt);
2424
}
2525

@@ -32,28 +32,28 @@ function foo(int $a, float $b, $numeric, $numeric2, $number, $positive, $negativ
3232
* @param 1 $constantInt
3333
*/
3434
function concatEmptyString(int $a, float $b, $numeric, $numeric2, $number, $positive, $negative, $constantInt): void {
35-
assertType('numeric-string', '' . $a);
35+
assertType('lowercase-string&numeric-string', '' . $a);
3636
assertType('numeric-string', '' . $b);
3737
assertType('numeric-string', '' . $numeric);
3838
assertType('numeric-string', '' . $numeric2);
3939
assertType('numeric-string', '' . $number);
40-
assertType('non-falsy-string&numeric-string', '' . $positive);
41-
assertType('non-falsy-string&numeric-string', '' . $negative);
40+
assertType('lowercase-string&non-falsy-string&numeric-string', '' . $positive);
41+
assertType('lowercase-string&non-falsy-string&numeric-string', '' . $negative);
4242
assertType("'1'", '' . $constantInt);
4343

44-
assertType('numeric-string', $a . '');
44+
assertType('lowercase-string&numeric-string', $a . '');
4545
assertType('numeric-string', $b . '');
4646
assertType('numeric-string', $numeric . '');
4747
assertType('numeric-string', $numeric2 . '');
4848
assertType('numeric-string', $number . '');
49-
assertType('non-falsy-string&numeric-string', $positive . '');
50-
assertType('non-falsy-string&numeric-string', $negative . '');
49+
assertType('lowercase-string&non-falsy-string&numeric-string', $positive . '');
50+
assertType('lowercase-string&non-falsy-string&numeric-string', $negative . '');
5151
assertType("'1'", $constantInt . '');
5252
}
5353

5454
function concatAssignEmptyString(int $i, float $f) {
5555
$i .= '';
56-
assertType('numeric-string', $i);
56+
assertType('lowercase-string&numeric-string', $i);
5757

5858
$s = '';
5959
$s .= $f;
@@ -66,13 +66,13 @@ function concatAssignEmptyString(int $i, float $f) {
6666
*/
6767
function integerRangeToString($positive, $negative)
6868
{
69-
assertType('numeric-string', (string) $positive);
70-
assertType('numeric-string', (string) $negative);
69+
assertType('lowercase-string&numeric-string', (string) $positive);
70+
assertType('lowercase-string&numeric-string', (string) $negative);
7171

7272
if ($positive !== 0) {
73-
assertType('non-falsy-string&numeric-string', (string) $positive);
73+
assertType('lowercase-string&non-falsy-string&numeric-string', (string) $positive);
7474
}
7575
if ($negative !== 0) {
76-
assertType('non-falsy-string&numeric-string', (string) $negative);
76+
assertType('lowercase-string&non-falsy-string&numeric-string', (string) $negative);
7777
}
7878
}

tests/PHPStan/Analyser/nsrt/filter-var.php

+1-1
Original file line numberDiff line numberDiff line change
@@ -158,7 +158,7 @@ public function scalars(bool $bool, float $float, int $int, string $string, int
158158
assertType("'17'", filter_var(17.0));
159159
assertType("'17.1'", filter_var(17.1));
160160
assertType("'1.0E-50'", filter_var(1e-50));
161-
assertType('numeric-string', filter_var($int));
161+
assertType('lowercase-string&numeric-string', filter_var($int));
162162
assertType("'0'|'1'|'2'|'3'|'4'|'5'|'6'|'7'|'8'|'9'", filter_var($intRange));
163163
assertType("'17'", filter_var(17));
164164
assertType('string', filter_var($string));

tests/PHPStan/Analyser/nsrt/generics.php

+3-3
Original file line numberDiff line numberDiff line change
@@ -147,10 +147,10 @@ function f($a, $b)
147147
*/
148148
function testF($arrayOfInt, $callableOrNull)
149149
{
150-
assertType('Closure(int): numeric-string', function (int $a): string {
150+
assertType('Closure(int): (lowercase-string&numeric-string)', function (int $a): string {
151151
return (string)$a;
152152
});
153-
assertType('array<numeric-string>', f($arrayOfInt, function (int $a): string {
153+
assertType('array<lowercase-string&numeric-string>', f($arrayOfInt, function (int $a): string {
154154
return (string)$a;
155155
}));
156156
assertType('Closure(mixed): string', function ($a): string {
@@ -224,7 +224,7 @@ function testArrayMap(array $listOfIntegers)
224224

225225
return (string) $int;
226226
}, $listOfIntegers);
227-
assertType('array<numeric-string>', $strings);
227+
assertType('array<lowercase-string&numeric-string>', $strings);
228228
}
229229

230230
/**

tests/PHPStan/Analyser/nsrt/key-exists.php

+4-4
Original file line numberDiff line numberDiff line change
@@ -49,16 +49,16 @@ public function doBar(array $a, array $b, array $c, int $key1, string $key2, int
4949
assertType('int', $key1);
5050
}
5151
if (key_exists($key2, $a)) {
52-
assertType('numeric-string', $key2);
52+
assertType('lowercase-string&numeric-string', $key2);
5353
}
5454
if (key_exists($key3, $a)) {
55-
assertType('int|numeric-string', $key3);
55+
assertType('int|(lowercase-string&numeric-string)', $key3);
5656
}
5757
if (key_exists($key4, $a)) {
58-
assertType('(int|numeric-string)', $key4);
58+
assertType('(int|(lowercase-string&numeric-string))', $key4);
5959
}
6060
if (key_exists($key5, $a)) {
61-
assertType('int|numeric-string', $key5);
61+
assertType('int|(lowercase-string&numeric-string)', $key5);
6262
}
6363

6464
if (key_exists($key1, $b)) {

tests/PHPStan/Analyser/nsrt/range-to-string.php

+1-1
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,6 @@ public function sayHello($i, $ii, $maxlong, $toolong): void
1717
assertType("'10'|'5'|'6'|'7'|'8'|'9'", (string) $i);
1818
assertType("'-1'|'-10'|'-2'|'-3'|'-4'|'-5'|'-6'|'-7'|'-8'|'-9'|'0'|'1'|'10'|'2'|'3'|'4'|'5'|'6'|'7'|'8'|'9'", (string) $ii);
1919
assertType("'0'|'1'|'10'|'100'|'101'|'102'|'103'|'104'|'105'|'106'|'107'|'108'|'109'|'11'|'110'|'111'|'112'|'113'|'114'|'115'|'116'|'117'|'118'|'119'|'12'|'120'|'121'|'122'|'123'|'124'|'125'|'126'|'127'|'128'|'13'|'14'|'15'|'16'|'17'|'18'|'19'|'2'|'20'|'21'|'22'|'23'|'24'|'25'|'26'|'27'|'28'|'29'|'3'|'30'|'31'|'32'|'33'|'34'|'35'|'36'|'37'|'38'|'39'|'4'|'40'|'41'|'42'|'43'|'44'|'45'|'46'|'47'|'48'|'49'|'5'|'50'|'51'|'52'|'53'|'54'|'55'|'56'|'57'|'58'|'59'|'6'|'60'|'61'|'62'|'63'|'64'|'65'|'66'|'67'|'68'|'69'|'7'|'70'|'71'|'72'|'73'|'74'|'75'|'76'|'77'|'78'|'79'|'8'|'80'|'81'|'82'|'83'|'84'|'85'|'86'|'87'|'88'|'89'|'9'|'90'|'91'|'92'|'93'|'94'|'95'|'96'|'97'|'98'|'99'", (string) $maxlong);
20-
assertType("numeric-string", (string) $toolong);
20+
assertType("lowercase-string&numeric-string", (string) $toolong);
2121
}
2222
}

tests/PHPStan/Analyser/nsrt/set-type-type-specifying.php

+1-1
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ function doString(string $s, int $i, float $f, array $a, object $o)
1111
assertType('string', $s);
1212

1313
settype($i, 'string');
14-
assertType('numeric-string', $i);
14+
assertType('lowercase-string&numeric-string', $i);
1515

1616
settype($f, 'string');
1717
assertType('numeric-string', $f);

tests/PHPStan/Analyser/nsrt/strval.php

+2-2
Original file line numberDiff line numberDiff line change
@@ -17,9 +17,9 @@ function strvalTest(string $string, string $class): void
1717
assertType('\'1\'', strval(true));
1818
assertType('\'\'|\'1\'', strval(rand(0, 1) === 0));
1919
assertType('\'42\'', strval(42));
20-
assertType('numeric-string', strval(rand()));
20+
assertType('lowercase-string&numeric-string', strval(rand()));
2121
assertType('numeric-string', strval(rand() * 0.1));
22-
assertType('numeric-string', strval(strval(rand())));
22+
assertType('lowercase-string&numeric-string', strval(strval(rand())));
2323
assertType('class-string<stdClass>', strval($class));
2424
assertType('string', strval(new \Exception()));
2525
assertType('*ERROR*', strval(new \stdClass()));

tests/PHPStan/Rules/DeadCode/data/bug-8620.php

+1-1
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ class HelloWorld
99
public function nullCoalesceAndConcatenation (?int $a = null): int
1010
{
1111
$key = ($a ?? "x") . "-";
12-
assertType('non-falsy-string', $key);
12+
assertType('lowercase-string&non-falsy-string', $key);
1313
if ($key === "x-") { return 0; }
1414

1515
return 1;

tests/PHPStan/Rules/Generics/data/bug-6301.php

+1-1
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ public function str($s)
2222
* @param literal-string $literalString
2323
*/
2424
public function foo(int $i, $nonEmpty, $numericString, $literalString):void {
25-
assertType('numeric-string', $this->str((string) $i));
25+
assertType('lowercase-string&numeric-string', $this->str((string) $i));
2626
assertType('non-empty-string', $this->str($nonEmpty));
2727
assertType('numeric-string', $this->str($numericString));
2828
assertType('literal-string', $this->str($literalString));

0 commit comments

Comments
 (0)