Skip to content

Commit 3ae5e83

Browse files
committed
Fix undetected generator function with static reflection
1 parent 8fdeba5 commit 3ae5e83

3 files changed

Lines changed: 24 additions & 3 deletions

File tree

conf/config.level3.neon

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,6 @@ rules:
1010
- PHPStan\Rules\Arrays\UnpackIterableInArrayRule
1111
- PHPStan\Rules\Functions\ArrowFunctionReturnTypeRule
1212
- PHPStan\Rules\Functions\ClosureReturnTypeRule
13-
- PHPStan\Rules\Functions\ReturnTypeRule
1413
- PHPStan\Rules\Generators\YieldTypeRule
1514
- PHPStan\Rules\Methods\ReturnTypeRule
1615
- PHPStan\Rules\Properties\DefaultValueTypesAssignedToPropertiesRule
@@ -50,6 +49,13 @@ services:
5049
tags:
5150
- phpstan.rules.rule
5251

52+
-
53+
class: PHPStan\Rules\Functions\ReturnTypeRule
54+
arguments:
55+
functionReflector: @betterReflectionFunctionReflector
56+
tags:
57+
- phpstan.rules.rule
58+
5359
-
5460
class: PHPStan\Rules\Generators\YieldFromTypeRule
5561
arguments:

src/Rules/Functions/ReturnTypeRule.php

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,8 @@
99
use PHPStan\Reflection\Php\PhpFunctionFromParserNodeReflection;
1010
use PHPStan\Reflection\Php\PhpMethodFromParserNodeReflection;
1111
use PHPStan\Rules\FunctionReturnTypeCheck;
12+
use Roave\BetterReflection\Reflector\Exception\IdentifierNotFound;
13+
use Roave\BetterReflection\Reflector\FunctionReflector;
1214

1315
/**
1416
* @implements \PHPStan\Rules\Rule<\PhpParser\Node\Stmt\Return_>
@@ -18,9 +20,15 @@ class ReturnTypeRule implements \PHPStan\Rules\Rule
1820

1921
private \PHPStan\Rules\FunctionReturnTypeCheck $returnTypeCheck;
2022

21-
public function __construct(FunctionReturnTypeCheck $returnTypeCheck)
23+
private FunctionReflector $functionReflector;
24+
25+
public function __construct(
26+
FunctionReturnTypeCheck $returnTypeCheck,
27+
FunctionReflector $functionReflector
28+
)
2229
{
2330
$this->returnTypeCheck = $returnTypeCheck;
31+
$this->functionReflector = $functionReflector;
2432
}
2533

2634
public function getNodeType(): string
@@ -49,6 +57,12 @@ public function processNode(Node $node, Scope $scope): array
4957
$reflection = null;
5058
if (function_exists($function->getName())) {
5159
$reflection = new \ReflectionFunction($function->getName());
60+
} else {
61+
try {
62+
$reflection = $this->functionReflector->reflect($function->getName());
63+
} catch (IdentifierNotFound $e) {
64+
// pass
65+
}
5266
}
5367

5468
return $this->returnTypeCheck->checkReturnType(

tests/PHPStan/Rules/Functions/ReturnTypeRuleTest.php

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,8 @@ class ReturnTypeRuleTest extends \PHPStan\Testing\RuleTestCase
1313

1414
protected function getRule(): \PHPStan\Rules\Rule
1515
{
16-
return new ReturnTypeRule(new FunctionReturnTypeCheck(new RuleLevelHelper($this->createReflectionProvider(), true, false, true, false)));
16+
[, $functionReflector] = self::getReflectors();
17+
return new ReturnTypeRule(new FunctionReturnTypeCheck(new RuleLevelHelper($this->createReflectionProvider(), true, false, true, false)), $functionReflector);
1718
}
1819

1920
public function testReturnTypeRule(): void

0 commit comments

Comments
 (0)