psalm-plugin-doctrine icon indicating copy to clipboard operation
psalm-plugin-doctrine copied to clipboard

Support reduced type inferring from Collection::filter

Open ostrolucky opened this issue 4 years ago • 4 comments

Plugin should add capability to infer reduced type from Collection::filter based on assertions in a callback, similarly as Psalm currently does for array_filter. Here is what should be supported: https://psalm.dev/r/1b5cbdc9c0

Backstory: From conversation with @muglug:

Add that to the doctrine plugin

This is the current annotation: https://github.com/doctrine/collections/blob/a4504c79efd8847cc77d10b70209ef838b10338f/lib/Doctrine/Common/Collections/Collection.php#L214-L225

there’s basically no way to annotate that in a docblock

ostrolucky avatar May 26 '20 16:05 ostrolucky

Can you provide the example of desired behavior using array_filter? This: https://psalm.dev/r/e24db6727c results in pretty much the same issues emitted as in your example with Collection::filter()

weirdan avatar May 26 '20 16:05 weirdan

Hmm yeah so $stdClass !== null needs to be used explicitly, that's what I did after I refactored it into array_filter but assumed Psalm will know that (bool) object will result in non-nullable value. Anyways (bool) is different issue, here we go for array_filter inference demonstration https://psalm.dev/r/16fbce64d4

ostrolucky avatar May 26 '20 16:05 ostrolucky

I found these snippets:

https://psalm.dev/r/16fbce64d4
<?php
/**
 * @param array<array-key,stdClass|null> $in
 * @return array<array-key,stdClass>
 */
function f(array $in): array {
    return array_filter($in, function (?stdClass $elt) {
        return $elt !== null; 
    });
}
Psalm output (using commit ecb179c):

No issues!

psalm-github-bot[bot] avatar May 26 '20 16:05 psalm-github-bot[bot]

Psalm provider for array_filter: https://github.com/vimeo/psalm/blob/master/src/Psalm/Internal/Provider/ReturnTypeProvider/ArrayFilterReturnTypeProvider.php

weirdan avatar May 26 '20 17:05 weirdan