Skip to content

Commit 9959061

Browse files
committed
infer non-empty-list/array after isset($arr[$i])
1 parent 8c1d275 commit 9959061

2 files changed

Lines changed: 42 additions & 0 deletions

File tree

src/Analyser/TypeSpecifier.php

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -936,6 +936,18 @@ public function specifyTypesInCondition(
936936
&& !$scope->getType($var->var) instanceof MixedType
937937
) {
938938
$dimType = $scope->getType($var->dim);
939+
$varType = $scope->getType($var->var);
940+
941+
if ($varType->isArray()->yes()) {
942+
$types = $types->unionWith(
943+
$this->create(
944+
$var->var,
945+
new NonEmptyArrayType(),
946+
$context,
947+
$scope,
948+
)->setRootExpr($expr),
949+
);
950+
}
939951

940952
if ($dimType instanceof ConstantIntegerType || $dimType instanceof ConstantStringType) {
941953
$types = $types->unionWith(
Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
<?php
2+
3+
namespace Bug13674a;
4+
5+
use function assert;
6+
use function PHPStan\Testing\assertType;
7+
8+
class HelloWorld
9+
{
10+
/**
11+
* @param array<int> $arrayA
12+
* @param list<int> $listA
13+
*/
14+
public function sayHello($arrayA, $listA, int $i): void
15+
{
16+
if (isset($arrayA[$i])) {
17+
assertType('non-empty-array<int>', $arrayA);
18+
} else {
19+
assertType('array<int>', $arrayA);
20+
}
21+
assertType('array<int>', $arrayA);
22+
23+
if (isset($listA[$i])) {
24+
assertType('non-empty-list<int>', $listA);
25+
} else {
26+
assertType('list<int>', $listA);
27+
}
28+
assertType('list<int>', $listA);
29+
}
30+
}

0 commit comments

Comments
 (0)