psalm
psalm copied to clipboard
Narrowing down of an instance class in `else` branch doesn't work
https://psalm.dev/r/29c4fb185d The trace on L9 should say stdClass
I found these snippets:
https://psalm.dev/r/29c4fb185d
<?php
class A {}
/** @var A|stdClass $obj */;
if ($obj::class === A::class) {
/** @psalm-trace $obj */;
} else {
/** @psalm-trace $obj */;
}
Psalm output (using commit 16b24bd):
INFO: Trace - 7:29 - $obj: A
INFO: Trace - 9:29 - $obj: A|stdClass
What about this? https://psalm.dev/r/86cb22d9c3
B is an A but ::class on it won't === A::class so it will go in the else. That way, the else can't completely exclude A
I found these snippets:
https://psalm.dev/r/86cb22d9c3
<?php
class A {}
class B extends A {}
/** @var A|stdClass $obj */;
if ($obj::class === A::class) {
/** @psalm-trace $obj */;
} else {
/** @psalm-trace $obj */;
}
Psalm output (using commit 16b24bd):
INFO: Trace - 9:29 - $obj: A
INFO: Trace - 11:29 - $obj: A|stdClass
It should work for final classes though
https://psalm.dev/r/85e60a375e
I found these snippets:
https://psalm.dev/r/85e60a375e
<?php
final class A {}
/** @var A|stdClass $obj */;
if ($obj::class === A::class) {
/** @psalm-trace $obj */;
} else {
/** @psalm-trace $obj */;
}
Psalm output (using commit 16b24bd):
INFO: Trace - 8:29 - $obj: A
INFO: Trace - 10:29 - $obj: A|stdClass