psalm-plugin-doctrine
psalm-plugin-doctrine copied to clipboard
Support reduced type inferring from Collection::filter
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
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()
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
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 provider for array_filter
: https://github.com/vimeo/psalm/blob/master/src/Psalm/Internal/Provider/ReturnTypeProvider/ArrayFilterReturnTypeProvider.php