From 1d32c427a1d8687b86f0ce5dd9a42e312e51256d Mon Sep 17 00:00:00 2001 From: Julien Falque Date: Tue, 4 Aug 2020 17:40:54 +0200 Subject: [PATCH] Fix empty DQL with QueryBuilder::setParameters() --- ...uilderMethodDynamicReturnTypeExtension.php | 3 ++- .../QueryBuilderTypeSpecifyingExtension.php | 3 ++- .../ORM/data/queryBuilder.php | 23 +++++++++++++++++++ tests/DoctrineIntegration/ORM/phpstan.neon | 1 + 4 files changed, 28 insertions(+), 2 deletions(-) diff --git a/src/Type/Doctrine/QueryBuilder/QueryBuilderMethodDynamicReturnTypeExtension.php b/src/Type/Doctrine/QueryBuilder/QueryBuilderMethodDynamicReturnTypeExtension.php index af6c548d..2341252d 100644 --- a/src/Type/Doctrine/QueryBuilder/QueryBuilderMethodDynamicReturnTypeExtension.php +++ b/src/Type/Doctrine/QueryBuilder/QueryBuilderMethodDynamicReturnTypeExtension.php @@ -2,6 +2,7 @@ namespace PHPStan\Type\Doctrine\QueryBuilder; +use Doctrine\ORM\QueryBuilder; use PhpParser\Node; use PhpParser\Node\Expr\MethodCall; use PhpParser\Node\Identifier; @@ -79,7 +80,7 @@ public function isMethodSupported(MethodReflection $methodReflection): bool if ($returnType instanceof MixedType) { return false; } - return $returnType->isSuperTypeOf(new ObjectType($this->getClass()))->yes(); + return (new ObjectType(QueryBuilder::class))->isSuperTypeOf($returnType)->yes(); } public function getTypeFromMethodCall( diff --git a/src/Type/Doctrine/QueryBuilder/QueryBuilderTypeSpecifyingExtension.php b/src/Type/Doctrine/QueryBuilder/QueryBuilderTypeSpecifyingExtension.php index 14f13cd3..fd62e501 100644 --- a/src/Type/Doctrine/QueryBuilder/QueryBuilderTypeSpecifyingExtension.php +++ b/src/Type/Doctrine/QueryBuilder/QueryBuilderTypeSpecifyingExtension.php @@ -2,6 +2,7 @@ namespace PHPStan\Type\Doctrine\QueryBuilder; +use Doctrine\ORM\QueryBuilder; use PhpParser\Node\Expr\MethodCall; use PhpParser\Node\Identifier; use PHPStan\Analyser\Scope; @@ -65,7 +66,7 @@ public function specifyTypes(MethodReflection $methodReflection, MethodCall $nod if ($returnType instanceof MixedType) { return new SpecifiedTypes([]); } - if (!$returnType->isSuperTypeOf(new ObjectType($this->getClass()))->yes()) { + if (!(new ObjectType(QueryBuilder::class))->isSuperTypeOf($returnType)->yes()) { return new SpecifiedTypes([]); } diff --git a/tests/DoctrineIntegration/ORM/data/queryBuilder.php b/tests/DoctrineIntegration/ORM/data/queryBuilder.php index 40708662..50eaf002 100644 --- a/tests/DoctrineIntegration/ORM/data/queryBuilder.php +++ b/tests/DoctrineIntegration/ORM/data/queryBuilder.php @@ -54,4 +54,27 @@ public function dynamicQueryBuilder(string $entityClass): Query return $queryBuilder->getQuery(); } + public function usingMethodThatReturnStatic(): ?MyEntity + { + $queryBuilder = $this->entityManager->createQueryBuilder(); + + $queryBuilder + ->select('e') + ->from(MyEntity::class, 'e') + ->where('e.id = :id') + ->setParameters([ + 'id' => 123, + ]); + + return $queryBuilder->getQuery()->getOneOrNullResult(); + } + + public function getCustomQueryBuilder(): CustomQueryBuilder + { + return $this->entityManager->createQueryBuilder(); + } +} + +class CustomQueryBuilder extends \Doctrine\ORM\QueryBuilder +{ } diff --git a/tests/DoctrineIntegration/ORM/phpstan.neon b/tests/DoctrineIntegration/ORM/phpstan.neon index 96aac89d..e93d7d43 100644 --- a/tests/DoctrineIntegration/ORM/phpstan.neon +++ b/tests/DoctrineIntegration/ORM/phpstan.neon @@ -7,3 +7,4 @@ parameters: doctrine: objectManagerLoader: entity-manager.php reportDynamicQueryBuilders: true + queryBuilderClass: PHPStan\DoctrineIntegration\ORM\QueryBuilder\CustomQueryBuilder