Skip to content

Commit

Permalink
Improve return type of array_fill_keys for not constant arrays
Browse files Browse the repository at this point in the history
  • Loading branch information
canvural authored and ondrejmirtes committed Mar 30, 2022
1 parent 925eabb commit 3e69c48
Show file tree
Hide file tree
Showing 2 changed files with 28 additions and 0 deletions.
12 changes: 12 additions & 0 deletions src/Type/Php/ArrayFillKeysFunctionReturnTypeExtension.php
Original file line number Diff line number Diff line change
Expand Up @@ -35,6 +35,18 @@ public function getTypeFromFunctionCall(FunctionReflection $functionReflection,
$keysType = $scope->getType($functionCall->getArgs()[0]->value);
$constantArrays = TypeUtils::getConstantArrays($keysType);
if (count($constantArrays) === 0) {
if ($keysType->isArray()->yes()) {
$itemType = $keysType->getIterableValueType();

if ((new IntegerType())->isSuperTypeOf($itemType)->no()) {
if ($itemType->toString() instanceof ErrorType) {
return new ArrayType($itemType, $valueType);
}

return new ArrayType($itemType->toString(), $valueType);
}
}

return new ArrayType($keysType->getIterableValueType(), $valueType);
}

Expand Down
16 changes: 16 additions & 0 deletions tests/PHPStan/Analyser/data/array-fill-keys.php
Original file line number Diff line number Diff line change
Expand Up @@ -50,3 +50,19 @@ function withObjectKey() : array
assertType("non-empty-array<string, 'b'>", array_fill_keys([new Bar()], 'b'));
assertType("*NEVER*", array_fill_keys([new Baz()], 'b'));
}

/**
* @param Bar[] $foo
* @param int[] $bar
* @param Foo[] $baz
* @param float[] $floats
* @param array<int, int|string|bool> $mixed
*/
function withNotConstantArray(array $foo, array $bar, array $baz, array $floats, array $mixed): void
{
assertType("array<string, null>", array_fill_keys($foo, null));
assertType("array<int, null>", array_fill_keys($bar, null));
assertType("array<'foo', null>", array_fill_keys($baz, null));
assertType("array<numeric-string, null>", array_fill_keys($floats, null));
assertType("array<bool|int|string, null>", array_fill_keys($mixed, null));
}

0 comments on commit 3e69c48

Please sign in to comment.