diff --git a/.github/workflows/coding-standard.yml b/.github/workflows/coding-standard.yml index 20e55b12fcc..d861ff8cf5d 100644 --- a/.github/workflows/coding-standard.yml +++ b/.github/workflows/coding-standard.yml @@ -10,6 +10,4 @@ on: jobs: coding-standards: - uses: "doctrine/.github/.github/workflows/coding-standards.yml@1.4.1" - with: - php-version: "8.1" + uses: "doctrine/.github/.github/workflows/coding-standards.yml@2.0.0" diff --git a/.github/workflows/continuous-integration.yml b/.github/workflows/continuous-integration.yml index 569cc2f0ff1..28f186b1302 100644 --- a/.github/workflows/continuous-integration.yml +++ b/.github/workflows/continuous-integration.yml @@ -14,7 +14,7 @@ env: jobs: phpunit-smoke-check: name: "PHPUnit with SQLite" - runs-on: "ubuntu-20.04" + runs-on: "ubuntu-22.04" strategy: matrix: @@ -70,7 +70,7 @@ jobs: phpunit-postgres: name: "PHPUnit with PostgreSQL" - runs-on: "ubuntu-20.04" + runs-on: "ubuntu-22.04" needs: "phpunit-smoke-check" strategy: @@ -136,7 +136,7 @@ jobs: phpunit-mariadb: name: "PHPUnit with MariaDB" - runs-on: "ubuntu-20.04" + runs-on: "ubuntu-22.04" needs: "phpunit-smoke-check" strategy: @@ -209,7 +209,7 @@ jobs: phpunit-mysql: name: "PHPUnit with MySQL" - runs-on: "ubuntu-20.04" + runs-on: "ubuntu-22.04" needs: "phpunit-smoke-check" strategy: @@ -296,7 +296,7 @@ jobs: upload_coverage: name: "Upload coverage to Codecov" - runs-on: "ubuntu-20.04" + runs-on: "ubuntu-22.04" needs: - "phpunit-smoke-check" - "phpunit-postgres" diff --git a/.github/workflows/phpbench.yml b/.github/workflows/phpbench.yml index f134dba863e..9588ccd4cca 100644 --- a/.github/workflows/phpbench.yml +++ b/.github/workflows/phpbench.yml @@ -15,7 +15,7 @@ env: jobs: phpbench: name: "PHPBench" - runs-on: "ubuntu-20.04" + runs-on: "ubuntu-22.04" strategy: matrix: diff --git a/.github/workflows/release-on-milestone-closed.yml b/.github/workflows/release-on-milestone-closed.yml index b8645ec65cd..0e473ab4780 100644 --- a/.github/workflows/release-on-milestone-closed.yml +++ b/.github/workflows/release-on-milestone-closed.yml @@ -7,7 +7,7 @@ on: jobs: release: - uses: "doctrine/.github/.github/workflows/release-on-milestone-closed.yml@1.4.1" + uses: "doctrine/.github/.github/workflows/release-on-milestone-closed.yml@2.0.0" secrets: GIT_AUTHOR_EMAIL: ${{ secrets.GIT_AUTHOR_EMAIL }} GIT_AUTHOR_NAME: ${{ secrets.GIT_AUTHOR_NAME }} diff --git a/.github/workflows/static-analysis.yml b/.github/workflows/static-analysis.yml index f46c5505b5b..f5a6df9cf15 100644 --- a/.github/workflows/static-analysis.yml +++ b/.github/workflows/static-analysis.yml @@ -11,7 +11,7 @@ on: jobs: static-analysis-phpstan: name: Static Analysis with PHPStan - runs-on: ubuntu-20.04 + runs-on: ubuntu-22.04 strategy: matrix: @@ -44,7 +44,7 @@ jobs: static-analysis-psalm: name: Static Analysis with Psalm - runs-on: ubuntu-20.04 + runs-on: ubuntu-22.04 strategy: matrix: diff --git a/lib/Doctrine/ORM/Tools/Pagination/Paginator.php b/lib/Doctrine/ORM/Tools/Pagination/Paginator.php index f7ade370120..5fa7cc8157e 100644 --- a/lib/Doctrine/ORM/Tools/Pagination/Paginator.php +++ b/lib/Doctrine/ORM/Tools/Pagination/Paginator.php @@ -14,8 +14,8 @@ use Doctrine\ORM\Query\Parser; use Doctrine\ORM\Query\ResultSetMapping; use Doctrine\ORM\QueryBuilder; -use Iterator; use IteratorAggregate; +use Traversable; use function array_key_exists; use function array_map; @@ -25,7 +25,7 @@ /** * The paginator can handle various complex scenarios with DQL. * - * @template T + * @template-covariant T */ class Paginator implements Countable, IteratorAggregate { @@ -101,9 +101,9 @@ public function count(): int /** * {@inheritdoc} * - * @psalm-return Iterator + * @psalm-return Traversable */ - public function getIterator(): Iterator + public function getIterator(): Traversable { $offset = $this->query->getFirstResult(); $length = $this->query->getMaxResults(); diff --git a/tests/Doctrine/StaticAnalysis/Tools/Pagination/paginator-covariant.php b/tests/Doctrine/StaticAnalysis/Tools/Pagination/paginator-covariant.php new file mode 100644 index 00000000000..b49a731d837 --- /dev/null +++ b/tests/Doctrine/StaticAnalysis/Tools/Pagination/paginator-covariant.php @@ -0,0 +1,65 @@ + */ + private $class; + + /** + * @param class-string $class + */ + final public function __construct(string $class) + { + $this->class = $class; + } + + /** + * @return class-string + */ + public function getClass(): string + { + return $this->class; + } + + /** + * @psalm-return Paginator + */ + abstract public function createPaginator(): Paginator; +} + +interface Animal +{ +} + +class Cat implements Animal +{ +} + +/** + * @param Paginator $paginator + */ +function getFirstAnimal(Paginator $paginator): ?Animal +{ + foreach ($paginator as $result) { + return $result; + } + + return null; +} + +/** + * @param PaginatorFactory $catPaginatorFactory + */ +function test(PaginatorFactory $catPaginatorFactory): ?Animal +{ + return getFirstAnimal($catPaginatorFactory->createPaginator()); +} diff --git a/tests/Doctrine/Tests/OrmFunctionalTestCase.php b/tests/Doctrine/Tests/OrmFunctionalTestCase.php index a42b8af82d8..188ed2b247e 100644 --- a/tests/Doctrine/Tests/OrmFunctionalTestCase.php +++ b/tests/Doctrine/Tests/OrmFunctionalTestCase.php @@ -1033,7 +1033,7 @@ protected function setUpDBALTypes(): void final protected function isQueryLogAvailable(): bool { - return $this->_em->getConnection() instanceof Connection; + return $this->_em?->getConnection() instanceof Connection; } final protected function getQueryLog(): QueryLog