Skip to content

Commit

Permalink
Merge remote-tracking branch 'origin/1.12.x' into 2.0.x
Browse files Browse the repository at this point in the history
  • Loading branch information
ondrejmirtes committed Dec 9, 2024
2 parents 7b4c9af + 4f142f5 commit e2fa790
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 @@ -32,33 +32,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 TypeCombinator::intersect(new ArrayType(
new IntegerType(),
$traversableType->getIterableValueType(),
), new AccessoryArrayListType());
}
}

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

if ($isList) {
$arrayType = TypeCombinator::intersect($arrayType, new AccessoryArrayListType());
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 e2fa790

Please sign in to comment.