Skip to content

Commit 941684d

Browse files
fmasaondrejmirtes
authored andcommitted
Generalize filtered array with maybe falsey values
1 parent 9e6ab0b commit 941684d

File tree

3 files changed

+23
-5
lines changed

3 files changed

+23
-5
lines changed

src/Type/Php/ArrayFilterFunctionReturnTypeReturnTypeExtension.php

Lines changed: 12 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -84,15 +84,22 @@ public function removeFalsey(Type $type): Type
8484
$keys = $type->getKeyTypes();
8585
$values = $type->getValueTypes();
8686

87+
$generalize = false;
88+
8789
foreach ($values as $offset => $value) {
88-
if (!$falseyTypes->isSuperTypeOf($value)->yes()) {
89-
continue;
90-
}
90+
$isFalsey = $falseyTypes->isSuperTypeOf($value);
9191

92-
unset($keys[$offset], $values[$offset]);
92+
if ($isFalsey->yes()) {
93+
unset($keys[$offset], $values[$offset]);
94+
} elseif ($isFalsey->maybe()) {
95+
$values[$offset] = TypeCombinator::remove($values[$offset], $falseyTypes);
96+
$generalize = true;
97+
}
9398
}
9499

95-
return new ConstantArrayType(array_values($keys), array_values($values));
100+
$filteredArray = new ConstantArrayType(array_values($keys), array_values($values));
101+
102+
return $generalize ? $filteredArray->generalize() : $filteredArray;
96103
}
97104

98105
$keyType = $type->getIterableKeyType();

tests/PHPStan/Analyser/NodeScopeResolverTest.php

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4144,6 +4144,10 @@ public function dataArrayFunctions(): array
41444144
'array(\'a\' => 1)',
41454145
'array_filter($union)',
41464146
],
4147+
[
4148+
'array<int, int|true>',
4149+
'array_filter($withPossiblyFalsey)',
4150+
],
41474151
];
41484152
}
41494153

tests/PHPStan/Analyser/data/array-functions.php

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -56,6 +56,13 @@
5656
$union['b'] = false;
5757
}
5858

59+
/** @var bool $bool */
60+
$bool = doFoo();
61+
/** @var int $integer */
62+
$integer = doFoo();
63+
64+
$withPossiblyFalsey = [$bool, $integer, '', 'a' => 0];
65+
5966
/** @var array<string, int> $generalStringKeys */
6067
$generalStringKeys = doFoo();
6168

0 commit comments

Comments
 (0)