|
160 | 160 | use PHPStan\ShouldNotHappenException;
|
161 | 161 | use PHPStan\TrinaryLogic;
|
162 | 162 | use PHPStan\Type\Accessory\AccessoryArrayListType;
|
| 163 | +use PHPStan\Type\Accessory\HasOffsetValueType; |
163 | 164 | use PHPStan\Type\Accessory\NonEmptyArrayType;
|
164 | 165 | use PHPStan\Type\ArrayType;
|
165 | 166 | use PHPStan\Type\ClosureType;
|
166 | 167 | use PHPStan\Type\Constant\ConstantArrayType;
|
167 | 168 | use PHPStan\Type\Constant\ConstantArrayTypeBuilder;
|
168 | 169 | use PHPStan\Type\Constant\ConstantBooleanType;
|
169 | 170 | use PHPStan\Type\Constant\ConstantIntegerType;
|
| 171 | +use PHPStan\Type\Constant\ConstantStringType; |
170 | 172 | use PHPStan\Type\ErrorType;
|
171 | 173 | use PHPStan\Type\FileTypeMapper;
|
172 | 174 | use PHPStan\Type\GeneralizePrecision;
|
@@ -5931,7 +5933,25 @@ private function produceArrayDimFetchAssignValueToWrite(array $dimFetchStack, ar
|
5931 | 5933 | && $arrayDimFetch !== null
|
5932 | 5934 | && $scope->hasExpressionType($arrayDimFetch)->yes()
|
5933 | 5935 | ) {
|
| 5936 | + $hasOffsetType = null; |
| 5937 | + if ($offsetType instanceof ConstantStringType || $offsetType instanceof ConstantIntegerType) { |
| 5938 | + $hasOffsetType = new HasOffsetValueType($offsetType, $valueToWrite); |
| 5939 | + } |
5934 | 5940 | $valueToWrite = $offsetValueType->setExistingOffsetValueType($offsetType, $valueToWrite);
|
| 5941 | + |
| 5942 | + if ($hasOffsetType !== null) { |
| 5943 | + $valueToWrite = TypeCombinator::intersect( |
| 5944 | + $valueToWrite, |
| 5945 | + $hasOffsetType, |
| 5946 | + new NonEmptyArrayType(), |
| 5947 | + ); |
| 5948 | + } else { |
| 5949 | + $valueToWrite = TypeCombinator::intersect( |
| 5950 | + $valueToWrite, |
| 5951 | + new NonEmptyArrayType(), |
| 5952 | + ); |
| 5953 | + } |
| 5954 | + |
5935 | 5955 | } else {
|
5936 | 5956 | $valueToWrite = $offsetValueType->setOffsetValueType($offsetType, $valueToWrite, $i === 0);
|
5937 | 5957 | }
|
|
0 commit comments