Skip to content

Commit 4d31dd6

Browse files
janedbalondrejmirtes
authored andcommitted
ReturnQueryBuilderExpressionTypeResolverExtension: better ignore of native calls
1 parent 8ffc0b6 commit 4d31dd6

File tree

1 file changed

+8
-6
lines changed

1 file changed

+8
-6
lines changed

src/Type/Doctrine/QueryBuilder/ReturnQueryBuilderExpressionTypeResolverExtension.php

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22

33
namespace PHPStan\Type\Doctrine\QueryBuilder;
44

5+
use Doctrine\ORM\EntityRepository;
56
use Doctrine\ORM\QueryBuilder;
67
use PhpParser\Node\Expr;
78
use PhpParser\Node\Expr\MethodCall;
@@ -13,7 +14,6 @@
1314
use PHPStan\Type\Type;
1415
use PHPStan\Type\TypeCombinator;
1516
use function count;
16-
use function str_starts_with;
1717

1818
class ReturnQueryBuilderExpressionTypeResolverExtension implements ExpressionTypeResolverExtension
1919
{
@@ -38,12 +38,14 @@ public function getType(Expr $expr, Scope $scope): ?Type
3838
return null;
3939
}
4040

41-
$queryBuilderType = new ObjectType(QueryBuilder::class);
4241
$callerType = $scope->getType($expr->var);
4342

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
4749
}
4850
}
4951

@@ -55,7 +57,7 @@ public function getType(Expr $expr, Scope $scope): ?Type
5557

5658
$returnType = ParametersAcceptorSelector::selectSingle($methodReflection->getVariants())->getReturnType();
5759

58-
$returnsQueryBuilder = $queryBuilderType->isSuperTypeOf($returnType)->yes();
60+
$returnsQueryBuilder = (new ObjectType(QueryBuilder::class))->isSuperTypeOf($returnType)->yes();
5961

6062
if (!$returnsQueryBuilder) {
6163
return null;

0 commit comments

Comments
 (0)