Skip to content

Commit 50a1b7e

Browse files
committed
fix setExistingOffsetValueType() for unset() use-case
1 parent d353fec commit 50a1b7e

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
@@ -356,23 +356,11 @@ public function setOffsetValueType(?Type $offsetType, Type $valueType, bool $uni
356356

357357
public function setExistingOffsetValueType(Type $offsetType, Type $valueType): Type
358358
{
359-
if ($offsetType instanceof ConstantStringType || $offsetType instanceof ConstantIntegerType) {
360-
return TypeCombinator::intersect(
361-
new self(
362-
TypeCombinator::union($this->keyType, $offsetType),
363-
TypeCombinator::union($this->itemType, $valueType),
364-
),
365-
new HasOffsetValueType($offsetType, $valueType),
366-
new NonEmptyArrayType(),
367-
);
368-
}
369-
370359
return TypeCombinator::intersect(
371360
new self(
372361
$this->keyType,
373362
TypeCombinator::union($this->itemType, $valueType),
374363
),
375-
new NonEmptyArrayType(),
376364
);
377365
}
378366

0 commit comments

Comments
 (0)