Skip to content

Commit cdfc170

Browse files
Rework
1 parent 61bdd79 commit cdfc170

File tree

2 files changed

+36
-23
lines changed

2 files changed

+36
-23
lines changed

src/Type/Php/ArrayChangeKeyCaseFunctionReturnTypeExtension.php

Lines changed: 12 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -106,21 +106,20 @@ public function getTypeFromFunctionCall(FunctionReflection $functionReflection,
106106
}
107107

108108
if ($type->isString()->yes()) {
109+
$types = [new StringType()];
110+
if ($type->isNonFalsyString()->yes()) {
111+
$types[] = new AccessoryNonFalsyStringType();
112+
} elseif ($type->isNonEmptyString()->yes()) {
113+
$types[] = new AccessoryNonEmptyStringType();
114+
}
115+
if ($type->isNumericString()->yes()) {
116+
$types[] = new AccessoryNumericStringType();
117+
}
109118
if ($case === CASE_LOWER) {
110-
return TypeCombinator::intersect($type, new AccessoryLowercaseStringType());
111-
} elseif ($type->isLowercaseString()->yes()) {
112-
$types = [new StringType()];
113-
if ($type->isNonFalsyString()->yes()) {
114-
$types[] = new AccessoryNonFalsyStringType();
115-
} elseif ($type->isNonEmptyString()->yes()) {
116-
$types[] = new AccessoryNonEmptyStringType();
117-
}
118-
if ($type->isNumericString()->yes()) {
119-
$types[] = new AccessoryNumericStringType();
120-
}
121-
122-
return TypeCombinator::intersect(...$types);
119+
$types[] = new AccessoryLowercaseStringType();
123120
}
121+
122+
return TypeCombinator::intersect(...$types);
124123
}
125124

126125
return $type;

tests/PHPStan/Analyser/nsrt/array-change-key-case.php

Lines changed: 24 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -13,8 +13,10 @@ class HelloWorld
1313
* @param array<int, string> $arr4
1414
* @param array<lowercase-string, string> $arr5
1515
* @param array<lowercase-string&non-falsy-string, string> $arr6
16-
* @param array{foo: 1, bar?: 2} $arr7
17-
* @param array<'foo'|'bar', string> $arr8
16+
* @param array<non-empty-string, string> $arr7
17+
* @param array<literal-string, string> $arr8
18+
* @param array{foo: 1, bar?: 2} $arr9
19+
* @param array<'foo'|'bar', string> $arr10
1820
* @param list<string> $list
1921
* @param non-empty-array<string> $nonEmpty
2022
*/
@@ -27,6 +29,8 @@ public function sayHello(
2729
array $arr6,
2830
array $arr7,
2931
array $arr8,
32+
array $arr9,
33+
array $arr10,
3034
array $list,
3135
array $nonEmpty,
3236
int $case
@@ -61,15 +65,25 @@ public function sayHello(
6165
assertType('array<non-falsy-string, string>', array_change_key_case($arr6, CASE_UPPER));
6266
assertType('array<non-falsy-string, string>', array_change_key_case($arr6, $case));
6367

64-
assertType('array{foo: 1, bar?: 2}', array_change_key_case($arr7));
65-
assertType('array{foo: 1, bar?: 2}', array_change_key_case($arr7, CASE_LOWER));
66-
assertType('array{FOO: 1, BAR?: 2}', array_change_key_case($arr7, CASE_UPPER));
67-
assertType("non-empty-array<'BAR'|'bar'|'FOO'|'foo', 1|2>", array_change_key_case($arr7, $case));
68+
assertType('array<lowercase-string&non-empty-string, string>', array_change_key_case($arr7));
69+
assertType('array<lowercase-string&non-empty-string, string>', array_change_key_case($arr7, CASE_LOWER));
70+
assertType('array<non-empty-string, string>', array_change_key_case($arr7, CASE_UPPER));
71+
assertType('array<non-empty-string, string>', array_change_key_case($arr7, $case));
6872

69-
assertType("array<'bar'|'foo', string>", array_change_key_case($arr8));
70-
assertType("array<'bar'|'foo', string>", array_change_key_case($arr8, CASE_LOWER));
71-
assertType("array<'BAR'|'FOO', string>", array_change_key_case($arr8, CASE_UPPER));
72-
assertType("array<'BAR'|'bar'|'FOO'|'foo', string>", array_change_key_case($arr8, $case));
73+
assertType('array<lowercase-string, string>', array_change_key_case($arr8));
74+
assertType('array<lowercase-string, string>', array_change_key_case($arr8, CASE_LOWER));
75+
assertType('array<string, string>', array_change_key_case($arr8, CASE_UPPER));
76+
assertType('array<string, string>', array_change_key_case($arr8, $case));
77+
78+
assertType('array{foo: 1, bar?: 2}', array_change_key_case($arr9));
79+
assertType('array{foo: 1, bar?: 2}', array_change_key_case($arr9, CASE_LOWER));
80+
assertType('array{FOO: 1, BAR?: 2}', array_change_key_case($arr9, CASE_UPPER));
81+
assertType("non-empty-array<'BAR'|'bar'|'FOO'|'foo', 1|2>", array_change_key_case($arr9, $case));
82+
83+
assertType("array<'bar'|'foo', string>", array_change_key_case($arr10));
84+
assertType("array<'bar'|'foo', string>", array_change_key_case($arr10, CASE_LOWER));
85+
assertType("array<'BAR'|'FOO', string>", array_change_key_case($arr10, CASE_UPPER));
86+
assertType("array<'BAR'|'bar'|'FOO'|'foo', string>", array_change_key_case($arr10, $case));
7387

7488
assertType('list<string>', array_change_key_case($list));
7589
assertType('list<string>', array_change_key_case($list, CASE_LOWER));

0 commit comments

Comments
 (0)