Skip to content

Commit fdca50f

Browse files
janedbalondrejmirtes
authored andcommitted
OtherMethodQueryBuilderParser: fix for BranchingQueryBuilderType
1 parent e451627 commit fdca50f

File tree

2 files changed

+31
-6
lines changed

2 files changed

+31
-6
lines changed

src/Type/Doctrine/QueryBuilder/OtherMethodQueryBuilderParser.php

Lines changed: 15 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,10 @@
1919
use PHPStan\Parser\Parser;
2020
use PHPStan\Reflection\ReflectionProvider;
2121
use PHPStan\Type\Generic\TemplateTypeMap;
22+
use PHPStan\Type\IntersectionType;
23+
use PHPStan\Type\Type;
24+
use PHPStan\Type\TypeTraverser;
25+
use PHPStan\Type\UnionType;
2226
use function count;
2327
use function is_array;
2428

@@ -118,11 +122,18 @@ private function findQueryBuilderTypesInCalledMethod(Scope $scope, MethodCall $m
118122
}
119123

120124
$exprType = $scope->getType($node->expr);
121-
if (!$exprType instanceof QueryBuilderType) {
122-
return;
123-
}
124125

125-
$queryBuilderTypes[] = $exprType;
126+
TypeTraverser::map($exprType, static function (Type $type, callable $traverse) use (&$queryBuilderTypes): Type {
127+
if ($type instanceof UnionType || $type instanceof IntersectionType) {
128+
return $traverse($type);
129+
}
130+
131+
if ($type instanceof QueryBuilderType) {
132+
$queryBuilderTypes[] = $type;
133+
}
134+
135+
return $type;
136+
});
126137
});
127138

128139
return $queryBuilderTypes;

tests/Type/Doctrine/data/QueryResult/queryBuilderGetQuery.php

Lines changed: 16 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -140,10 +140,11 @@ public function testQueryResultTypeIsVoidWithDeleteOrUpdate(EntityManagerInterfa
140140

141141
public function testQueryTypeIsInferredOnAcrossMethods(EntityManagerInterface $em): void
142142
{
143-
$query = $this->getQueryBuilder($em)
144-
->getQuery();
143+
$query = $this->getQueryBuilder($em)->getQuery();
144+
$branchingQuery = $this->getBranchingQueryBuilder($em)->getQuery();
145145

146146
assertType('Doctrine\ORM\Query<null, QueryResult\Entities\Many>', $query);
147+
assertType('Doctrine\ORM\Query<null, QueryResult\Entities\Many>', $branchingQuery);
147148
}
148149

149150
private function getQueryBuilder(EntityManagerInterface $em): QueryBuilder
@@ -152,4 +153,17 @@ private function getQueryBuilder(EntityManagerInterface $em): QueryBuilder
152153
->select('m')
153154
->from(Many::class, 'm');
154155
}
156+
157+
private function getBranchingQueryBuilder(EntityManagerInterface $em): QueryBuilder
158+
{
159+
$queryBuilder = $em->createQueryBuilder()
160+
->select('m')
161+
->from(Many::class, 'm');
162+
163+
if (random_int(0, 1) === 1) {
164+
$queryBuilder->andWhere('m.intColumn = 1');
165+
}
166+
167+
return $queryBuilder;
168+
}
155169
}

0 commit comments

Comments
 (0)