Skip to content

Commit 4f142f5

Browse files
paulbalandanondrejmirtes
authored andcommitted
Fix iterator_to_array to early return when $preserveKeys is false
1 parent c586014 commit 4f142f5

File tree

2 files changed

+14
-16
lines changed

2 files changed

+14
-16
lines changed

Diff for: src/Type/Php/IteratorToArrayFunctionReturnTypeExtension.php

+11-16
Original file line numberDiff line numberDiff line change
@@ -31,33 +31,28 @@ public function getTypeFromFunctionCall(FunctionReflection $functionReflection,
3131
}
3232

3333
$traversableType = $scope->getType($arguments[0]->value);
34-
$arrayKeyType = $traversableType->getIterableKeyType()->toArrayKey();
35-
36-
if ($arrayKeyType instanceof ErrorType) {
37-
return new NeverType(true);
38-
}
39-
40-
$isList = false;
4134

4235
if (isset($arguments[1])) {
4336
$preserveKeysType = $scope->getType($arguments[1]->value);
4437

4538
if ($preserveKeysType->isFalse()->yes()) {
46-
$arrayKeyType = new IntegerType();
47-
$isList = true;
39+
return AccessoryArrayListType::intersectWith(new ArrayType(
40+
new IntegerType(),
41+
$traversableType->getIterableValueType(),
42+
));
4843
}
4944
}
5045

51-
$arrayType = new ArrayType(
52-
$arrayKeyType,
53-
$traversableType->getIterableValueType(),
54-
);
46+
$arrayKeyType = $traversableType->getIterableKeyType()->toArrayKey();
5547

56-
if ($isList) {
57-
$arrayType = AccessoryArrayListType::intersectWith($arrayType);
48+
if ($arrayKeyType instanceof ErrorType) {
49+
return new NeverType(true);
5850
}
5951

60-
return $arrayType;
52+
return new ArrayType(
53+
$arrayKeyType,
54+
$traversableType->getIterableValueType(),
55+
);
6156
}
6257

6358
}

Diff for: tests/PHPStan/Analyser/nsrt/iterator_to_array.php

+3
Original file line numberDiff line numberDiff line change
@@ -49,7 +49,9 @@ public function testBehaviorOnGenerators(): void
4949
};
5050

5151
assertType('array<0|1|2|\'\', 1|2|3|4>', iterator_to_array($generator1()));
52+
assertType('list<1|2|3|4>', iterator_to_array($generator1(), false));
5253
assertType('array<0|1|\'\'|\'a\', 1|2|3|4>', iterator_to_array($generator2()));
54+
assertType('list<1|2|3|4>', iterator_to_array($generator2(), false));
5355
}
5456

5557
public function testOnGeneratorsWithIllegalKeysForArray(): void
@@ -60,5 +62,6 @@ public function testOnGeneratorsWithIllegalKeysForArray(): void
6062
};
6163

6264
assertType('*NEVER*', iterator_to_array($illegalGenerator()));
65+
assertType('list<\'b\'|\'c\'>', iterator_to_array($illegalGenerator(), false));
6366
}
6467
}

0 commit comments

Comments
 (0)