|
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