diff --git a/src/Type/Doctrine/QueryBuilder/ReturnQueryBuilderExpressionTypeResolverExtension.php b/src/Type/Doctrine/QueryBuilder/ReturnQueryBuilderExpressionTypeResolverExtension.php index ea4f8bcb..4fc4576c 100644 --- a/src/Type/Doctrine/QueryBuilder/ReturnQueryBuilderExpressionTypeResolverExtension.php +++ b/src/Type/Doctrine/QueryBuilder/ReturnQueryBuilderExpressionTypeResolverExtension.php @@ -25,11 +25,14 @@ class ReturnQueryBuilderExpressionTypeResolverExtension implements ExpressionTyp private OtherMethodQueryBuilderParser $otherMethodQueryBuilderParser; + private ObjectType $queryBuilderObjectType; + public function __construct( OtherMethodQueryBuilderParser $otherMethodQueryBuilderParser ) { $this->otherMethodQueryBuilderParser = $otherMethodQueryBuilderParser; + $this->queryBuilderObjectType = new ObjectType(QueryBuilder::class); } public function getType(Expr $expr, Scope $scope): ?Type @@ -50,7 +53,7 @@ public function getType(Expr $expr, Scope $scope): ?Type $returnType = ParametersAcceptorSelector::selectFromArgs($scope, $expr->getArgs(), $methodReflection->getVariants())->getReturnType(); - $returnsQueryBuilder = (new ObjectType(QueryBuilder::class))->isSuperTypeOf($returnType)->yes(); + $returnsQueryBuilder = $this->queryBuilderObjectType->isSuperTypeOf($returnType)->yes(); if (!$returnsQueryBuilder) { return null; diff --git a/tests/Type/Doctrine/data/QueryResult/queryBuilderExpressionTypeResolver.php b/tests/Type/Doctrine/data/QueryResult/queryBuilderExpressionTypeResolver.php index 2a6af1d9..e8a913a8 100644 --- a/tests/Type/Doctrine/data/QueryResult/queryBuilderExpressionTypeResolver.php +++ b/tests/Type/Doctrine/data/QueryResult/queryBuilderExpressionTypeResolver.php @@ -66,6 +66,11 @@ public function testFirstClassCallableDoesNotFail(EntityManagerInterface $em): v $this->getQueryBuilder(...); } + public function testNullableQueryBuilderIsNotInferred(EntityManagerInterface $em): void + { + assertType('Doctrine\\ORM\\QueryBuilder|null', $this->getNullableQueryBuilder($em)); + } + private function adjustQueryBuilderToIndexByInt(QueryBuilder $qb): void { $qb->indexBy('m', 'm.intColumn'); @@ -100,6 +105,13 @@ private static function getStaticQueryBuilder(EntityManagerInterface $em): Query ->from(Many::class, 'm'); } + private function getNullableQueryBuilder(EntityManagerInterface $em): ?QueryBuilder + { + return $em->createQueryBuilder() + ->select('m') + ->from(Many::class, 'm'); + } + private function getBranchingQueryBuilder(EntityManagerInterface $em): QueryBuilder { $queryBuilder = $em->createQueryBuilder()