Skip to content

Commit 13260da

Browse files
committed
QueryBuilder analysis - fixed type-specifying extension problem
1 parent 8559fac commit 13260da

File tree

3 files changed

+30
-1
lines changed

3 files changed

+30
-1
lines changed

src/Type/Doctrine/QueryBuilder/QueryBuilderTypeSpecifyingExtension.php

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -68,8 +68,13 @@ public function specifyTypes(MethodReflection $methodReflection, MethodCall $nod
6868
return new SpecifiedTypes([]);
6969
}
7070

71+
$queryBuilderNode = $node;
72+
while ($queryBuilderNode instanceof MethodCall) {
73+
$queryBuilderNode = $queryBuilderNode->var;
74+
}
75+
7176
return $this->typeSpecifier->create(
72-
$node->var,
77+
$queryBuilderNode,
7378
$calledOnType->append($node),
7479
TypeSpecifierContext::createTruthy()
7580
);

tests/Rules/Doctrine/ORM/QueryBuilderDqlRuleTest.php

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -87,6 +87,10 @@ public function testRule(): void
8787
"QueryBuilder: [Syntax Error] line 0, col 80: Error: Expected =, <, <=, <>, >, >=, !=, got ')'\nDQL: SELECT e FROM PHPStan\Rules\Doctrine\ORM\MyEntity e WHERE e.id = 1 OR e.nickname) IS NULL",
8888
218,
8989
],
90+
[
91+
'QueryBuilder: [Semantical Error] line 0, col 60 near \'transient = \': Error: Class PHPStan\Rules\Doctrine\ORM\MyEntity has no field or association named transient',
92+
234,
93+
],
9094
]);
9195
}
9296

tests/Rules/Doctrine/ORM/data/query-builder-dql.php

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -224,4 +224,24 @@ public function qbExprIsNullSyntaxError(): void
224224
->getQuery();
225225
}
226226

227+
public function weirdTypeSpecifyingExtensionProblem(): void
228+
{
229+
$queryBuilder = $this->entityManager->createQueryBuilder();
230+
$queryBuilder->select('e')
231+
->from(MyEntity::class, 'e')
232+
->where('e.transient = :test');
233+
234+
$queryBuilder->getQuery();
235+
}
236+
237+
public function weirdTypeSpecifyingExtensionProblemCorrect(): void
238+
{
239+
$queryBuilder = $this->entityManager->createQueryBuilder();
240+
$queryBuilder->select('e')
241+
->from(MyEntity::class, 'e')
242+
->where('e.title = :test');
243+
244+
$queryBuilder->getQuery();
245+
}
246+
227247
}

0 commit comments

Comments
 (0)