|
15 | 15 | use PhpParser\Comment\Doc; |
16 | 16 | use PhpParser\ConstExprEvaluator; |
17 | 17 | use PhpParser\Node; |
| 18 | +use PhpParser\Node\Expr\Yield_; |
| 19 | +use PhpParser\Node\Expr\YieldFrom; |
18 | 20 | use PhpParser\NodeFinder; |
19 | 21 | use PhpParser\Node\Identifier; |
20 | 22 | use PhpParser\Node\Name; |
@@ -813,6 +815,18 @@ private function voidOrNever(Node $node): ?Type |
813 | 815 | return null; |
814 | 816 | } |
815 | 817 |
|
| 818 | + $yields = $this->nodeFinder->findFirst( |
| 819 | + $node, |
| 820 | + static function (Node $node): bool { |
| 821 | + return $node instanceof Yield_ || $node instanceof YieldFrom; |
| 822 | + } |
| 823 | + ) instanceof Node; |
| 824 | + |
| 825 | + if ($yields) { |
| 826 | + // Generator functions do not return void or never. |
| 827 | + return null; |
| 828 | + } |
| 829 | + |
816 | 830 | $returnStmts = $this->nodeFinder->findInstanceOf($node, Stmt_Return::class); |
817 | 831 |
|
818 | 832 | // If there is a return statement, it's not return type never. |
@@ -852,14 +866,14 @@ static function (Node $node): bool { |
852 | 866 | if (! ($stmt->expr instanceof FuncCall) || ! ($stmt->expr->name instanceof Name)) { |
853 | 867 | continue; |
854 | 868 | } |
855 | | - $name = $stmt->expr->name; |
| 869 | + $name = strtolower((string)$stmt->expr->name); |
856 | 870 | // If a first level statement is a call to wp_send_json(_success/error), |
857 | 871 | // it's return type never. |
858 | | - if (str_starts_with($name->toString(), 'wp_send_json')) { |
| 872 | + if (str_starts_with($name, 'wp_send_json')) { |
859 | 873 | return $never; |
860 | 874 | } |
861 | 875 | // Skip all functions but wp_die(). |
862 | | - if (! str_starts_with($name->toString(), 'wp_die')) { |
| 876 | + if (! str_starts_with($name, 'wp_die')) { |
863 | 877 | continue; |
864 | 878 | } |
865 | 879 | $args = $stmt->expr->getArgs(); |
|
0 commit comments