Skip to content

Commit 3e69c48

Browse files
canvuralondrejmirtes
authored andcommitted
Improve return type of array_fill_keys for not constant arrays
1 parent 925eabb commit 3e69c48

File tree

2 files changed

+28
-0
lines changed

2 files changed

+28
-0
lines changed

src/Type/Php/ArrayFillKeysFunctionReturnTypeExtension.php

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,18 @@ public function getTypeFromFunctionCall(FunctionReflection $functionReflection,
3535
$keysType = $scope->getType($functionCall->getArgs()[0]->value);
3636
$constantArrays = TypeUtils::getConstantArrays($keysType);
3737
if (count($constantArrays) === 0) {
38+
if ($keysType->isArray()->yes()) {
39+
$itemType = $keysType->getIterableValueType();
40+
41+
if ((new IntegerType())->isSuperTypeOf($itemType)->no()) {
42+
if ($itemType->toString() instanceof ErrorType) {
43+
return new ArrayType($itemType, $valueType);
44+
}
45+
46+
return new ArrayType($itemType->toString(), $valueType);
47+
}
48+
}
49+
3850
return new ArrayType($keysType->getIterableValueType(), $valueType);
3951
}
4052

tests/PHPStan/Analyser/data/array-fill-keys.php

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -50,3 +50,19 @@ function withObjectKey() : array
5050
assertType("non-empty-array<string, 'b'>", array_fill_keys([new Bar()], 'b'));
5151
assertType("*NEVER*", array_fill_keys([new Baz()], 'b'));
5252
}
53+
54+
/**
55+
* @param Bar[] $foo
56+
* @param int[] $bar
57+
* @param Foo[] $baz
58+
* @param float[] $floats
59+
* @param array<int, int|string|bool> $mixed
60+
*/
61+
function withNotConstantArray(array $foo, array $bar, array $baz, array $floats, array $mixed): void
62+
{
63+
assertType("array<string, null>", array_fill_keys($foo, null));
64+
assertType("array<int, null>", array_fill_keys($bar, null));
65+
assertType("array<'foo', null>", array_fill_keys($baz, null));
66+
assertType("array<numeric-string, null>", array_fill_keys($floats, null));
67+
assertType("array<bool|int|string, null>", array_fill_keys($mixed, null));
68+
}

0 commit comments

Comments
 (0)