diff --git a/lib/Doctrine/ODM/MongoDB/DocumentManager.php b/lib/Doctrine/ODM/MongoDB/DocumentManager.php index 9b323c430b..81363ee435 100644 --- a/lib/Doctrine/ODM/MongoDB/DocumentManager.php +++ b/lib/Doctrine/ODM/MongoDB/DocumentManager.php @@ -621,13 +621,15 @@ public function getReference(string $documentName, $identifier): object /** @psalm-var ClassMetadata $class */ $class = $this->metadataFactory->getMetadataFor(ltrim($documentName, '\\')); assert($class instanceof ClassMetadata); + /** @psalm-var T|false $document */ $document = $this->unitOfWork->tryGetById($identifier, $class); // Check identity map first, if its already in there just return it. - if ($document) { + if ($document !== false) { return $document; } + /** @psalm-var T&GhostObjectInterface $document */ $document = $this->proxyFactory->getProxy($class, $identifier); $this->unitOfWork->registerManaged($document, $identifier, []); @@ -689,6 +691,7 @@ public function find($className, $id, $lockMode = LockMode::NONE, $lockVersion = { $repository = $this->getRepository($className); if ($repository instanceof DocumentRepository) { + /** @psalm-var DocumentRepository $repository */ return $repository->find($id, $lockMode, $lockVersion); } diff --git a/lib/Doctrine/ODM/MongoDB/Mapping/ClassMetadata.php b/lib/Doctrine/ODM/MongoDB/Mapping/ClassMetadata.php index f7c9606f7e..cc214dc926 100644 --- a/lib/Doctrine/ODM/MongoDB/Mapping/ClassMetadata.php +++ b/lib/Doctrine/ODM/MongoDB/Mapping/ClassMetadata.php @@ -2247,7 +2247,7 @@ public function mapField(array $mapping): array break; default: if (! empty($this->generatorOptions['type'])) { - $mapping['type'] = $this->generatorOptions['type']; + $mapping['type'] = (string) $this->generatorOptions['type']; } elseif (empty($mapping['type'])) { $mapping['type'] = $this->generatorType === self::GENERATOR_TYPE_INCREMENT ? Type::INT : Type::CUSTOMID; } diff --git a/lib/Doctrine/ODM/MongoDB/Mapping/Driver/CompatibilityAnnotationDriver.php b/lib/Doctrine/ODM/MongoDB/Mapping/Driver/CompatibilityAnnotationDriver.php index 755077103f..08956fd8e4 100644 --- a/lib/Doctrine/ODM/MongoDB/Mapping/Driver/CompatibilityAnnotationDriver.php +++ b/lib/Doctrine/ODM/MongoDB/Mapping/Driver/CompatibilityAnnotationDriver.php @@ -9,18 +9,18 @@ use function class_exists; -if (class_exists(PersistenceAnnotationDriver::class)) { +if (! class_exists(PersistenceAnnotationDriver::class)) { /** * @internal This class will be removed in ODM 3.0. */ - abstract class CompatibilityAnnotationDriver extends PersistenceAnnotationDriver + abstract class CompatibilityAnnotationDriver implements MappingDriver { } } else { /** * @internal This class will be removed in ODM 3.0. */ - abstract class CompatibilityAnnotationDriver implements MappingDriver + abstract class CompatibilityAnnotationDriver extends PersistenceAnnotationDriver { } } diff --git a/lib/Doctrine/ODM/MongoDB/Proxy/Factory/StaticProxyFactory.php b/lib/Doctrine/ODM/MongoDB/Proxy/Factory/StaticProxyFactory.php index 76225222dd..b415ae75ca 100644 --- a/lib/Doctrine/ODM/MongoDB/Proxy/Factory/StaticProxyFactory.php +++ b/lib/Doctrine/ODM/MongoDB/Proxy/Factory/StaticProxyFactory.php @@ -88,11 +88,11 @@ static function (): bool { * @param DocumentPersister $documentPersister * * @psalm-return Closure( - * TDocument&GhostObjectInterface, - * string, - * array, + * TDocument&GhostObjectInterface=, + * string=, + * array=, * ?Closure=, - * array + * array= * ) : bool * * @template TDocument of object @@ -103,10 +103,8 @@ private function createInitializer( ): Closure { return function ( GhostObjectInterface $ghostObject, - string $method, - // we don't care - array $parameters, - // we don't care + string $method, // we don't care + array $parameters, // we don't care &$initializer, array $properties // we currently do not use this ) use ( diff --git a/lib/Doctrine/ODM/MongoDB/UnitOfWork.php b/lib/Doctrine/ODM/MongoDB/UnitOfWork.php index 106176e9e3..84510496a1 100644 --- a/lib/Doctrine/ODM/MongoDB/UnitOfWork.php +++ b/lib/Doctrine/ODM/MongoDB/UnitOfWork.php @@ -367,6 +367,7 @@ public function getDocumentPersister(string $documentName): Persisters\DocumentP $this->persisters[$documentName] = new Persisters\DocumentPersister($pb, $this->dm, $this, $this->hydratorFactory, $class); } + /** @psalm-var Persisters\DocumentPersister */ return $this->persisters[$documentName]; } diff --git a/phpstan-baseline.neon b/phpstan-baseline.neon index 6bf01e68db..7ac1cc21c5 100644 --- a/phpstan-baseline.neon +++ b/phpstan-baseline.neon @@ -145,8 +145,8 @@ parameters: # When iterating over SimpleXMLElement, we cannot know the key values - - message: "#^Parameter \\#2 \\$mapping of method Doctrine\\\\ODM\\\\MongoDB\\\\Mapping\\\\Driver\\\\XmlDriver\\:\\:addFieldMapping\\(\\) expects array\\{type\\?\\: string, fieldName\\?\\: string, name\\?\\: string, strategy\\?\\: string, association\\?\\: int, id\\?\\: bool, isOwningSide\\?\\: bool, collectionClass\\?\\: class\\-string, \\.\\.\\.\\}, array\\\\|bool\\|string\\> given\\.$#" - count: 1 + message: "#^Parameter \\#2 \\$mapping of method Doctrine\\\\ODM\\\\MongoDB\\\\Mapping\\\\Driver\\\\XmlDriver\\:\\:addFieldMapping\\(\\) expects array#" + count: 2 path: lib/Doctrine/ODM/MongoDB/Mapping/Driver/XmlDriver.php # This is handled by a try-catch block @@ -163,6 +163,17 @@ parameters: count: 1 path: lib/Doctrine/ODM/MongoDB/PersistentCollection.php + # complains about types for arguments we do not use/care + - + message: "#^Method Doctrine\\\\ODM\\\\MongoDB\\\\Proxy\\\\Factory\\\\StaticProxyFactory\\:\\:createInitializer\\(\\) should return Closure\\(ProxyManager\\\\Proxy\\\\GhostObjectInterface\\&TDocument of object\\=, string\\=, array\\\\=, Closure\\|null\\=, array\\\\=\\)\\: bool but returns Closure\\(ProxyManager\\\\Proxy\\\\GhostObjectInterface, string, array, mixed, array\\)\\: true\\.$#" + count: 1 + path: lib/Doctrine/ODM/MongoDB/Proxy/Factory/StaticProxyFactory.php + + - + message: "#^Parameter \\#1 \\$initializer of method ProxyManager\\\\Proxy\\\\GhostObjectInterface\\\\:\\:setProxyInitializer\\(\\) expects \\(Closure\\(ProxyManager\\\\Proxy\\\\GhostObjectInterface\\\\=, string\\=, array\\\\=, Closure\\|null\\=, array\\\\=\\)\\: bool\\)\\|null, Closure\\(ProxyManager\\\\Proxy\\\\GhostObjectInterface, string, array, mixed, array\\)\\: true given\\.$#" + count: 1 + path: lib/Doctrine/ODM/MongoDB/Hydrator/HydratorFactory.php + # compatibility layer for doctrine/persistence ^2.4 || ^3.0 - message: "#.*#" @@ -220,3 +231,14 @@ parameters: message: "#.+mapField\\(\\) expects.+enumType\\: 'Documents81#" count: 2 path: tests/Doctrine/ODM/MongoDB/Tests/Mapping/ClassMetadataTest.php + + # it loads an empty class ReflectionEnum of ReflectionEnumPolyfill.php file from laminas/laminas-code, see https://github.com/phpstan/phpstan/issues/7290 + - + message: "#^Call to an undefined method ReflectionEnum\\:\\:isBacked\\(\\)\\.$#" + count: 1 + path: lib/Doctrine/ODM/MongoDB/Mapping/ClassMetadata.php + + - + message: "#^Call to an undefined method ReflectionEnum\\:\\:getBackingType\\(\\)\\.$#" + count: 1 + path: lib/Doctrine/ODM/MongoDB/Mapping/ClassMetadata.php diff --git a/tests/Doctrine/ODM/MongoDB/Tests/Repository/DefaultGridFSRepositoryTest.php b/tests/Doctrine/ODM/MongoDB/Tests/Repository/DefaultGridFSRepositoryTest.php index a7bccc8c6b..63a8e57ab8 100644 --- a/tests/Doctrine/ODM/MongoDB/Tests/Repository/DefaultGridFSRepositoryTest.php +++ b/tests/Doctrine/ODM/MongoDB/Tests/Repository/DefaultGridFSRepositoryTest.php @@ -268,6 +268,7 @@ private function getRepository(string $className = File::class): GridFSRepositor assert($repository instanceof GridFSRepository); + /** @psalm-var GridFSRepository */ return $repository; } diff --git a/tests/Documents81/Suit.php b/tests/Documents81/Suit.php index 30ed52d0fd..1a57e2340a 100644 --- a/tests/Documents81/Suit.php +++ b/tests/Documents81/Suit.php @@ -6,8 +6,8 @@ enum Suit: string { - case Hearts = 'H'; + case Hearts = 'H'; case Diamonds = 'D'; - case Clubs = 'C'; - case Spades = 'S'; + case Clubs = 'C'; + case Spades = 'S'; } diff --git a/tests/Documents81/SuitInt.php b/tests/Documents81/SuitInt.php index 13a948b2c9..9a06f94d84 100644 --- a/tests/Documents81/SuitInt.php +++ b/tests/Documents81/SuitInt.php @@ -6,8 +6,8 @@ enum SuitInt: int { - case Hearts = 1; + case Hearts = 1; case Diamonds = 2; - case Clubs = 3; - case Spades = 4; + case Clubs = 3; + case Spades = 4; }