|
9 | 9 | use PHPStan\Type\Accessory\NonEmptyArrayType;
|
10 | 10 | use PHPStan\Type\ArrayType;
|
11 | 11 | use PHPStan\Type\Constant\ConstantArrayTypeBuilder;
|
| 12 | +use PHPStan\Type\IntegerType; |
12 | 13 | use PHPStan\Type\MixedType;
|
13 | 14 | use PHPStan\Type\NeverType;
|
14 | 15 | use PHPStan\Type\Type;
|
@@ -44,23 +45,31 @@ public function getTypeFromFunctionCall(FunctionReflection $functionReflection,
|
44 | 45 | );
|
45 | 46 | $arrayType = $scope->getType($functionCall->args[1]->value);
|
46 | 47 | $constantArrays = TypeUtils::getConstantArrays($arrayType);
|
47 |
| - if (count($constantArrays) > 0) { |
48 |
| - $arrayTypes = []; |
49 |
| - foreach ($constantArrays as $constantArray) { |
50 |
| - $returnedArrayBuilder = ConstantArrayTypeBuilder::createEmpty(); |
51 |
| - foreach ($constantArray->getKeyTypes() as $keyType) { |
52 |
| - $returnedArrayBuilder->setOffsetValueType( |
53 |
| - $keyType, |
54 |
| - $valueType |
55 |
| - ); |
| 48 | + |
| 49 | + if (!isset($functionCall->args[2])) { |
| 50 | + if (count($constantArrays) > 0) { |
| 51 | + $arrayTypes = []; |
| 52 | + foreach ($constantArrays as $constantArray) { |
| 53 | + $returnedArrayBuilder = ConstantArrayTypeBuilder::createEmpty(); |
| 54 | + foreach ($constantArray->getKeyTypes() as $keyType) { |
| 55 | + $returnedArrayBuilder->setOffsetValueType( |
| 56 | + $keyType, |
| 57 | + $valueType |
| 58 | + ); |
| 59 | + } |
| 60 | + $arrayTypes[] = $returnedArrayBuilder->getArray(); |
56 | 61 | }
|
57 |
| - $arrayTypes[] = $returnedArrayBuilder->getArray(); |
58 |
| - } |
59 | 62 |
|
60 |
| - $mappedArrayType = TypeCombinator::union(...$arrayTypes); |
61 |
| - } elseif ($arrayType->isArray()->yes()) { |
| 63 | + $mappedArrayType = TypeCombinator::union(...$arrayTypes); |
| 64 | + } elseif ($arrayType->isArray()->yes()) { |
| 65 | + $mappedArrayType = TypeCombinator::intersect(new ArrayType( |
| 66 | + $arrayType->getIterableKeyType(), |
| 67 | + $valueType |
| 68 | + ), ...TypeUtils::getAccessoryTypes($arrayType)); |
| 69 | + } |
| 70 | + } else { |
62 | 71 | $mappedArrayType = TypeCombinator::intersect(new ArrayType(
|
63 |
| - $arrayType->getIterableKeyType(), |
| 72 | + new IntegerType(), |
64 | 73 | $valueType
|
65 | 74 | ), ...TypeUtils::getAccessoryTypes($arrayType));
|
66 | 75 | }
|
|
0 commit comments