From 7b1065c9241b39a380b21e7fbbc025acacb81b31 Mon Sep 17 00:00:00 2001 From: Martin Bruna Date: Tue, 27 Aug 2024 22:00:37 +0200 Subject: [PATCH 1/2] Fix array_filter with callback optional persistance --- ...FilterFunctionReturnTypeReturnTypeExtension.php | 2 ++ tests/PHPStan/Analyser/nsrt/bug-11570.php | 14 ++++++++++++++ 2 files changed, 16 insertions(+) create mode 100644 tests/PHPStan/Analyser/nsrt/bug-11570.php diff --git a/src/Type/Php/ArrayFilterFunctionReturnTypeReturnTypeExtension.php b/src/Type/Php/ArrayFilterFunctionReturnTypeReturnTypeExtension.php index d6f5a8251c..450ca1bf13 100644 --- a/src/Type/Php/ArrayFilterFunctionReturnTypeReturnTypeExtension.php +++ b/src/Type/Php/ArrayFilterFunctionReturnTypeReturnTypeExtension.php @@ -192,9 +192,11 @@ private function filterByTruthyValue(Scope $scope, Error|Variable|null $itemVar, $results = []; foreach ($constantArrays as $constantArray) { $builder = ConstantArrayTypeBuilder::createEmpty(); + $optionalKeys = $constantArray->getOptionalKeys(); foreach ($constantArray->getKeyTypes() as $i => $keyType) { $itemType = $constantArray->getValueTypes()[$i]; [$newKeyType, $newItemType, $optional] = $this->processKeyAndItemType($scope, $keyType, $itemType, $itemVar, $keyVar, $expr); + $optional = $optional || in_array($i, $optionalKeys, true); if ($newKeyType instanceof NeverType || $newItemType instanceof NeverType) { continue; } diff --git a/tests/PHPStan/Analyser/nsrt/bug-11570.php b/tests/PHPStan/Analyser/nsrt/bug-11570.php new file mode 100644 index 0000000000..7a97062078 --- /dev/null +++ b/tests/PHPStan/Analyser/nsrt/bug-11570.php @@ -0,0 +1,14 @@ + $var !== null); + assertType("array{one?: string, two?: string, three?: string}", $data); +} From 66e7cd38f90e51e865f96da9b2396c89e713e04f Mon Sep 17 00:00:00 2001 From: Martin Bruna Date: Tue, 27 Aug 2024 22:09:47 +0200 Subject: [PATCH 2/2] fix cs --- .../Php/ArrayFilterFunctionReturnTypeReturnTypeExtension.php | 1 + 1 file changed, 1 insertion(+) diff --git a/src/Type/Php/ArrayFilterFunctionReturnTypeReturnTypeExtension.php b/src/Type/Php/ArrayFilterFunctionReturnTypeReturnTypeExtension.php index 450ca1bf13..c44d17a250 100644 --- a/src/Type/Php/ArrayFilterFunctionReturnTypeReturnTypeExtension.php +++ b/src/Type/Php/ArrayFilterFunctionReturnTypeReturnTypeExtension.php @@ -33,6 +33,7 @@ use PHPStan\Type\TypeUtils; use function array_map; use function count; +use function in_array; use function is_string; use function strtolower; use function substr;