Skip to content

Commit

Permalink
Limit template annotations to Psalm
Browse files Browse the repository at this point in the history
Phpstan requires that the template can be resolved in all cases, while
Psalm seems to tolerate this ambiguous situation.
See phpstan/phpstan#5175 (comment)
  • Loading branch information
greg0ire committed Jun 16, 2021
1 parent 7827869 commit 8bb564d
Show file tree
Hide file tree
Showing 2 changed files with 38 additions and 1 deletion.
4 changes: 3 additions & 1 deletion lib/Doctrine/ORM/EntityManagerInterface.php
Original file line number Diff line number Diff line change
Expand Up @@ -321,11 +321,13 @@ public function hasFilters();
* {@inheritDoc}
*
* @psalm-param string|class-string<T> $className
* @phpstan-param string $className
*
* @return Mapping\ClassMetadata
* @psalm-return Mapping\ClassMetadata<T>
* @phpstan-return Mapping\ClassMetadata<object>
*
* @template T of object
* @psalm-template T of object
*/
public function getClassMetadata($className);
}
35 changes: 35 additions & 0 deletions tests/Doctrine/StaticAnalysis/get-metadata.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
<?php

namespace Doctrine\StaticAnalysis;

use Doctrine\ORM\EntityManagerInterface;
use Doctrine\ORM\Mapping\ClassMetadata;

/**
* EntityManagerInterface::getClassMetadata() is templated only for Psalm,
* because of limitations in PHPStan.
*
* @see https://github.com/phpstan/phpstan/issues/5175#issuecomment-861437050
*/
abstract class GetMetadata
{
/**
* @param string|object $class
* @phpstan-param class-string|object $class
*/
abstract public function getEntityManager($class): EntityManagerInterface;

/**
* @psalm-param class-string<TObject> $class
* @phpstan-param class-string $class
*
* @psalm-return ClassMetadata<TObject>
* @phpstan-return ClassMetadata<object>
*
* @psalm-template TObject of object
*/
public function __invoke(string $class): ClassMetadata
{
return $this->getEntityManager($class)->getClassMetadata($class);
}
}

0 comments on commit 8bb564d

Please sign in to comment.