diff --git a/src/Type/Php/ArrayChangeKeyCaseFunctionReturnTypeExtension.php b/src/Type/Php/ArrayChangeKeyCaseFunctionReturnTypeExtension.php index 8dc831103e..9ca6f45be3 100644 --- a/src/Type/Php/ArrayChangeKeyCaseFunctionReturnTypeExtension.php +++ b/src/Type/Php/ArrayChangeKeyCaseFunctionReturnTypeExtension.php @@ -106,21 +106,20 @@ public function getTypeFromFunctionCall(FunctionReflection $functionReflection, } if ($type->isString()->yes()) { + $types = [new StringType()]; + if ($type->isNonFalsyString()->yes()) { + $types[] = new AccessoryNonFalsyStringType(); + } elseif ($type->isNonEmptyString()->yes()) { + $types[] = new AccessoryNonEmptyStringType(); + } + if ($type->isNumericString()->yes()) { + $types[] = new AccessoryNumericStringType(); + } if ($case === CASE_LOWER) { - return TypeCombinator::intersect($type, new AccessoryLowercaseStringType()); - } elseif ($type->isLowercaseString()->yes()) { - $types = [new StringType()]; - if ($type->isNonFalsyString()->yes()) { - $types[] = new AccessoryNonFalsyStringType(); - } elseif ($type->isNonEmptyString()->yes()) { - $types[] = new AccessoryNonEmptyStringType(); - } - if ($type->isNumericString()->yes()) { - $types[] = new AccessoryNumericStringType(); - } - - return TypeCombinator::intersect(...$types); + $types[] = new AccessoryLowercaseStringType(); } + + return TypeCombinator::intersect(...$types); } return $type; diff --git a/tests/PHPStan/Analyser/nsrt/array-change-key-case.php b/tests/PHPStan/Analyser/nsrt/array-change-key-case.php index fa14c5b9f9..080f155aaa 100644 --- a/tests/PHPStan/Analyser/nsrt/array-change-key-case.php +++ b/tests/PHPStan/Analyser/nsrt/array-change-key-case.php @@ -13,8 +13,10 @@ class HelloWorld * @param array $arr4 * @param array $arr5 * @param array $arr6 - * @param array{foo: 1, bar?: 2} $arr7 - * @param array<'foo'|'bar', string> $arr8 + * @param array $arr7 + * @param array $arr8 + * @param array{foo: 1, bar?: 2} $arr9 + * @param array<'foo'|'bar', string> $arr10 * @param list $list * @param non-empty-array $nonEmpty */ @@ -27,6 +29,8 @@ public function sayHello( array $arr6, array $arr7, array $arr8, + array $arr9, + array $arr10, array $list, array $nonEmpty, int $case @@ -61,15 +65,25 @@ public function sayHello( assertType('array', array_change_key_case($arr6, CASE_UPPER)); assertType('array', array_change_key_case($arr6, $case)); - assertType('array{foo: 1, bar?: 2}', array_change_key_case($arr7)); - assertType('array{foo: 1, bar?: 2}', array_change_key_case($arr7, CASE_LOWER)); - assertType('array{FOO: 1, BAR?: 2}', array_change_key_case($arr7, CASE_UPPER)); - assertType("non-empty-array<'BAR'|'bar'|'FOO'|'foo', 1|2>", array_change_key_case($arr7, $case)); + assertType('array', array_change_key_case($arr7)); + assertType('array', array_change_key_case($arr7, CASE_LOWER)); + assertType('array', array_change_key_case($arr7, CASE_UPPER)); + assertType('array', array_change_key_case($arr7, $case)); - assertType("array<'bar'|'foo', string>", array_change_key_case($arr8)); - assertType("array<'bar'|'foo', string>", array_change_key_case($arr8, CASE_LOWER)); - assertType("array<'BAR'|'FOO', string>", array_change_key_case($arr8, CASE_UPPER)); - assertType("array<'BAR'|'bar'|'FOO'|'foo', string>", array_change_key_case($arr8, $case)); + assertType('array', array_change_key_case($arr8)); + assertType('array', array_change_key_case($arr8, CASE_LOWER)); + assertType('array', array_change_key_case($arr8, CASE_UPPER)); + assertType('array', array_change_key_case($arr8, $case)); + + assertType('array{foo: 1, bar?: 2}', array_change_key_case($arr9)); + assertType('array{foo: 1, bar?: 2}', array_change_key_case($arr9, CASE_LOWER)); + assertType('array{FOO: 1, BAR?: 2}', array_change_key_case($arr9, CASE_UPPER)); + assertType("non-empty-array<'BAR'|'bar'|'FOO'|'foo', 1|2>", array_change_key_case($arr9, $case)); + + assertType("array<'bar'|'foo', string>", array_change_key_case($arr10)); + assertType("array<'bar'|'foo', string>", array_change_key_case($arr10, CASE_LOWER)); + assertType("array<'BAR'|'FOO', string>", array_change_key_case($arr10, CASE_UPPER)); + assertType("array<'BAR'|'bar'|'FOO'|'foo', string>", array_change_key_case($arr10, $case)); assertType('list', array_change_key_case($list)); assertType('list', array_change_key_case($list, CASE_LOWER));