2
2
3
3
namespace PHPStan \Type \Doctrine \QueryBuilder ;
4
4
5
+ use Doctrine \ORM \EntityRepository ;
5
6
use Doctrine \ORM \QueryBuilder ;
6
7
use PhpParser \Node \Expr ;
7
8
use PhpParser \Node \Expr \MethodCall ;
13
14
use PHPStan \Type \Type ;
14
15
use PHPStan \Type \TypeCombinator ;
15
16
use function count ;
16
- use function str_starts_with ;
17
17
18
18
class ReturnQueryBuilderExpressionTypeResolverExtension implements ExpressionTypeResolverExtension
19
19
{
@@ -38,12 +38,14 @@ public function getType(Expr $expr, Scope $scope): ?Type
38
38
return null ;
39
39
}
40
40
41
- $ queryBuilderType = new ObjectType (QueryBuilder::class);
42
41
$ callerType = $ scope ->getType ($ expr ->var );
43
42
44
- foreach ($ callerType ->getObjectClassNames () as $ callerObjectClassName ) {
45
- if (str_starts_with ($ callerObjectClassName , 'Doctrine ' )) {
46
- return null ; // do not dive into native Doctrine methods (like EntityRepository->createQueryBuilder)
43
+ foreach ($ callerType ->getObjectClassReflections () as $ callerClassReflection ) {
44
+ if ($ callerClassReflection ->is (QueryBuilder::class)) {
45
+ return null ; // covered by QueryBuilderMethodDynamicReturnTypeExtension
46
+ }
47
+ if ($ callerClassReflection ->is (EntityRepository::class)) {
48
+ return null ; // createQueryBuilder covered by EntityRepositoryCreateQueryBuilderDynamicReturnTypeExtension
47
49
}
48
50
}
49
51
@@ -55,7 +57,7 @@ public function getType(Expr $expr, Scope $scope): ?Type
55
57
56
58
$ returnType = ParametersAcceptorSelector::selectSingle ($ methodReflection ->getVariants ())->getReturnType ();
57
59
58
- $ returnsQueryBuilder = $ queryBuilderType ->isSuperTypeOf ($ returnType )->yes ();
60
+ $ returnsQueryBuilder = ( new ObjectType (QueryBuilder::class)) ->isSuperTypeOf ($ returnType )->yes ();
59
61
60
62
if (!$ returnsQueryBuilder ) {
61
63
return null ;
0 commit comments