Skip to content

Commit b5e93d5

Browse files
committed
Mark array_filter, array_map, and array_reduce as pure functions
- Added array_filter, array_map, and array_reduce to bin/functionMetadata_original.php with hasSideEffects => false - Regenerated resources/functionMetadata.php to include the new entries - Callback impure points are already tracked separately via processArgs, so impure callbacks will still be detected - Updated tests/PHPStan/Command/data/file-without-errors.php to assign array_filter result (now correctly flagged as no-effect) - New regression test in tests/PHPStan/Rules/Functions/data/bug-11101.php
1 parent 106fc93 commit b5e93d5

5 files changed

Lines changed: 48 additions & 1 deletion

File tree

bin/functionMetadata_original.php

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818
'array_diff_ukey' => ['hasSideEffects' => false],
1919
'array_fill' => ['hasSideEffects' => false],
2020
'array_fill_keys' => ['hasSideEffects' => false],
21+
'array_filter' => ['hasSideEffects' => false],
2122
'array_flip' => ['hasSideEffects' => false],
2223
'array_intersect' => ['hasSideEffects' => false],
2324
'array_intersect_assoc' => ['hasSideEffects' => false],
@@ -28,13 +29,15 @@
2829
'array_key_last' => ['hasSideEffects' => false],
2930
'array_key_exists' => ['hasSideEffects' => false],
3031
'array_keys' => ['hasSideEffects' => false],
32+
'array_map' => ['hasSideEffects' => false],
3133
'array_merge' => ['hasSideEffects' => false],
3234
'array_merge_recursive' => ['hasSideEffects' => false],
3335
'array_pad' => ['hasSideEffects' => false],
3436
'array_pop' => ['hasSideEffects' => true],
3537
'array_product' => ['hasSideEffects' => false],
3638
'array_push' => ['hasSideEffects' => true],
3739
'array_rand' => ['hasSideEffects' => false],
40+
'array_reduce' => ['hasSideEffects' => false],
3841
'array_replace' => ['hasSideEffects' => false],
3942
'array_replace_recursive' => ['hasSideEffects' => false],
4043
'array_reverse' => ['hasSideEffects' => false],

resources/functionMetadata.php

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -724,6 +724,7 @@
724724
'array_diff_ukey' => ['hasSideEffects' => false],
725725
'array_fill' => ['hasSideEffects' => false],
726726
'array_fill_keys' => ['hasSideEffects' => false],
727+
'array_filter' => ['hasSideEffects' => false],
727728
'array_first' => ['hasSideEffects' => false],
728729
'array_flip' => ['hasSideEffects' => false],
729730
'array_intersect' => ['hasSideEffects' => false],
@@ -737,13 +738,15 @@
737738
'array_key_last' => ['hasSideEffects' => false],
738739
'array_keys' => ['hasSideEffects' => false],
739740
'array_last' => ['hasSideEffects' => false],
741+
'array_map' => ['hasSideEffects' => false],
740742
'array_merge' => ['hasSideEffects' => false],
741743
'array_merge_recursive' => ['hasSideEffects' => false],
742744
'array_pad' => ['hasSideEffects' => false],
743745
'array_pop' => ['hasSideEffects' => true],
744746
'array_product' => ['hasSideEffects' => false],
745747
'array_push' => ['hasSideEffects' => true],
746748
'array_rand' => ['hasSideEffects' => false],
749+
'array_reduce' => ['hasSideEffects' => false],
747750
'array_replace' => ['hasSideEffects' => false],
748751
'array_replace_recursive' => ['hasSideEffects' => false],
749752
'array_reverse' => ['hasSideEffects' => false],
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,3 @@
11
<?php
22

3-
array_filter([0, 1, 2]);
3+
$a = array_filter([0, 1, 2]);

tests/PHPStan/Rules/Functions/CallToFunctionStatementWithoutSideEffectsRuleTest.php

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -119,6 +119,24 @@ public function testFirstClassCallables(): void
119119
]);
120120
}
121121

122+
public function testBug11101(): void
123+
{
124+
$this->analyse([__DIR__ . '/data/bug-11101.php'], [
125+
[
126+
'Call to function array_filter() on a separate line has no effect.',
127+
11,
128+
],
129+
[
130+
'Call to function array_map() on a separate line has no effect.',
131+
12,
132+
],
133+
[
134+
'Call to function array_reduce() on a separate line has no effect.',
135+
13,
136+
],
137+
]);
138+
}
139+
122140
#[RequiresPhp('>= 8.5')]
123141
public function testPipeOperator(): void
124142
{
Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
<?php
2+
3+
namespace Bug11101;
4+
5+
/**
6+
* @param array<mixed> $array
7+
*/
8+
function doFoo(array $array): void
9+
{
10+
// These should all be reported as having no effect
11+
array_filter($array, 'is_string'); // line 11
12+
array_map('is_string', $array); // line 12
13+
array_reduce($array, function ($carry, $item) { // line 13
14+
return $carry + $item;
15+
}, 0);
16+
17+
// These are fine - using the return value
18+
$a = array_filter($array, 'is_string');
19+
$b = array_map('is_string', $array);
20+
$c = array_reduce($array, function ($carry, $item) {
21+
return $carry + $item;
22+
}, 0);
23+
}

0 commit comments

Comments
 (0)