Skip to content

Commit c47c304

Browse files
VincentLangletondrejmirtes
authored andcommitted
Use the same scalar limit for sprintf and concat
1 parent 6c44887 commit c47c304

File tree

4 files changed

+51
-13
lines changed

4 files changed

+51
-13
lines changed

src/Reflection/InitializerExprTypeResolver.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -457,7 +457,7 @@ public function resolveConcatType(Type $left, Type $right): Type
457457
$combinedConstantStringsCount = count($leftConstantStrings) * count($rightConstantStrings);
458458

459459
// we limit the number of union-types for performance reasons
460-
if ($combinedConstantStringsCount > 0 && $combinedConstantStringsCount <= 16) {
460+
if ($combinedConstantStringsCount > 0 && $combinedConstantStringsCount <= self::CALCULATE_SCALARS_LIMIT) {
461461
$strings = [];
462462

463463
foreach ($leftConstantStrings as $leftConstantString) {
Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
<?php declare(strict_types = 1);
2+
3+
namespace Bug13378;
4+
5+
use function PHPStan\Testing\assertType;
6+
7+
function formatMonthConcat(\DateTimeInterface $date, bool $short = false): string
8+
{
9+
$month = $date->format('n');
10+
$prefix = $short ? 'SHORT_' : '';
11+
12+
$formatted = $prefix . 'MONTH_' . $month;
13+
14+
assertType("'MONTH_1'|'MONTH_10'|'MONTH_11'|'MONTH_12'|'MONTH_2'|'MONTH_3'|'MONTH_4'|'MONTH_5'|'MONTH_6'|'MONTH_7'|'MONTH_8'|'MONTH_9'|'SHORT_MONTH_1'|'SHORT_MONTH_10'|'SHORT_MONTH_11'|'SHORT_MONTH_12'|'SHORT_MONTH_2'|'SHORT_MONTH_3'|'SHORT_MONTH_4'|'SHORT_MONTH_5'|'SHORT_MONTH_6'|'SHORT_MONTH_7'|'SHORT_MONTH_8'|'SHORT_MONTH_9'", $formatted);
15+
16+
return $formatted;
17+
}
18+
19+
function formatMonthSprintf(\DateTimeInterface $date, bool $short = false): string
20+
{
21+
$month = $date->format('n');
22+
$prefix = $short ? 'SHORT_' : '';
23+
24+
$formatted = sprintf('%sMONTH_%s', $prefix, $month);
25+
26+
assertType("'MONTH_1'|'MONTH_10'|'MONTH_11'|'MONTH_12'|'MONTH_2'|'MONTH_3'|'MONTH_4'|'MONTH_5'|'MONTH_6'|'MONTH_7'|'MONTH_8'|'MONTH_9'|'SHORT_MONTH_1'|'SHORT_MONTH_10'|'SHORT_MONTH_11'|'SHORT_MONTH_12'|'SHORT_MONTH_2'|'SHORT_MONTH_3'|'SHORT_MONTH_4'|'SHORT_MONTH_5'|'SHORT_MONTH_6'|'SHORT_MONTH_7'|'SHORT_MONTH_8'|'SHORT_MONTH_9'", $formatted);
27+
28+
return $formatted;
29+
}

tests/PHPStan/Analyser/nsrt/constant-string-unions.php

Lines changed: 20 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -59,26 +59,32 @@ public function encapsedString():void
5959
* @param '1'|'2'|'3'|'4'|'5'|'6'|'7'|'8'|'9'|'10'|'11'|'12'|'13'|'14'|'15' $s15
6060
* @param '1'|'2'|'3'|'4'|'5'|'6'|'7'|'8'|'9'|'10'|'11'|'12'|'13'|'14'|'15'|'16' $s16
6161
* @param '1'|'2'|'3'|'4'|'5'|'6'|'7'|'8'|'9'|'10'|'11'|'12'|'13'|'14'|'15'|'16'|'17' $s17
62+
* @param 'a'|'b'|'c'|'d'|'e'|'f'|'g'|'h' $suffix
6263
*/
63-
public function testLimit(string $s15, string $s16, string $s17) {
64+
public function testLimit(string $s15, string $s16, string $s17, string $suffix) {
6465
if (rand(0,1)) {
65-
// doubles the number of elements
66-
$s15 .= 'a';
67-
$s16 .= 'a';
68-
$s17 .= 'a';
66+
// multiply the number of elements by 8
67+
$s15 .= $suffix;
68+
$s16 .= $suffix;
69+
$s17 .= $suffix;
6970
}
70-
// union should contain 30 elements
71-
assertType("'1'|'10'|'10a'|'11'|'11a'|'12'|'12a'|'13'|'13a'|'14'|'14a'|'15'|'15a'|'1a'|'2'|'2a'|'3'|'3a'|'4'|'4a'|'5'|'5a'|'6'|'6a'|'7'|'7a'|'8'|'8a'|'9'|'9a'", $s15);
72-
// union should contain 32 elements
73-
assertType("'1'|'10'|'10a'|'11'|'11a'|'12'|'12a'|'13'|'13a'|'14'|'14a'|'15'|'15a'|'16'|'16a'|'1a'|'2'|'2a'|'3'|'3a'|'4'|'4a'|'5'|'5a'|'6'|'6a'|'7'|'7a'|'8'|'8a'|'9'|'9a'", $s16);
71+
72+
// union should contain 120 elements
73+
assertType("'1'|'10'|'10a'|'10b'|'10c'|'10d'|'10e'|'10f'|'10g'|'10h'|'11'|'11a'|'11b'|'11c'|'11d'|'11e'|'11f'|'11g'|'11h'|'12'|'12a'|'12b'|'12c'|'12d'|'12e'|'12f'|'12g'|'12h'|'13'|'13a'|'13b'|'13c'|'13d'|'13e'|'13f'|'13g'|'13h'|'14'|'14a'|'14b'|'14c'|'14d'|'14e'|'14f'|'14g'|'14h'|'15'|'15a'|'15b'|'15c'|'15d'|'15e'|'15f'|'15g'|'15h'|'1a'|'1b'|'1c'|'1d'|'1e'|'1f'|'1g'|'1h'|'2'|'2a'|'2b'|'2c'|'2d'|'2e'|'2f'|'2g'|'2h'|'3'|'3a'|'3b'|'3c'|'3d'|'3e'|'3f'|'3g'|'3h'|'4'|'4a'|'4b'|'4c'|'4d'|'4e'|'4f'|'4g'|'4h'|'5'|'5a'|'5b'|'5c'|'5d'|'5e'|'5f'|'5g'|'5h'|'6'|'6a'|'6b'|'6c'|'6d'|'6e'|'6f'|'6g'|'6h'|'7'|'7a'|'7b'|'7c'|'7d'|'7e'|'7f'|'7g'|'7h'|'8'|'8a'|'8b'|'8c'|'8d'|'8e'|'8f'|'8g'|'8h'|'9'|'9a'|'9b'|'9c'|'9d'|'9e'|'9f'|'9g'|'9h'", $s15);
74+
// union should contain 128 elements
75+
assertType("'1'|'10'|'10a'|'10b'|'10c'|'10d'|'10e'|'10f'|'10g'|'10h'|'11'|'11a'|'11b'|'11c'|'11d'|'11e'|'11f'|'11g'|'11h'|'12'|'12a'|'12b'|'12c'|'12d'|'12e'|'12f'|'12g'|'12h'|'13'|'13a'|'13b'|'13c'|'13d'|'13e'|'13f'|'13g'|'13h'|'14'|'14a'|'14b'|'14c'|'14d'|'14e'|'14f'|'14g'|'14h'|'15'|'15a'|'15b'|'15c'|'15d'|'15e'|'15f'|'15g'|'15h'|'16'|'16a'|'16b'|'16c'|'16d'|'16e'|'16f'|'16g'|'16h'|'1a'|'1b'|'1c'|'1d'|'1e'|'1f'|'1g'|'1h'|'2'|'2a'|'2b'|'2c'|'2d'|'2e'|'2f'|'2g'|'2h'|'3'|'3a'|'3b'|'3c'|'3d'|'3e'|'3f'|'3g'|'3h'|'4'|'4a'|'4b'|'4c'|'4d'|'4e'|'4f'|'4g'|'4h'|'5'|'5a'|'5b'|'5c'|'5d'|'5e'|'5f'|'5g'|'5h'|'6'|'6a'|'6b'|'6c'|'6d'|'6e'|'6f'|'6g'|'6h'|'7'|'7a'|'7b'|'7c'|'7d'|'7e'|'7f'|'7g'|'7h'|'8'|'8a'|'8b'|'8c'|'8d'|'8e'|'8f'|'8g'|'8h'|'9'|'9a'|'9b'|'9c'|'9d'|'9e'|'9f'|'9g'|'9h'", $s16);
7476
// fallback to the more general form
7577
assertType("literal-string&lowercase-string&non-falsy-string", $s17);
78+
7679
$left = rand() ? 'a' : 'b';
7780
$right = rand() ? 'x' : 'y';
7881
$left .= $right;
7982
$left .= $right;
8083
$left .= $right;
81-
assertType("'axxx'|'axxy'|'axyx'|'axyy'|'ayxx'|'ayxy'|'ayyx'|'ayyy'|'bxxx'|'bxxy'|'bxyx'|'bxyy'|'byxx'|'byxy'|'byyx'|'byyy'", $left);
84+
$left .= $right;
85+
$left .= $right;
86+
$left .= $right;
87+
assertType("'axxxxxx'|'axxxxxy'|'axxxxyx'|'axxxxyy'|'axxxyxx'|'axxxyxy'|'axxxyyx'|'axxxyyy'|'axxyxxx'|'axxyxxy'|'axxyxyx'|'axxyxyy'|'axxyyxx'|'axxyyxy'|'axxyyyx'|'axxyyyy'|'axyxxxx'|'axyxxxy'|'axyxxyx'|'axyxxyy'|'axyxyxx'|'axyxyxy'|'axyxyyx'|'axyxyyy'|'axyyxxx'|'axyyxxy'|'axyyxyx'|'axyyxyy'|'axyyyxx'|'axyyyxy'|'axyyyyx'|'axyyyyy'|'ayxxxxx'|'ayxxxxy'|'ayxxxyx'|'ayxxxyy'|'ayxxyxx'|'ayxxyxy'|'ayxxyyx'|'ayxxyyy'|'ayxyxxx'|'ayxyxxy'|'ayxyxyx'|'ayxyxyy'|'ayxyyxx'|'ayxyyxy'|'ayxyyyx'|'ayxyyyy'|'ayyxxxx'|'ayyxxxy'|'ayyxxyx'|'ayyxxyy'|'ayyxyxx'|'ayyxyxy'|'ayyxyyx'|'ayyxyyy'|'ayyyxxx'|'ayyyxxy'|'ayyyxyx'|'ayyyxyy'|'ayyyyxx'|'ayyyyxy'|'ayyyyyx'|'ayyyyyy'|'bxxxxxx'|'bxxxxxy'|'bxxxxyx'|'bxxxxyy'|'bxxxyxx'|'bxxxyxy'|'bxxxyyx'|'bxxxyyy'|'bxxyxxx'|'bxxyxxy'|'bxxyxyx'|'bxxyxyy'|'bxxyyxx'|'bxxyyxy'|'bxxyyyx'|'bxxyyyy'|'bxyxxxx'|'bxyxxxy'|'bxyxxyx'|'bxyxxyy'|'bxyxyxx'|'bxyxyxy'|'bxyxyyx'|'bxyxyyy'|'bxyyxxx'|'bxyyxxy'|'bxyyxyx'|'bxyyxyy'|'bxyyyxx'|'bxyyyxy'|'bxyyyyx'|'bxyyyyy'|'byxxxxx'|'byxxxxy'|'byxxxyx'|'byxxxyy'|'byxxyxx'|'byxxyxy'|'byxxyyx'|'byxxyyy'|'byxyxxx'|'byxyxxy'|'byxyxyx'|'byxyxyy'|'byxyyxx'|'byxyyxy'|'byxyyyx'|'byxyyyy'|'byyxxxx'|'byyxxxy'|'byyxxyx'|'byyxxyy'|'byyxyxx'|'byyxyxy'|'byyxyyx'|'byyxyyy'|'byyyxxx'|'byyyxxy'|'byyyxyx'|'byyyxyy'|'byyyyxx'|'byyyyxy'|'byyyyyx'|'byyyyyy'", $left);
8288
$left .= $right;
8389
assertType("literal-string&lowercase-string&non-falsy-string", $left);
8490

@@ -87,7 +93,10 @@ public function testLimit(string $s15, string $s16, string $s17) {
8793
$left = "{$left}{$right}";
8894
$left = "{$left}{$right}";
8995
$left = "{$left}{$right}";
90-
assertType("'axxx'|'axxy'|'axyx'|'axyy'|'ayxx'|'ayxy'|'ayyx'|'ayyy'|'bxxx'|'bxxy'|'bxyx'|'bxyy'|'byxx'|'byxy'|'byyx'|'byyy'", $left);
96+
$left = "{$left}{$right}";
97+
$left = "{$left}{$right}";
98+
$left = "{$left}{$right}";
99+
assertType("'axxxxxx'|'axxxxxy'|'axxxxyx'|'axxxxyy'|'axxxyxx'|'axxxyxy'|'axxxyyx'|'axxxyyy'|'axxyxxx'|'axxyxxy'|'axxyxyx'|'axxyxyy'|'axxyyxx'|'axxyyxy'|'axxyyyx'|'axxyyyy'|'axyxxxx'|'axyxxxy'|'axyxxyx'|'axyxxyy'|'axyxyxx'|'axyxyxy'|'axyxyyx'|'axyxyyy'|'axyyxxx'|'axyyxxy'|'axyyxyx'|'axyyxyy'|'axyyyxx'|'axyyyxy'|'axyyyyx'|'axyyyyy'|'ayxxxxx'|'ayxxxxy'|'ayxxxyx'|'ayxxxyy'|'ayxxyxx'|'ayxxyxy'|'ayxxyyx'|'ayxxyyy'|'ayxyxxx'|'ayxyxxy'|'ayxyxyx'|'ayxyxyy'|'ayxyyxx'|'ayxyyxy'|'ayxyyyx'|'ayxyyyy'|'ayyxxxx'|'ayyxxxy'|'ayyxxyx'|'ayyxxyy'|'ayyxyxx'|'ayyxyxy'|'ayyxyyx'|'ayyxyyy'|'ayyyxxx'|'ayyyxxy'|'ayyyxyx'|'ayyyxyy'|'ayyyyxx'|'ayyyyxy'|'ayyyyyx'|'ayyyyyy'|'bxxxxxx'|'bxxxxxy'|'bxxxxyx'|'bxxxxyy'|'bxxxyxx'|'bxxxyxy'|'bxxxyyx'|'bxxxyyy'|'bxxyxxx'|'bxxyxxy'|'bxxyxyx'|'bxxyxyy'|'bxxyyxx'|'bxxyyxy'|'bxxyyyx'|'bxxyyyy'|'bxyxxxx'|'bxyxxxy'|'bxyxxyx'|'bxyxxyy'|'bxyxyxx'|'bxyxyxy'|'bxyxyyx'|'bxyxyyy'|'bxyyxxx'|'bxyyxxy'|'bxyyxyx'|'bxyyxyy'|'bxyyyxx'|'bxyyyxy'|'bxyyyyx'|'bxyyyyy'|'byxxxxx'|'byxxxxy'|'byxxxyx'|'byxxxyy'|'byxxyxx'|'byxxyxy'|'byxxyyx'|'byxxyyy'|'byxyxxx'|'byxyxxy'|'byxyxyx'|'byxyxyy'|'byxyyxx'|'byxyyxy'|'byxyyyx'|'byxyyyy'|'byyxxxx'|'byyxxxy'|'byyxxyx'|'byyxxyy'|'byyxyxx'|'byyxyxy'|'byyxyyx'|'byyxyyy'|'byyyxxx'|'byyyxxy'|'byyyxyx'|'byyyxyy'|'byyyyxx'|'byyyyxy'|'byyyyyx'|'byyyyyy'", $left);
91100
$left = "{$left}{$right}";
92101
assertType("literal-string&lowercase-string&non-falsy-string", $left);
93102
}

tests/PHPStan/Rules/Functions/CallToFunctionParametersRuleTest.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -663,7 +663,7 @@ public function testArrayUdiffCallback(): void
663663
6,
664664
],
665665
[
666-
'Parameter #3 $data_comp_func of function array_udiff expects callable(1|2|3|4|5|6, 1|2|3|4|5|6): int, Closure(int, int): (literal-string&lowercase-string&non-falsy-string&numeric-string&uppercase-string) given.',
666+
"Parameter #3 \$data_comp_func of function array_udiff expects callable(1|2|3|4|5|6, 1|2|3|4|5|6): int, Closure(int, int): ('11'|'12'|'13'|'14'|'15'|'16'|'21'|'22'|'23'|'24'|'25'|'26'|'31'|'32'|'33'|'34'|'35'|'36'|'41'|'42'|'43'|'44'|'45'|'46'|'51'|'52'|'53'|'54'|'55'|'56'|'61'|'62'|'63'|'64'|'65'|'66') given.",
667667
14,
668668
],
669669
[

0 commit comments

Comments
 (0)