Repository: doctrine-extensions/DoctrineExtensions (language: php)

Issue:
LogEntryInterface::getObjectClass() @phpstan-return is missing null
<!--
    Before you open an issue, make sure this one does not already exist.
    Please, read the contents at https://github.com/doctrine-extensions/DoctrineExtensions/blob/main/CONTRIBUTING.md#what-you-can-contribute.
-->

<!--
    If you are reporting a bug, please try to fill in the following.
    Otherwise remove it.
-->

### Environment

#### Package

<details><summary>show</summary>
<p>

```
$ composer show --latest gedmo/doctrine-extensions
name     : gedmo/doctrine-extensions
descrip. : Doctrine behavioral extensions
keywords : Blameable, behaviors, doctrine, extensions, gedmo, loggable, nestedset, odm, orm, sluggable, sortable, timestampable, translatable, tree, uploadable
versions : * v3.14.0
released : 2023-12-03, 4 months ago
latest   : v3.15.0 released 2024-02-12, 2 months ago
type     : library
license  : MIT License (MIT) (OSI approved) https://spdx.org/licenses/MIT.html#licenseText
homepage : http://gediminasm.org/
source   : [git] https://github.com/doctrine-extensions/DoctrineExtensions.git 3b5b5cba476b4ae32a55ef69ef2e59d64d5893cf
dist     : [zip] https://api.github.com/repos/doctrine-extensions/DoctrineExtensions/zipball/3b5b5cba476b4ae32a55ef69ef2e59d64d5893cf 3b5b5cba476b4ae32a55ef69ef2e59d64d5893cf
path     : /srv/www/vendor/gedmo/doctrine-extensions
names    : gedmo/doctrine-extensions

support
email : gediminas.morkevicius@gmail.com
issues : https://github.com/doctrine-extensions/DoctrineExtensions/issues
source : https://github.com/doctrine-extensions/DoctrineExtensions/tree/v3.14.0
wiki : https://github.com/Atlantic18/DoctrineExtensions/tree/main/doc

autoload
psr-4
Gedmo\ => src/

requires
behat/transliterator ^1.2
doctrine/annotations ^1.13 || ^2.0
doctrine/collections ^1.2 || ^2.0
doctrine/common ^2.13 || ^3.0
doctrine/event-manager ^1.2 || ^2.0
doctrine/persistence ^2.2 || ^3.0
php ^7.4 || ^8.0
psr/cache ^1 || ^2 || ^3
symfony/cache ^5.4 || ^6.0 || ^7.0
symfony/deprecation-contracts ^2.1 || ^3.0

requires (dev)
doctrine/cache ^1.11 || ^2.0
doctrine/dbal ^3.2
doctrine/doctrine-bundle ^2.3
doctrine/mongodb-odm ^2.3
doctrine/orm ^2.14.0
friendsofphp/php-cs-fixer ^3.14.0
nesbot/carbon ^2.71 || 3.x-dev as 3.0
phpstan/phpstan ^1.10.2
phpstan/phpstan-doctrine ^1.0
phpstan/phpstan-phpunit ^1.0
phpunit/phpunit ^9.6
rector/rector ^0.18
symfony/console ^5.4 || ^6.0 || ^7.0
symfony/phpunit-bridge ^6.0 || ^7.0
symfony/yaml ^5.4 || ^6.0 || ^7.0

suggests
doctrine/mongodb-odm to use the extensions with the MongoDB ODM
doctrine/orm to use the extensions with the ORM

conflicts
doctrine/dbal <3.2
doctrine/mongodb-odm <2.3
doctrine/orm <2.14.0 || 2.16.0 || 2.16.1
sebastian/comparator <2.0
```

</p>
</details>

#### Doctrine packages

<details><summary>show</summary>
<p>

```
$ composer show --latest 'doctrine/*'
Color legend:
- patch or minor release available - update recommended
- major release available - update possible
- up to date version

Direct dependencies required in composer.json:
doctrine/annotations                2.0.1  2.0.1  Docblock Annotations Parser
doctrine/doctrine-bundle            2.12.0 2.12.0 Symfony DoctrineBundle
doctrine/doctrine-migrations-bundle 3.3.0  3.3.0  Symfony DoctrineMigrationsBundle
doctrine/mongodb-odm-bundle         5.0.1  5.0.1  Symfony Doctrine MongoDB Bundle
doctrine/orm                        3.1.1  3.1.2  Object-Relational-Mapper for PHP

Transitive dependencies not required in composer.json:
doctrine/cache                      2.2.0  2.2.0  PHP Doctrine Cache library is a popular cache implementation that supports many different drivers such as redis, memcache, apc, mongodb and others.
doctrine/collections                2.2.1  2.2.2  PHP Doctrine Collections library that adds additional functionality on top of PHP arrays.
doctrine/common                     3.4.3  3.4.4  PHP Doctrine Common project is a library that provides additional functionality that other Doctrine projects depend on such as better reflection support, proxies and muc...
doctrine/dbal                       4.0.1  4.0.1  Powerful PHP database abstraction layer (DBAL) with many features for database schema introspection and management.
doctrine/deprecations               1.1.3  1.1.3  A small layer on top of trigger_error(E_USER_DEPRECATED) or PSR-3 logging with options to disable all deprecations or selectively for packages.
doctrine/event-manager              2.0.0  2.0.0  The Doctrine Event Manager is a simple PHP event system that was built to be used with the various Doctrine projects.
doctrine/inflector                  2.0.10 2.0.10 PHP Doctrine Inflector is a small library that can perform string manipulations with regard to upper/lowercase and singular/plural forms of words.
doctrine/instantiator               2.0.0  2.0.0  A small, lightweight utility to instantiate objects in PHP without invoking their constructors
doctrine/lexer                      3.0.1  3.0.1  PHP Doctrine Lexer parser library that can be used in Top-Down, Recursive Descent Parsers.
doctrine/migrations                 3.7.4  3.7.4  PHP Doctrine Migrations project offer additional functionality on top of the database abstraction layer (DBAL) for versioning your database schema and easily deploying c...
doctrine/mongodb-odm                2.7.0  2.7.0  PHP Doctrine MongoDB Object Document Mapper (ODM) provides transparent persistence for PHP objects to MongoDB.
doctrine/persistence                3.3.2  3.3.2  The Doctrine Persistence project is a set of shared interfaces and functionality that the different Doctrine object mappers share.
doctrine/sql-formatter              1.2.0  1.2.0  a PHP SQL highlighting library
```

</p>
</details>

#### PHP version

```
$ php -v
PHP 8.3.6 (cli) (built: Apr 11 2024 15:12:15) (NTS)
Copyright (c) The PHP Group
Zend Engine v4.3.6, Copyright (c) Zend Technologies
    with Zend OPcache v8.3.6, Copyright (c), by Zend Technologies
```

## Subject
It appears that Loggable's `LogEntryInterface::getObjectClass()` is missing a `null` type from the `@phpstan-return` annotation.
```
    /**
     * @return string|null
     *
     * @phpstan-return class-string<T>
     */
    public function getObjectClass();
```
https://github.com/doctrine-extensions/DoctrineExtensions/blob/main/src/Loggable/LogEntryInterface.php#L61

This is backed up by:
```
    /**
     * @var string|null
     *
     * @phpstan-var class-string<T>|null
     *
     * @ORM\Column(name="object_class", type="string", length=191)
     */
    #[ORM\Column(name: 'object_class', type: Types::STRING, length: 191)]
    protected $objectClass;
```
https://github.com/doctrine-extensions/DoctrineExtensions/blob/main/src/Loggable/Entity/MappedSuperclass/AbstractLogEntry.php#L68

And:
```
    /**
     * @var string|null
     *
     * @phpstan-var class-string<T>|null
     *
     * @MongoODM\Field(type="string")
     */
    #[MongoODM\Field(type: Type::STRING)]
    protected $objectClass;
```
https://github.com/doctrine-extensions/DoctrineExtensions/blob/main/src/Loggable/Document/MappedSuperclass/AbstractLogEntry.php#L64

This can be highlighted by running psalm.

## Minimal repository with the bug
https://github.com/doctrine-extensions/DoctrineExtensions/tree/main

## Steps to reproduce
- Implement LogEntryInterface
- Run psalm

## Expected results
```
------------------------------
                              
       No errors found!       
                              
------------------------------
```
## Actual results
```
ERROR: ImplementedReturnTypeMismatch - The inherited return type 'class-string<T:MyClass as object>' for
Gedmo\Loggable\LogEntryInterface::getObjectClass is different to the implemented return type for
App\Document\Log::getobjectclass '(class-string<T:MyClass as object>)|null' (see https://psalm.dev/123)
     * @return class-string<T>|null


------------------------------
1 errors found
------------------------------
```

## Suggested fix
```
      /**
       * @return string|null
       *
-      * @phpstan-return class-string<T>
+      * @phpstan-return class-string<T>|null
       */
      public function getObjectClass();
```
https://github.com/doctrine-extensions/DoctrineExtensions/blob/main/src/Loggable/LogEntryInterface.php#L61


Discussion / hints:
A PR adding the missing types would definitely be welcome!

Fix patch:
diff --git a/src/Loggable/LogEntryInterface.php b/src/Loggable/LogEntryInterface.php
index 0c18b4c43..a283580ec 100644
--- a/src/Loggable/LogEntryInterface.php
+++ b/src/Loggable/LogEntryInterface.php
@@ -58,7 +58,7 @@ public function setObjectClass(string $objectClass);
     /**
      * @return string|null
      *
-     * @phpstan-return class-string<T>
+     * @phpstan-return class-string<T>|null
      */
     public function getObjectClass();
 


Test patch: