From 873a72f88bb1210eed6a0df698b16aac368fc716 Mon Sep 17 00:00:00 2001
From: Fran Moreno <franmomu@gmail.com>
Date: Sun, 1 May 2022 10:52:11 +0200
Subject: [PATCH] Add some generic information

---
 lib/Doctrine/ODM/MongoDB/Configuration.php           | 12 ++++++------
 lib/Doctrine/ODM/MongoDB/DocumentManager.php         |  4 ++--
 .../AbstractPersistentCollectionFactory.php          |  4 ++++
 .../PersistentCollectionFactory.php                  |  3 +++
 .../ODM/MongoDB/Persisters/PersistenceBuilder.php    |  3 ++-
 lib/Doctrine/ODM/MongoDB/Query/FilterCollection.php  |  2 ++
 lib/Doctrine/ODM/MongoDB/Query/ReferencePrimer.php   |  6 ++++--
 7 files changed, 23 insertions(+), 11 deletions(-)

diff --git a/lib/Doctrine/ODM/MongoDB/Configuration.php b/lib/Doctrine/ODM/MongoDB/Configuration.php
index cb0a1e4bba..8aadb2ab11 100644
--- a/lib/Doctrine/ODM/MongoDB/Configuration.php
+++ b/lib/Doctrine/ODM/MongoDB/Configuration.php
@@ -89,8 +89,8 @@ class Configuration
      *      autoGeneratePersistentCollectionClasses?: self::AUTOGENERATE_*,
      *      classMetadataFactoryName?: class-string<ClassMetadataFactory>,
      *      defaultCommitOptions?: CommitOptions,
-     *      defaultDocumentRepositoryClassName?: class-string<ObjectRepository>,
-     *      defaultGridFSRepositoryClassName?: class-string<GridFSRepository>,
+     *      defaultDocumentRepositoryClassName?: class-string<ObjectRepository<object>>,
+     *      defaultGridFSRepositoryClassName?: class-string<GridFSRepository<object>>,
      *      defaultDB?: string,
      *      documentNamespaces?: array<string, string>,
      *      filters?: array<string, array{
@@ -488,7 +488,7 @@ public function getFilterParameters(string $name): array
     }
 
     /**
-     * @psalm-param class-string<ObjectRepository> $className
+     * @psalm-param class-string<ObjectRepository<object>> $className
      *
      * @throws MongoDBException If not is a ObjectRepository.
      */
@@ -504,7 +504,7 @@ public function setDefaultDocumentRepositoryClassName(string $className): void
     }
 
     /**
-     * @psalm-return class-string<ObjectRepository>
+     * @psalm-return class-string<ObjectRepository<object>>
      */
     public function getDefaultDocumentRepositoryClassName(): string
     {
@@ -512,7 +512,7 @@ public function getDefaultDocumentRepositoryClassName(): string
     }
 
     /**
-     * @psalm-param class-string<GridFSRepository> $className
+     * @psalm-param class-string<GridFSRepository<object>> $className
      *
      * @throws MongoDBException If the class does not implement the GridFSRepository interface.
      */
@@ -528,7 +528,7 @@ public function setDefaultGridFSRepositoryClassName(string $className): void
     }
 
     /**
-     * @psalm-return class-string<GridFSRepository>
+     * @psalm-return class-string<GridFSRepository<object>>
      */
     public function getDefaultGridFSRepositoryClassName(): string
     {
diff --git a/lib/Doctrine/ODM/MongoDB/DocumentManager.php b/lib/Doctrine/ODM/MongoDB/DocumentManager.php
index 13c9dc9b53..9b323c430b 100644
--- a/lib/Doctrine/ODM/MongoDB/DocumentManager.php
+++ b/lib/Doctrine/ODM/MongoDB/DocumentManager.php
@@ -817,8 +817,8 @@ public function createReference(object $document, array $referenceMapping)
     /**
      * Build discriminator portion of reference for specified reference mapping and class metadata.
      *
-     * @param array         $referenceMapping Mappings of reference for which discriminator data is created.
-     * @param ClassMetadata $class            Metadata of reference document class.
+     * @param array                 $referenceMapping Mappings of reference for which discriminator data is created.
+     * @param ClassMetadata<object> $class            Metadata of reference document class.
      * @psalm-param FieldMapping $referenceMapping
      *
      * @return array with next structure [{discriminator field} => {discriminator value}]
diff --git a/lib/Doctrine/ODM/MongoDB/PersistentCollection/AbstractPersistentCollectionFactory.php b/lib/Doctrine/ODM/MongoDB/PersistentCollection/AbstractPersistentCollectionFactory.php
index a572b51cd5..b562889c04 100644
--- a/lib/Doctrine/ODM/MongoDB/PersistentCollection/AbstractPersistentCollectionFactory.php
+++ b/lib/Doctrine/ODM/MongoDB/PersistentCollection/AbstractPersistentCollectionFactory.php
@@ -36,8 +36,12 @@ public function create(DocumentManager $dm, array $mapping, ?BaseCollection $col
      * Creates instance of collection class to be wrapped by PersistentCollection.
      *
      * @param string $collectionClass FQCN of class to instantiate
+     * @psalm-param class-string<TDocument> $collectionClass
      *
      * @return BaseCollection
+     * @psalm-return BaseCollection<array-key, TDocument>
+     *
+     * @template TDocument of object
      */
     abstract protected function createCollectionClass(string $collectionClass): BaseCollection;
 }
diff --git a/lib/Doctrine/ODM/MongoDB/PersistentCollection/PersistentCollectionFactory.php b/lib/Doctrine/ODM/MongoDB/PersistentCollection/PersistentCollectionFactory.php
index 56d5fa0059..39b163132e 100644
--- a/lib/Doctrine/ODM/MongoDB/PersistentCollection/PersistentCollectionFactory.php
+++ b/lib/Doctrine/ODM/MongoDB/PersistentCollection/PersistentCollectionFactory.php
@@ -19,6 +19,9 @@ interface PersistentCollectionFactory
      * Creates specified persistent collection to work with given collection class.
      *
      * @psalm-param FieldMapping $mapping
+     * @psalm-param BaseCollection<array-key, object>|null $coll
+     *
+     * @psalm-return PersistentCollectionInterface<array-key, object>
      */
     public function create(DocumentManager $dm, array $mapping, ?BaseCollection $coll = null): PersistentCollectionInterface;
 }
diff --git a/lib/Doctrine/ODM/MongoDB/Persisters/PersistenceBuilder.php b/lib/Doctrine/ODM/MongoDB/Persisters/PersistenceBuilder.php
index faf5cbb813..cfc548fda5 100644
--- a/lib/Doctrine/ODM/MongoDB/Persisters/PersistenceBuilder.php
+++ b/lib/Doctrine/ODM/MongoDB/Persisters/PersistenceBuilder.php
@@ -488,7 +488,8 @@ public function prepareAssociatedDocumentValue(array $mapping, $document, $inclu
     /**
      * Returns the collection representation to be stored and unschedules it afterwards.
      *
-     * @param bool $includeNestedCollections
+     * @param PersistentCollectionInterface<array-key, object> $coll
+     * @param bool                                             $includeNestedCollections
      *
      * @return mixed[]
      */
diff --git a/lib/Doctrine/ODM/MongoDB/Query/FilterCollection.php b/lib/Doctrine/ODM/MongoDB/Query/FilterCollection.php
index 638f5e56b0..13ff85d3a7 100644
--- a/lib/Doctrine/ODM/MongoDB/Query/FilterCollection.php
+++ b/lib/Doctrine/ODM/MongoDB/Query/FilterCollection.php
@@ -145,6 +145,8 @@ public function isEnabled(string $name): bool
     /**
      * Gets enabled filter criteria.
      *
+     * @param ClassMetadata<object> $class
+     *
      * @return array<string, mixed>
      */
     public function getFilterCriteria(ClassMetadata $class): array
diff --git a/lib/Doctrine/ODM/MongoDB/Query/ReferencePrimer.php b/lib/Doctrine/ODM/MongoDB/Query/ReferencePrimer.php
index 44131380c9..4146d52d44 100644
--- a/lib/Doctrine/ODM/MongoDB/Query/ReferencePrimer.php
+++ b/lib/Doctrine/ODM/MongoDB/Query/ReferencePrimer.php
@@ -96,7 +96,7 @@ public function __construct(DocumentManager $dm, UnitOfWork $uow)
      * the default primer defined in the constructor. If $primer is not
      * callable, the default primer will be used.
      *
-     * @param ClassMetadata                     $class     Class metadata for the document
+     * @param ClassMetadata<object>             $class     Class metadata for the document
      * @param array<object>|Traversable<object> $documents Documents containing references to prime
      * @param string                            $fieldName Field name containing references to prime
      * @param array                             $hints     UnitOfWork hints for priming queries
@@ -167,10 +167,11 @@ public function primeReferences(ClassMetadata $class, $documents, string $fieldN
      * ... but you cannot prime this: myDocument.embeddedDocument.referencedDocuments.referencedDocument(s)
      * This addresses Issue #624.
      *
+     * @param ClassMetadata<object>             $class
      * @param array<object>|Traversable<object> $documents
      * @param FieldMapping|null                 $mapping
      *
-     * @return array{fieldName: string, class: ClassMetadata, documents: array<object>|Traversable<object>, mapping: FieldMapping}
+     * @return array{fieldName: string, class: ClassMetadata<object>, documents: array<object>|Traversable<object>, mapping: FieldMapping}
      */
     private function parseDotSyntaxForPrimer(string $fieldName, ClassMetadata $class, $documents, ?array $mapping = null): array
     {
@@ -245,6 +246,7 @@ private function parseDotSyntaxForPrimer(string $fieldName, ClassMetadata $class
      * have a target document class defined. Without that, there is no way to
      * infer the class of the referenced documents.
      *
+     * @param PersistentCollectionInterface<array-key, object> $persistentCollection
      * @psalm-param array<class-string, array<string, mixed>> $groupedIds
      */
     private function addManyReferences(PersistentCollectionInterface $persistentCollection, array &$groupedIds): void