psalm / psalm-plugin-doctrine

Stubs to let Psalm understand Doctrine better
86 stars 43 forks source link

Support reduced type inferring from Collection::filter #58

Open ostrolucky opened 4 years ago

ostrolucky commented 4 years ago

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

weirdan commented 4 years ago

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()

ostrolucky commented 4 years ago

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

psalm-github-bot[bot] commented 4 years ago

I found these snippets:

https://psalm.dev/r/16fbce64d4 ```php $in * @return array */ function f(array $in): array { return array_filter($in, function (?stdClass $elt) { return $elt !== null; }); } ``` ``` Psalm output (using commit ecb179c): No issues! ```
weirdan commented 4 years ago

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