|
163 | 163 | use PHPStan\ShouldNotHappenException; |
164 | 164 | use PHPStan\TrinaryLogic; |
165 | 165 | use PHPStan\Type\Accessory\AccessoryArrayListType; |
| 166 | +use PHPStan\Type\Accessory\HasOffsetValueType; |
166 | 167 | use PHPStan\Type\Accessory\NonEmptyArrayType; |
167 | 168 | use PHPStan\Type\ArrayType; |
168 | 169 | use PHPStan\Type\ClosureType; |
169 | 170 | use PHPStan\Type\Constant\ConstantArrayType; |
170 | 171 | use PHPStan\Type\Constant\ConstantArrayTypeBuilder; |
171 | 172 | use PHPStan\Type\Constant\ConstantBooleanType; |
172 | 173 | use PHPStan\Type\Constant\ConstantIntegerType; |
| 174 | +use PHPStan\Type\Constant\ConstantStringType; |
173 | 175 | use PHPStan\Type\ErrorType; |
174 | 176 | use PHPStan\Type\FileTypeMapper; |
175 | 177 | use PHPStan\Type\GeneralizePrecision; |
@@ -5943,7 +5945,25 @@ private function produceArrayDimFetchAssignValueToWrite(array $dimFetchStack, ar |
5943 | 5945 | && $arrayDimFetch !== null |
5944 | 5946 | && $scope->hasExpressionType($arrayDimFetch)->yes() |
5945 | 5947 | ) { |
| 5948 | + $hasOffsetType = null; |
| 5949 | + if ($offsetType instanceof ConstantStringType || $offsetType instanceof ConstantIntegerType) { |
| 5950 | + $hasOffsetType = new HasOffsetValueType($offsetType, $valueToWrite); |
| 5951 | + } |
5946 | 5952 | $valueToWrite = $offsetValueType->setExistingOffsetValueType($offsetType, $valueToWrite); |
| 5953 | + |
| 5954 | + if ($hasOffsetType !== null) { |
| 5955 | + $valueToWrite = TypeCombinator::intersect( |
| 5956 | + $valueToWrite, |
| 5957 | + $hasOffsetType, |
| 5958 | + new NonEmptyArrayType(), |
| 5959 | + ); |
| 5960 | + } else { |
| 5961 | + $valueToWrite = TypeCombinator::intersect( |
| 5962 | + $valueToWrite, |
| 5963 | + new NonEmptyArrayType(), |
| 5964 | + ); |
| 5965 | + } |
| 5966 | + |
5947 | 5967 | } else { |
5948 | 5968 | $valueToWrite = $offsetValueType->setOffsetValueType($offsetType, $valueToWrite, $i === 0); |
5949 | 5969 | } |
|
0 commit comments