Skip to content

Commit 0c3b0ff

Browse files
committed
fix setExistingOffsetValueType() for unset() use-case
1 parent 3b734e2 commit 0c3b0ff

File tree

2 files changed

+20
-12
lines changed

2 files changed

+20
-12
lines changed

src/Analyser/NodeScopeResolver.php

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -163,13 +163,15 @@
163163
use PHPStan\ShouldNotHappenException;
164164
use PHPStan\TrinaryLogic;
165165
use PHPStan\Type\Accessory\AccessoryArrayListType;
166+
use PHPStan\Type\Accessory\HasOffsetValueType;
166167
use PHPStan\Type\Accessory\NonEmptyArrayType;
167168
use PHPStan\Type\ArrayType;
168169
use PHPStan\Type\ClosureType;
169170
use PHPStan\Type\Constant\ConstantArrayType;
170171
use PHPStan\Type\Constant\ConstantArrayTypeBuilder;
171172
use PHPStan\Type\Constant\ConstantBooleanType;
172173
use PHPStan\Type\Constant\ConstantIntegerType;
174+
use PHPStan\Type\Constant\ConstantStringType;
173175
use PHPStan\Type\ErrorType;
174176
use PHPStan\Type\FileTypeMapper;
175177
use PHPStan\Type\GeneralizePrecision;
@@ -5943,7 +5945,25 @@ private function produceArrayDimFetchAssignValueToWrite(array $dimFetchStack, ar
59435945
&& $arrayDimFetch !== null
59445946
&& $scope->hasExpressionType($arrayDimFetch)->yes()
59455947
) {
5948+
$hasOffsetType = null;
5949+
if ($offsetType instanceof ConstantStringType || $offsetType instanceof ConstantIntegerType) {
5950+
$hasOffsetType = new HasOffsetValueType($offsetType, $valueToWrite);
5951+
}
59465952
$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+
59475967
} else {
59485968
$valueToWrite = $offsetValueType->setOffsetValueType($offsetType, $valueToWrite, $i === 0);
59495969
}

src/Type/ArrayType.php

Lines changed: 0 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -361,23 +361,11 @@ public function setOffsetValueType(?Type $offsetType, Type $valueType, bool $uni
361361

362362
public function setExistingOffsetValueType(Type $offsetType, Type $valueType): Type
363363
{
364-
if ($offsetType instanceof ConstantStringType || $offsetType instanceof ConstantIntegerType) {
365-
return TypeCombinator::intersect(
366-
new self(
367-
TypeCombinator::union($this->keyType, $offsetType),
368-
TypeCombinator::union($this->itemType, $valueType),
369-
),
370-
new HasOffsetValueType($offsetType, $valueType),
371-
new NonEmptyArrayType(),
372-
);
373-
}
374-
375364
return TypeCombinator::intersect(
376365
new self(
377366
$this->keyType,
378367
TypeCombinator::union($this->itemType, $valueType),
379368
),
380-
new NonEmptyArrayType(),
381369
);
382370
}
383371

0 commit comments

Comments
 (0)