|
2 | 2 |
|
3 | 3 | namespace PHPStan\Type\Doctrine\DBAL\QueryBuilder;
|
4 | 4 |
|
| 5 | +use Doctrine\DBAL\Driver\Result; |
5 | 6 | use Doctrine\DBAL\Driver\ResultStatement;
|
6 | 7 | use Doctrine\DBAL\Query\QueryBuilder;
|
7 | 8 | use PhpParser\Node\Expr\MethodCall;
|
8 | 9 | use PhpParser\Node\Identifier;
|
9 | 10 | use PHPStan\Analyser\Scope;
|
10 | 11 | use PHPStan\Reflection\MethodReflection;
|
11 | 12 | use PHPStan\Reflection\ParametersAcceptorSelector;
|
| 13 | +use PHPStan\Reflection\ReflectionProvider; |
12 | 14 | use PHPStan\Type\DynamicMethodReturnTypeExtension;
|
13 | 15 | use PHPStan\Type\ObjectType;
|
14 | 16 | use PHPStan\Type\Type;
|
|
17 | 19 | class QueryBuilderExecuteMethodExtension implements DynamicMethodReturnTypeExtension
|
18 | 20 | {
|
19 | 21 |
|
| 22 | + /** @var ReflectionProvider */ |
| 23 | + private $reflectionProvider; |
| 24 | + |
| 25 | + public function __construct(ReflectionProvider $reflectionProvider) |
| 26 | + { |
| 27 | + $this->reflectionProvider = $reflectionProvider; |
| 28 | + } |
| 29 | + |
20 | 30 | public function getClass(): string
|
21 | 31 | {
|
22 | 32 | return QueryBuilder::class;
|
@@ -46,7 +56,11 @@ public function getTypeFromMethodCall(MethodReflection $methodReflection, Method
|
46 | 56 |
|
47 | 57 | $name = $nameObject->toString();
|
48 | 58 | if ($name === 'select' || $name === 'addSelect') {
|
49 |
| - return TypeCombinator::intersect($defaultReturnType, new ObjectType(ResultStatement::class)); |
| 59 | + if ($this->reflectionProvider->hasClass(ResultStatement::class)) { |
| 60 | + return TypeCombinator::intersect($defaultReturnType, new ObjectType(ResultStatement::class)); |
| 61 | + } |
| 62 | + |
| 63 | + return TypeCombinator::intersect($defaultReturnType, new ObjectType(Result::class)); |
50 | 64 | }
|
51 | 65 |
|
52 | 66 | $var = $var->var;
|
|
0 commit comments