Skip to content

Commit

Permalink
Fix iterator_to_array to early return when $preserveKeys is false
Browse files Browse the repository at this point in the history
  • Loading branch information
paulbalandan committed Dec 6, 2024
1 parent c586014 commit 6670092
Show file tree
Hide file tree
Showing 2 changed files with 14 additions and 16 deletions.
27 changes: 11 additions & 16 deletions src/Type/Php/IteratorToArrayFunctionReturnTypeExtension.php
Original file line number Diff line number Diff line change
Expand Up @@ -31,33 +31,28 @@ public function getTypeFromFunctionCall(FunctionReflection $functionReflection,
}

$traversableType = $scope->getType($arguments[0]->value);
$arrayKeyType = $traversableType->getIterableKeyType()->toArrayKey();

if ($arrayKeyType instanceof ErrorType) {
return new NeverType(true);
}

$isList = false;

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

if ($preserveKeysType->isFalse()->yes()) {
$arrayKeyType = new IntegerType();
$isList = true;
return AccessoryArrayListType::intersectWith(new ArrayType(
new IntegerType(),
$traversableType->getIterableValueType(),
));
}
}

$arrayType = new ArrayType(
$arrayKeyType,
$traversableType->getIterableValueType(),
);
$arrayKeyType = $traversableType->getIterableKeyType()->toArrayKey();

if ($isList) {
$arrayType = AccessoryArrayListType::intersectWith($arrayType);
if ($arrayKeyType instanceof ErrorType) {
return new NeverType(true);
}

return $arrayType;
return new ArrayType(
$arrayKeyType,
$traversableType->getIterableValueType(),
);
}

}
3 changes: 3 additions & 0 deletions tests/PHPStan/Analyser/nsrt/iterator_to_array.php
Original file line number Diff line number Diff line change
Expand Up @@ -49,7 +49,9 @@ public function testBehaviorOnGenerators(): void
};

assertType('array<0|1|2|\'\', 1|2|3|4>', iterator_to_array($generator1()));
assertType('list<1|2|3|4>', iterator_to_array($generator1(), false));
assertType('array<0|1|\'\'|\'a\', 1|2|3|4>', iterator_to_array($generator2()));
assertType('list<1|2|3|4>', iterator_to_array($generator2(), false));
}

public function testOnGeneratorsWithIllegalKeysForArray(): void
Expand All @@ -60,5 +62,6 @@ public function testOnGeneratorsWithIllegalKeysForArray(): void
};

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

0 comments on commit 6670092

Please sign in to comment.