Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,6 @@ cs-fix:
phpstan:
php vendor/bin/phpstan analyse -l 8 -c phpstan.neon src tests

.PHONY: phpstan-generate-baseline
.PHONY: phpstan-generate-baselmake ine
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

typo

phpstan-generate-baseline:
php vendor/bin/phpstan analyse -l 8 -c phpstan.neon src tests -b phpstan-baseline.neon
Original file line number Diff line number Diff line change
Expand Up @@ -84,6 +84,7 @@ public function getTypeFromMethodCall(
$typeBuilder = new QueryResultTypeBuilder();

try {
/** @var Query<array-key, mixed> $query */
$query = $em->createQuery($queryString);
QueryResultTypeWalker::walk($query, $typeBuilder, $this->descriptorRegistry);
} catch (ORMException | DBALException | NewDBALException | CommonException $e) {
Expand Down
6 changes: 3 additions & 3 deletions src/Type/Doctrine/Query/QueryResultTypeWalker.php
Original file line number Diff line number Diff line change
Expand Up @@ -79,7 +79,7 @@ class QueryResultTypeWalker extends SqlWalker
*/
private $newObjectCounter = 0;

/** @var Query<mixed> */
/** @var Query<array-key, mixed> */
private $query;

/** @var EntityManagerInterface */
Expand Down Expand Up @@ -108,7 +108,7 @@ class QueryResultTypeWalker extends SqlWalker
private $hasGroupByClause;

/**
* @param Query<mixed> $query
* @param Query<array-key, mixed> $query
*/
public static function walk(Query $query, QueryResultTypeBuilder $typeBuilder, DescriptorRegistry $descriptorRegistry): void
{
Expand All @@ -123,7 +123,7 @@ public static function walk(Query $query, QueryResultTypeBuilder $typeBuilder, D
/**
* {@inheritDoc}
*
* @param Query<mixed> $query
* @param Query<array-key, mixed> $query
* @param ParserResult $parserResult
* @param array<QueryComponent> $queryComponents
*/
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@
use Doctrine\DBAL\DBALException;
use Doctrine\ORM\EntityManagerInterface;
use Doctrine\ORM\ORMException;
use Doctrine\ORM\Query;
use PhpParser\Node\Expr\MethodCall;
use PhpParser\Node\Identifier;
use PHPStan\Analyser\Scope;
Expand Down Expand Up @@ -159,6 +160,7 @@ private function getQueryType(string $dql): Type
$typeBuilder = new QueryResultTypeBuilder();

try {
/** @var Query<array-key, mixed> $query */
$query = $em->createQuery($dql);
QueryResultTypeWalker::walk($query, $typeBuilder, $this->descriptorRegistry);
} catch (ORMException | DBALException | CommonException $e) {
Expand Down
14 changes: 14 additions & 0 deletions stubs/ORM/Query.stub
Original file line number Diff line number Diff line change
Expand Up @@ -3,10 +3,24 @@
namespace Doctrine\ORM;

/**
* @template TKey as array-key
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This might be conflicting with the solution propsed in #384

* @template TResult The type of results returned by this query in HYDRATE_OBJECT mode
*
* @extends AbstractQuery<TResult>
*/
final class Query extends AbstractQuery
{
public const HYDRATE_OBJECT = 1;
Copy link
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This was needed to fix:

 ------ ------------------------------------------------ 
  Line   stubs/ORM/Query.stub                            
 ------ ------------------------------------------------ 
  23     PHPDoc tag @return contains unresolvable type.  
 ------ ------------------------------------------------ 


/**
* @param int|string $hydrationMode
*
* @return ($hydrationMode is self::HYDRATE_OBJECT
* ? array<TKey, TResult>
* : mixed
* )
*/
public function getResult($hydrationMode = self::HYDRATE_OBJECT)
{
}
}
2 changes: 1 addition & 1 deletion stubs/ORM/QueryBuilder.stub
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@ class QueryBuilder
}

/**
* @return Query<mixed>
* @return Query<array-key, mixed>
*/
public function getQuery()
{
Expand Down
4 changes: 2 additions & 2 deletions stubs/bleedingEdge/ORM/QueryBuilder.stub
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@ class QueryBuilder
{

/**
* @return Query<mixed>
* @return Query<array-key, mixed>
*/
public function getQuery()
{
Expand Down Expand Up @@ -143,7 +143,7 @@ class QueryBuilder
{

}

/**
* @param literal-string|object|array<mixed> $predicates
* @return $this
Expand Down
2 changes: 2 additions & 0 deletions tests/Type/Doctrine/Query/QueryResultTypeWalkerTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@
use Doctrine\Common\Collections\ArrayCollection;
use Doctrine\ORM\EntityManagerInterface;
use Doctrine\ORM\Mapping\Column;
use Doctrine\ORM\Query;
use Doctrine\ORM\Query\AST\TypedExpression;
use Doctrine\ORM\Tools\SchemaTool;
use PHPStan\Testing\PHPStanTestCase;
Expand Down Expand Up @@ -190,6 +191,7 @@ public function test(Type $expectedType, string $dql, ?string $expectedException
{
$em = self::$em;

/** @var Query<array-key, mixed> $query */
$query = $em->createQuery($dql);

$typeBuilder = new QueryResultTypeBuilder();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -49,7 +49,7 @@ public function testQueryResultTypeIsMixedWhenDQLIsNotKnown(QueryBuilder $builde
{
$query = $builder->getQuery();

assertType('Doctrine\ORM\Query<mixed>', $query);
assertType('Doctrine\ORM\Query<(int|string), mixed>', $query);
}

public function testQueryResultTypeIsMixedWhenDQLIsInvalid(EntityManagerInterface $em): void
Expand Down
16 changes: 8 additions & 8 deletions tests/Type/Doctrine/data/QueryResult/queryResult.php
Original file line number Diff line number Diff line change
Expand Up @@ -232,36 +232,36 @@ public function testReturnTypeOfQueryMethodsWithExplicitNonConstantHydrationMode
* Test that we return the original return type when ResultType may be
* VoidType
*
* @param Query<mixed> $query
* @param Query<array-key, mixed> $query
*/
public function testReturnTypeOfQueryMethodsWithReturnTypeIsMixed(EntityManagerInterface $em, Query $query): void
{
assertType(
'mixed',
'array<(int|string)>',
Copy link
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

TBH, I'm not really sure about these changes but all the tests pass now 🙄

$query->getResult(AbstractQuery::HYDRATE_OBJECT)
);
assertType(
'iterable',
'iterable<(int|string)>',
$query->toIterable([], AbstractQuery::HYDRATE_OBJECT)
);
assertType(
'mixed',
'array<(int|string)>',
$query->execute(null, AbstractQuery::HYDRATE_OBJECT)
);
assertType(
'mixed',
'array<(int|string)>',
$query->executeIgnoreQueryCache(null, AbstractQuery::HYDRATE_OBJECT)
);
assertType(
'mixed',
'array<(int|string)>',
$query->executeUsingQueryCache(null, AbstractQuery::HYDRATE_OBJECT)
);
assertType(
'mixed',
'(int|string)',
$query->getSingleResult(AbstractQuery::HYDRATE_OBJECT)
);
assertType(
'mixed',
'int|string|null',
$query->getOneOrNullResult(AbstractQuery::HYDRATE_OBJECT)
);
}
Expand Down