Skip to content

Commit

Permalink
Fix array_reverse type for etc.
Browse files Browse the repository at this point in the history
  • Loading branch information
MoonE committed Nov 10, 2024
1 parent 21647b0 commit dca758d
Showing 1 changed file with 40 additions and 10 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@
namespace Psalm\Internal\Provider\ReturnTypeProvider;

use Psalm\Internal\Analyzer\StatementsAnalyzer;
use Psalm\Internal\Type\TypeCombiner;
use Psalm\Plugin\EventHandler\Event\FunctionReturnTypeProviderEvent;
use Psalm\Plugin\EventHandler\FunctionReturnTypeProviderInterface;
use Psalm\Type;
Expand All @@ -11,6 +12,8 @@
use Psalm\Type\Union;

use function array_reverse;
use function array_values;
use function count;

/**
* @internal
Expand Down Expand Up @@ -57,17 +60,44 @@ public static function getFunctionReturnType(FunctionReturnTypeProviderEvent $ev
if ($first_arg_array->is_list) {
$second_arg = $call_args[1]->value ?? null;

if (!$second_arg
|| (($second_arg_type = $statements_source->node_data->getType($second_arg))
&& $second_arg_type->isFalse()
)
) {
return $first_arg_array->fallback_params
? ($first_arg_array->isNonEmpty()
$preserve_keys =
$second_arg &&
!(($second_arg_type = $statements_source->node_data->getType($second_arg)) &&
$second_arg_type->isFalse());
if (!$preserve_keys) {
if ($first_arg_array->fallback_params) {
return $first_arg_array->isNonEmpty()
? Type::getNonEmptyList($first_arg_array->getGenericValueType())
: Type::getList($first_arg_array->getGenericValueType())
)
: new Union([$first_arg_array->setProperties(array_reverse($first_arg_array->properties))]);
: Type::getList($first_arg_array->getGenericValueType());
}

$reversed_array_items = [];
$num_undefined = 0;
$i = 0;
foreach (array_reverse($first_arg_array->properties) as $array_item_type) {
$reversed_array_items[] = $array_item_type;
/** @var int<0,max> $j */
$j = $i - $num_undefined;
for (; $j < $i; ++$j) {
$reversed_array_items[$j] = TypeCombiner::combine([
...array_values($reversed_array_items[$j]->getAtomicTypes()),
...array_values($array_item_type->getAtomicTypes()),
]);
}
if ($array_item_type->possibly_undefined) {
++$num_undefined;
}
++$i;
}

$max_len = count($reversed_array_items);
/** @var int<0,max> $i */
$i = $max_len - $num_undefined;
for (; $i < $max_len; ++$i) {
$reversed_array_items[$i] = $reversed_array_items[$i]->setPossiblyUndefined(true);
}

return new Union([$first_arg_array->setProperties($reversed_array_items)]);
}

return new Union([new TKeyedArray(
Expand Down

0 comments on commit dca758d

Please sign in to comment.