diff -pruN 1.10.0-3/.editorconfig 1.12.0-1/.editorconfig
--- 1.10.0-3/.editorconfig	1970-01-01 00:00:00.000000000 +0000
+++ 1.12.0-1/.editorconfig	2025-11-21 15:09:14.000000000 +0000
@@ -0,0 +1,12 @@
+root = true
+
+[*]
+charset = utf-8
+end_of_line = lf
+insert_final_newline = true
+indent_style = space
+indent_size = 4
+trim_trailing_whitespace = true
+
+[*.yml]
+indent_size = 2
diff -pruN 1.10.0-3/.git-blame-ignore-revs 1.12.0-1/.git-blame-ignore-revs
--- 1.10.0-3/.git-blame-ignore-revs	1970-01-01 00:00:00.000000000 +0000
+++ 1.12.0-1/.git-blame-ignore-revs	2025-11-21 15:09:14.000000000 +0000
@@ -0,0 +1,16 @@
+# CS: no whitespace before return type colon
+6937c3bf9f57533b310c28c1758f4af6bd777f92
+# CS: miscellaneous other whitespace fixes
+92a009284c653e8576ee544191f2167f97c93aed
+# Fix style issues
+0339a6b726db84790d94794e36f502c52e0e518a
+# CS fixes
+2e32a6d48972b2c1976ed5d8967145b6cec4a4a9
+# CS fixes
+e64841657859b6a3d1ecf01d6922ce1548ad7382
+# fix code style
+81dea8effddb6afc070552d95b8f5bbc2589fe10
+# Style fixes
+0cbfc1c752b9fae8c7a0be740e5d6af496463e1e
+# Apply doctrine coding standards
+d0e860a40b8199a0d5166023bc3764eed7af7d83
diff -pruN 1.10.0-3/.gitattributes 1.12.0-1/.gitattributes
--- 1.10.0-3/.gitattributes	2024-11-09 15:12:26.000000000 +0000
+++ 1.12.0-1/.gitattributes	2025-11-21 15:09:14.000000000 +0000
@@ -1,6 +1,8 @@
 /.github/ export-ignore
 /examples/ export-ignore
 /tests/ export-ignore
+/.editorconfig export-ignore
+/.git-blame-ignore-revs export-ignore
 /.gitattributes export-ignore
 /.gitignore export-ignore
 /.yamllint.yaml export-ignore
diff -pruN 1.10.0-3/.github/workflows/documentation.yaml 1.12.0-1/.github/workflows/documentation.yaml
--- 1.10.0-3/.github/workflows/documentation.yaml	2024-11-09 15:12:26.000000000 +0000
+++ 1.12.0-1/.github/workflows/documentation.yaml	2025-11-21 15:09:14.000000000 +0000
@@ -12,14 +12,14 @@ jobs:
     runs-on: "ubuntu-latest"
     steps:
       - name: "Checkout"
-        uses: "actions/checkout@v4"
+        uses: "actions/checkout@v5"
 
       - name: "Build"
         uses: "phpDocumentor/phpDocumentor@master"
 
       - name: "Deploy"
         if: "${{ github.event_name == 'push' && github.ref == 'refs/heads/1.x' }}"
-        uses: "actions/upload-artifact@v4"
+        uses: "actions/upload-artifact@v5"
         with:
           name: "documentation"
           path: "build/docs"
@@ -32,14 +32,14 @@ jobs:
     needs: "documentation"
     steps:
       - name: "Checkout"
-        uses: "actions/checkout@v4"
+        uses: "actions/checkout@v5"
         with:
           repository: "phpDocumentor/docs"
           token: "${{ secrets.BOT_TOKEN }}"
           path: "docs"
 
       - name: "Download"
-        uses: "actions/download-artifact@v4"
+        uses: "actions/download-artifact@v6"
         with:
           name: "documentation"
           path: "build/docs"
@@ -48,7 +48,7 @@ jobs:
         run: "rsync -r --delete build/docs/* docs/docs/components/type-resolver"
 
       - name: "Commit"
-        uses: "stefanzweifel/git-auto-commit-action@v5"
+        uses: "stefanzweifel/git-auto-commit-action@v7"
         with:
           repository: "docs"
           commit_message: "Update type-resolver documentation"
diff -pruN 1.10.0-3/.github/workflows/integrate.yaml 1.12.0-1/.github/workflows/integrate.yaml
--- 1.10.0-3/.github/workflows/integrate.yaml	2024-11-09 15:12:26.000000000 +0000
+++ 1.12.0-1/.github/workflows/integrate.yaml	2025-11-21 15:09:14.000000000 +0000
@@ -21,13 +21,13 @@ jobs:
 
   coding-standards:
     name: "Coding Standards"
-    uses: "phpDocumentor/.github/.github/workflows/coding-standards.yml@v0.8"
+    uses: "phpDocumentor/.github/.github/workflows/coding-standards.yml@v0.9"
     with:
       composer-root-version: "1.x-dev"
 
   dependency-analysis:
     name: "Dependency analysis"
-    uses: "phpDocumentor/.github/.github/workflows/dependency-analysis.yml@v0.8"
+    uses: "phpDocumentor/.github/.github/workflows/dependency-analysis.yml@v0.9"
     with:
       composer-root-version: "1.x-dev"
 
@@ -39,14 +39,14 @@ jobs:
 
   static-analysis:
     name: "Static analysis"
-    uses: "phpDocumentor/.github/.github/workflows/static-analysis.yml@v0.8"
+    uses: "phpDocumentor/.github/.github/workflows/static-analysis.yml@v0.9"
     with:
       php-extensions: "none, ctype, dom, json, mbstring, phar, simplexml, tokenizer, xml, xmlwriter, fileinfo, pcntl, posix"
       composer-root-version: "1.x-dev"
 
   unit-tests:
     name: "Unit test"
-    uses: "phpDocumentor/.github/.github/workflows/continuous-integration.yml@v0.8"
+    uses: "phpDocumentor/.github/.github/workflows/continuous-integration.yml@v0.9"
     with:
       composer-root-version: "1.x-dev"
       upcoming-releases: true
diff -pruN 1.10.0-3/.gitignore 1.12.0-1/.gitignore
--- 1.10.0-3/.gitignore	2024-11-09 15:12:26.000000000 +0000
+++ 1.12.0-1/.gitignore	2025-11-21 15:09:14.000000000 +0000
@@ -1,6 +1,7 @@
 # IDE Shizzle; it is recommended to use a global .gitignore for this but since this is an OSS project we want to make
 # it easy to contribute
 .idea
+.vscode
 /nbproject/private/
 .buildpath
 .project
diff -pruN 1.10.0-3/debian/changelog 1.12.0-1/debian/changelog
--- 1.10.0-3/debian/changelog	2025-02-17 17:46:09.000000000 +0000
+++ 1.12.0-1/debian/changelog	2025-11-28 07:00:55.000000000 +0000
@@ -1,3 +1,39 @@
+php-phpdocumentor-type-resolver (1.12.0-1) unstable; urgency=medium
+
+  [ Максим Спирков ]
+  * Add `AbstractList::getOriginalKeyType()` method
+
+ -- David Prévot <taffit@debian.org>  Fri, 28 Nov 2025 08:00:55 +0100
+
+php-phpdocumentor-type-resolver (1.11.1-1) unstable; urgency=medium
+
+  [ Максим Спирков ]
+  * Fix `@return` annotation for `SelfTest::provideToStringData()`
+  * Add tests for DNF types
+  * Make `OffsetAccess` properties private
+
+ -- David Prévot <taffit@debian.org>  Sat, 22 Nov 2025 09:54:38 +0100
+
+php-phpdocumentor-type-resolver (1.11.0-1) unstable; urgency=medium
+
+  [ Danny van der Sluijs ]
+  * Correct documentation reference
+
+  [ Максим Спирков ]
+  * Fix handling of array shapes without keys
+  * Add the `TypeNode` property to `Mixed_`
+  * Conditional, ConditionalForParameter, IntMask, IntMaskOf, KeyOf,
+    OffsetAccess, ValueOf
+
+  [ Maksim Spirkov ]
+  * Add support for generics in `Static_` and `Self_` (#228)
+
+  [ David Prévot ]
+  * Remove Rules-Requires-Root
+  * debian/control: Document nocheck flag
+
+ -- David Prévot <taffit@debian.org>  Fri, 21 Nov 2025 09:13:33 +0100
+
 php-phpdocumentor-type-resolver (1.10.0-3) unstable; urgency=medium
 
   * Revert "Force system dependencies loading"
diff -pruN 1.10.0-3/debian/control 1.12.0-1/debian/control
--- 1.10.0-3/debian/control	2025-02-17 17:37:54.000000000 +0000
+++ 1.12.0-1/debian/control	2025-11-22 08:49:45.000000000 +0000
@@ -6,16 +6,15 @@ Uploaders: David Prévot <taffit@debian.
            Prach Pongpanich <prachpub@gmail.com>
 Build-Depends: debhelper-compat (= 13),
                dh-sequence-phpcomposer,
-               php-doctrine-deprecations,
+               php-doctrine-deprecations <!nocheck>,
                php-phpdocumentor-reflection-common,
                php-phpstan-phpdoc-parser,
                phpab,
-               phpunit
-Standards-Version: 4.7.0
+               phpunit <!nocheck>
+Standards-Version: 4.7.2
 Homepage: https://phpdoc.org/
 Vcs-Git: https://salsa.debian.org/php-team/pear/php-phpdocumentor-type-resolver.git
 Vcs-Browser: https://salsa.debian.org/php-team/pear/php-phpdocumentor-type-resolver
-Rules-Requires-Root: no
 
 Package: php-phpdocumentor-type-resolver
 Multi-Arch: foreign
diff -pruN 1.10.0-3/debian/patches/0002-Compatibility-with-recent-PHPUnit-10.patch 1.12.0-1/debian/patches/0002-Compatibility-with-recent-PHPUnit-10.patch
--- 1.10.0-3/debian/patches/0002-Compatibility-with-recent-PHPUnit-10.patch	2025-02-17 17:45:44.000000000 +0000
+++ 1.12.0-1/debian/patches/0002-Compatibility-with-recent-PHPUnit-10.patch	2025-11-28 06:57:23.000000000 +0000
@@ -68,10 +68,10 @@ index a576f95..545067e 100644
          return [
              'simple non-empty-list' => [new NonEmptyList(), 'non-empty-list'],
 diff --git a/tests/unit/TypeResolverTest.php b/tests/unit/TypeResolverTest.php
-index 915471d..c10fa1c 100644
+index a1da11e..f27b214 100644
 --- a/tests/unit/TypeResolverTest.php
 +++ b/tests/unit/TypeResolverTest.php
-@@ -774,7 +774,7 @@ class TypeResolverTest extends TestCase
+@@ -781,7 +781,7 @@ class TypeResolverTest extends TestCase
       *
       * @return string[][]
       */
@@ -80,7 +80,7 @@ index 915471d..c10fa1c 100644
      {
          return [
              ['string', String_::class],
-@@ -827,7 +827,7 @@ class TypeResolverTest extends TestCase
+@@ -834,7 +834,7 @@ class TypeResolverTest extends TestCase
       *
       * @return (string|bool)[][]
       */
@@ -89,7 +89,7 @@ index 915471d..c10fa1c 100644
      {
          return [
              ['class-string<\phpDocumentor\Reflection>', false],
-@@ -841,7 +841,7 @@ class TypeResolverTest extends TestCase
+@@ -848,7 +848,7 @@ class TypeResolverTest extends TestCase
       *
       * @return (string|bool)[][]
       */
@@ -98,7 +98,7 @@ index 915471d..c10fa1c 100644
      {
          return [
              ['interface-string<\phpDocumentor\Reflection>', false],
-@@ -855,7 +855,7 @@ class TypeResolverTest extends TestCase
+@@ -862,7 +862,7 @@ class TypeResolverTest extends TestCase
       *
       * @return string[][]
       */
@@ -107,7 +107,7 @@ index 915471d..c10fa1c 100644
      {
          return [
              'namespace' => ['\phpDocumentor\Reflection'],
-@@ -908,7 +908,7 @@ class TypeResolverTest extends TestCase
+@@ -915,7 +915,7 @@ class TypeResolverTest extends TestCase
      /**
       * @return array<array{0: string, 1: Type}>
       */
@@ -116,7 +116,7 @@ index 915471d..c10fa1c 100644
      {
          return [
              [
-@@ -983,7 +983,7 @@ class TypeResolverTest extends TestCase
+@@ -1059,7 +1059,7 @@ class TypeResolverTest extends TestCase
      /**
       * @return array<array{0: string, 1: Type}>
       */
@@ -125,7 +125,7 @@ index 915471d..c10fa1c 100644
      {
          return [
              [
-@@ -1041,7 +1041,7 @@ class TypeResolverTest extends TestCase
+@@ -1157,7 +1157,7 @@ class TypeResolverTest extends TestCase
      /**
       * @return array<array{0: string, 1: Type}>
       */
@@ -134,7 +134,7 @@ index 915471d..c10fa1c 100644
      {
          return [
              [
-@@ -1103,7 +1103,7 @@ class TypeResolverTest extends TestCase
+@@ -1219,7 +1219,7 @@ class TypeResolverTest extends TestCase
      /**
       * @return array<array{0: string, 1: Type}>
       */
@@ -143,7 +143,7 @@ index 915471d..c10fa1c 100644
      {
          return [
              [
-@@ -1140,7 +1140,7 @@ class TypeResolverTest extends TestCase
+@@ -1256,7 +1256,7 @@ class TypeResolverTest extends TestCase
      /**
       * @return array<array{0: string, 1: Type}>
       */
@@ -152,7 +152,7 @@ index 915471d..c10fa1c 100644
      {
          return [
              [
-@@ -1176,7 +1176,7 @@ class TypeResolverTest extends TestCase
+@@ -1299,7 +1299,7 @@ class TypeResolverTest extends TestCase
      /**
       * @return array<array{0: string, 1: Type}>
       */
diff -pruN 1.10.0-3/debian/patches/0003-Modernize-PHPUnit-syntax.patch 1.12.0-1/debian/patches/0003-Modernize-PHPUnit-syntax.patch
--- 1.10.0-3/debian/patches/0003-Modernize-PHPUnit-syntax.patch	2025-02-17 17:45:44.000000000 +0000
+++ 1.12.0-1/debian/patches/0003-Modernize-PHPUnit-syntax.patch	2025-11-28 06:57:23.000000000 +0000
@@ -3,18 +3,93 @@ Date: Mon, 17 Feb 2025 18:42:12 +0100
 Subject: Modernize PHPUnit syntax
 
 ---
- tests/unit/PseudoTypes/IntRangeTest.php      |  3 ++-
- tests/unit/PseudoTypes/ListTest.php          |  3 ++-
- tests/unit/PseudoTypes/NonEmptyArrayTest.php |  3 ++-
- tests/unit/PseudoTypes/NonEmptyListTest.php  |  3 ++-
- tests/unit/TypeResolverTest.php              | 21 +++++++++++----------
- tests/unit/Types/ArrayTest.php               |  3 ++-
- tests/unit/Types/ClassStringTest.php         |  3 ++-
- tests/unit/Types/CollectionTest.php          |  3 ++-
- tests/unit/Types/InterfaceStringTest.php     |  3 ++-
- tests/unit/Types/IterableTest.php            |  3 ++-
- 10 files changed, 29 insertions(+), 19 deletions(-)
+ tests/unit/PseudoTypes/ArrayShapeTest.php           |  3 ++-
+ .../PseudoTypes/ConditionalForParameterTest.php     |  3 ++-
+ tests/unit/PseudoTypes/ConditionalTest.php          |  3 ++-
+ tests/unit/PseudoTypes/IntRangeTest.php             |  3 ++-
+ tests/unit/PseudoTypes/ListTest.php                 |  3 ++-
+ tests/unit/PseudoTypes/NonEmptyArrayTest.php        |  3 ++-
+ tests/unit/PseudoTypes/NonEmptyListTest.php         |  3 ++-
+ tests/unit/PseudoTypes/OffsetAccessTest.php         |  3 ++-
+ tests/unit/TypeResolverTest.php                     | 21 +++++++++++----------
+ tests/unit/Types/ArrayTest.php                      |  3 ++-
+ tests/unit/Types/ClassStringTest.php                |  3 ++-
+ tests/unit/Types/CollectionTest.php                 |  3 ++-
+ tests/unit/Types/InterfaceStringTest.php            |  3 ++-
+ tests/unit/Types/IterableTest.php                   |  3 ++-
+ tests/unit/Types/SelfTest.php                       |  3 ++-
+ tests/unit/Types/StaticTest.php                     |  3 ++-
+ 16 files changed, 41 insertions(+), 25 deletions(-)
 
+diff --git a/tests/unit/PseudoTypes/ArrayShapeTest.php b/tests/unit/PseudoTypes/ArrayShapeTest.php
+index 981a98b..9b7f027 100644
+--- a/tests/unit/PseudoTypes/ArrayShapeTest.php
++++ b/tests/unit/PseudoTypes/ArrayShapeTest.php
+@@ -4,6 +4,7 @@ declare(strict_types=1);
+ 
+ namespace phpDocumentor\Reflection\PseudoTypes;
+ 
++use PHPUnit\Framework\Attributes\DataProvider;
+ use PHPUnit\Framework\TestCase;
+ 
+ /**
+@@ -25,9 +26,9 @@ class ArrayShapeTest extends TestCase
+     }
+ 
+     /**
+-     * @dataProvider provideToStringData
+      * @covers ::__toString
+      */
++    #[DataProvider('provideToStringData')]
+     public function testToString(string $expectedResult, ArrayShape $arrayShape): void
+     {
+         $this->assertSame($expectedResult, (string) $arrayShape);
+diff --git a/tests/unit/PseudoTypes/ConditionalForParameterTest.php b/tests/unit/PseudoTypes/ConditionalForParameterTest.php
+index 7eec9c3..87bd50c 100644
+--- a/tests/unit/PseudoTypes/ConditionalForParameterTest.php
++++ b/tests/unit/PseudoTypes/ConditionalForParameterTest.php
+@@ -7,6 +7,7 @@ namespace phpDocumentor\Reflection\PseudoTypes;
+ use phpDocumentor\Reflection\Types\Array_;
+ use phpDocumentor\Reflection\Types\Integer;
+ use phpDocumentor\Reflection\Types\Static_;
++use PHPUnit\Framework\Attributes\DataProvider;
+ use PHPUnit\Framework\TestCase;
+ 
+ /**
+@@ -37,9 +38,9 @@ class ConditionalForParameterTest extends TestCase
+     }
+ 
+     /**
+-     * @dataProvider provideToStringData
+      * @covers ::__toString
+      */
++    #[DataProvider('provideToStringData')]
+     public function testToString(string $expectedResult, ConditionalForParameter $type): void
+     {
+         $this->assertSame($expectedResult, (string) $type);
+diff --git a/tests/unit/PseudoTypes/ConditionalTest.php b/tests/unit/PseudoTypes/ConditionalTest.php
+index aff523d..12fcfdc 100644
+--- a/tests/unit/PseudoTypes/ConditionalTest.php
++++ b/tests/unit/PseudoTypes/ConditionalTest.php
+@@ -9,6 +9,7 @@ use phpDocumentor\Reflection\Types\Array_;
+ use phpDocumentor\Reflection\Types\Integer;
+ use phpDocumentor\Reflection\Types\Object_;
+ use phpDocumentor\Reflection\Types\Static_;
++use PHPUnit\Framework\Attributes\DataProvider;
+ use PHPUnit\Framework\TestCase;
+ 
+ /**
+@@ -39,9 +40,9 @@ class ConditionalTest extends TestCase
+     }
+ 
+     /**
+-     * @dataProvider provideToStringData
+      * @covers ::__toString
+      */
++    #[DataProvider('provideToStringData')]
+     public function testToString(string $expectedResult, Conditional $type): void
+     {
+         $this->assertSame($expectedResult, (string) $type);
 diff --git a/tests/unit/PseudoTypes/IntRangeTest.php b/tests/unit/PseudoTypes/IntRangeTest.php
 index 3147374..388beb3 100644
 --- a/tests/unit/PseudoTypes/IntRangeTest.php
@@ -107,11 +182,34 @@ index 545067e..6ef1b0d 100644
      public function testArrayStringifyCorrectly(NonEmptyList $array, string $expectedString): void
      {
          $this->assertSame($expectedString, (string) $array);
+diff --git a/tests/unit/PseudoTypes/OffsetAccessTest.php b/tests/unit/PseudoTypes/OffsetAccessTest.php
+index 34bd1c8..5194916 100644
+--- a/tests/unit/PseudoTypes/OffsetAccessTest.php
++++ b/tests/unit/PseudoTypes/OffsetAccessTest.php
+@@ -6,6 +6,7 @@ namespace phpDocumentor\Reflection\PseudoTypes;
+ 
+ use phpDocumentor\Reflection\Fqsen;
+ use phpDocumentor\Reflection\Types\Object_;
++use PHPUnit\Framework\Attributes\DataProvider;
+ use PHPUnit\Framework\TestCase;
+ 
+ /**
+@@ -28,9 +29,9 @@ class OffsetAccessTest extends TestCase
+     }
+ 
+     /**
+-     * @dataProvider provideToStringData
+      * @covers ::__toString
+      */
++    #[DataProvider('provideToStringData')]
+     public function testToString(string $expectedResult, OffsetAccess $type): void
+     {
+         $this->assertSame($expectedResult, (string) $type);
 diff --git a/tests/unit/TypeResolverTest.php b/tests/unit/TypeResolverTest.php
-index c10fa1c..ffb38d3 100644
+index f27b214..9f4950c 100644
 --- a/tests/unit/TypeResolverTest.php
 +++ b/tests/unit/TypeResolverTest.php
-@@ -70,6 +70,7 @@ use phpDocumentor\Reflection\Types\Static_;
+@@ -77,6 +77,7 @@ use phpDocumentor\Reflection\Types\Static_;
  use phpDocumentor\Reflection\Types\String_;
  use phpDocumentor\Reflection\Types\This;
  use phpDocumentor\Reflection\Types\Void_;
@@ -119,7 +217,7 @@ index c10fa1c..ffb38d3 100644
  use PHPUnit\Framework\TestCase;
  use RuntimeException;
  use stdClass;
-@@ -93,8 +94,8 @@ class TypeResolverTest extends TestCase
+@@ -100,8 +101,8 @@ class TypeResolverTest extends TestCase
       * @covers ::createType
       * @covers ::<private>
       *
@@ -129,7 +227,7 @@ index c10fa1c..ffb38d3 100644
      public function testResolvingKeywords(string $keyword, string $expectedClass): void
      {
          $fixture = new TypeResolver();
-@@ -114,8 +115,8 @@ class TypeResolverTest extends TestCase
+@@ -121,8 +122,8 @@ class TypeResolverTest extends TestCase
       * @covers ::createType
       * @covers ::<private>
       *
@@ -139,7 +237,7 @@ index c10fa1c..ffb38d3 100644
      public function testResolvingClassStrings(string $classString, bool $throwsException): void
      {
          $fixture = new TypeResolver();
-@@ -139,8 +140,8 @@ class TypeResolverTest extends TestCase
+@@ -146,8 +147,8 @@ class TypeResolverTest extends TestCase
       * @covers ::createType
       * @covers ::<private>
       *
@@ -149,7 +247,7 @@ index c10fa1c..ffb38d3 100644
      public function testResolvingInterfaceStrings(string $interfaceString, bool $throwsException): void
      {
          $fixture = new TypeResolver();
-@@ -165,8 +166,8 @@ class TypeResolverTest extends TestCase
+@@ -172,8 +173,8 @@ class TypeResolverTest extends TestCase
       * @covers ::createType
       * @covers ::<private>
       *
@@ -159,7 +257,7 @@ index c10fa1c..ffb38d3 100644
      public function testResolvingFQSENs(string $fqsen): void
      {
          $fixture = new TypeResolver();
-@@ -883,14 +884,14 @@ class TypeResolverTest extends TestCase
+@@ -890,14 +891,14 @@ class TypeResolverTest extends TestCase
       * @covers ::__construct
       * @covers ::resolve
       * @covers ::createType
@@ -294,3 +392,49 @@ index 04731e8..46db1cc 100644
      public function testIterableStringifyCorrectly(Iterable_ $iterable, string $expectedString): void
      {
          $this->assertSame($expectedString, (string) $iterable);
+diff --git a/tests/unit/Types/SelfTest.php b/tests/unit/Types/SelfTest.php
+index ac7874b..7a802d0 100644
+--- a/tests/unit/Types/SelfTest.php
++++ b/tests/unit/Types/SelfTest.php
+@@ -5,6 +5,7 @@ declare(strict_types=1);
+ namespace phpDocumentor\Reflection\Types;
+ 
+ use phpDocumentor\Reflection\Fqsen;
++use PHPUnit\Framework\Attributes\DataProvider;
+ use PHPUnit\Framework\TestCase;
+ 
+ /**
+@@ -29,9 +30,9 @@ class SelfTest extends TestCase
+     }
+ 
+     /**
+-     * @dataProvider provideToStringData
+      * @covers ::__toString
+      */
++    #[DataProvider('provideToStringData')]
+     public function testToString(string $expectedResult, Self_ $type): void
+     {
+         $this->assertSame($expectedResult, (string) $type);
+diff --git a/tests/unit/Types/StaticTest.php b/tests/unit/Types/StaticTest.php
+index f41c1c0..bc104e2 100644
+--- a/tests/unit/Types/StaticTest.php
++++ b/tests/unit/Types/StaticTest.php
+@@ -5,6 +5,7 @@ declare(strict_types=1);
+ namespace phpDocumentor\Reflection\Types;
+ 
+ use phpDocumentor\Reflection\Fqsen;
++use PHPUnit\Framework\Attributes\DataProvider;
+ use PHPUnit\Framework\TestCase;
+ 
+ /**
+@@ -29,9 +30,9 @@ class StaticTest extends TestCase
+     }
+ 
+     /**
+-     * @dataProvider provideToStringData
+      * @covers ::__toString
+      */
++    #[DataProvider('provideToStringData')]
+     public function testToString(string $expectedResult, Static_ $type): void
+     {
+         $this->assertSame($expectedResult, (string) $type);
diff -pruN 1.10.0-3/debian/upstream/changelog 1.12.0-1/debian/upstream/changelog
--- 1.10.0-3/debian/upstream/changelog	2025-02-17 17:37:54.000000000 +0000
+++ 1.12.0-1/debian/upstream/changelog	2025-11-28 07:00:38.000000000 +0000
@@ -1,3 +1,26 @@
+1.12.0 - 24 Nov 2025
+
+    Add AbstractList::getOriginalKeyType() method by @mspirkov in #233
+
+1.11.1 - 21 Nov 2025
+
+    Add tests for DNF types by @mspirkov in #230
+    Fix @return annotation for SelfTest::provideToStringData() by @mspirkov in #229
+    Make OffsetAccess properties private by @mspirkov in #232
+
+1.11.0 - 20 Nov 2025
+
+    Add support for conditional types, offset access types and key-of, value-of, int-mask, int-mask-of by @mspirkov in #225
+    Add support for generics in Static_ and Self_ by @mspirkov in #228
+    Add .editorconfig by @mspirkov in #226
+    Exclude commits with CS changes from Git Blame by @mspirkov in #227
+
+1.10.1 - 18 Nov 2025
+
+    Correct documentation reference by @DannyvdSluijs in #216
+    Fix handling of array shapes without keys by @mspirkov in #224
+
+
 1.10.0 - 9 Nov 2024
 
     add support for phpstan/phpdoc-parser 2 by @xabbuh in #212
diff -pruN 1.10.0-3/src/PseudoTypes/Conditional.php 1.12.0-1/src/PseudoTypes/Conditional.php
--- 1.10.0-3/src/PseudoTypes/Conditional.php	1970-01-01 00:00:00.000000000 +0000
+++ 1.12.0-1/src/PseudoTypes/Conditional.php	2025-11-21 15:09:14.000000000 +0000
@@ -0,0 +1,90 @@
+<?php
+/*
+ * This file is part of phpDocumentor.
+ *
+ *  For the full copyright and license information, please view the LICENSE
+ *  file that was distributed with this source code.
+ *
+ *  @link      http://phpdoc.org
+ *
+ */
+
+declare(strict_types=1);
+
+namespace phpDocumentor\Reflection\PseudoTypes;
+
+use phpDocumentor\Reflection\PseudoType;
+use phpDocumentor\Reflection\Type;
+use phpDocumentor\Reflection\Types\Mixed_;
+
+use function sprintf;
+
+/**
+ * Value Object representing the conditional type.
+ *
+ * @psalm-immutable
+ */
+final class Conditional extends Mixed_ implements PseudoType
+{
+    /** @var bool */
+    private $negated;
+    /** @var Type */
+    private $subjectType;
+    /** @var Type */
+    private $targetType;
+    /** @var Type */
+    private $if;
+    /** @var Type */
+    private $else;
+
+    public function __construct(bool $negated, Type $subjectType, Type $targetType, Type $if, Type $else)
+    {
+        $this->negated = $negated;
+        $this->subjectType = $subjectType;
+        $this->targetType = $targetType;
+        $this->if = $if;
+        $this->else = $else;
+    }
+
+    public function isNegated(): bool
+    {
+        return $this->negated;
+    }
+
+    public function getSubjectType(): Type
+    {
+        return $this->subjectType;
+    }
+
+    public function getTargetType(): Type
+    {
+        return $this->targetType;
+    }
+
+    public function getIf(): Type
+    {
+        return $this->if;
+    }
+
+    public function getElse(): Type
+    {
+        return $this->else;
+    }
+
+    public function underlyingType(): Type
+    {
+        return new Mixed_();
+    }
+
+    public function __toString(): string
+    {
+        return sprintf(
+            '(%s %s %s ? %s : %s)',
+            (string) $this->subjectType,
+            $this->negated ? 'is not' : 'is',
+            (string) $this->targetType,
+            (string) $this->if,
+            (string) $this->else
+        );
+    }
+}
diff -pruN 1.10.0-3/src/PseudoTypes/ConditionalForParameter.php 1.12.0-1/src/PseudoTypes/ConditionalForParameter.php
--- 1.10.0-3/src/PseudoTypes/ConditionalForParameter.php	1970-01-01 00:00:00.000000000 +0000
+++ 1.12.0-1/src/PseudoTypes/ConditionalForParameter.php	2025-11-21 15:09:14.000000000 +0000
@@ -0,0 +1,90 @@
+<?php
+/*
+ * This file is part of phpDocumentor.
+ *
+ *  For the full copyright and license information, please view the LICENSE
+ *  file that was distributed with this source code.
+ *
+ *  @link      http://phpdoc.org
+ *
+ */
+
+declare(strict_types=1);
+
+namespace phpDocumentor\Reflection\PseudoTypes;
+
+use phpDocumentor\Reflection\PseudoType;
+use phpDocumentor\Reflection\Type;
+use phpDocumentor\Reflection\Types\Mixed_;
+
+use function sprintf;
+
+/**
+ * Value Object representing the conditional type for parameter.
+ *
+ * @psalm-immutable
+ */
+final class ConditionalForParameter extends Mixed_ implements PseudoType
+{
+    /** @var bool */
+    private $negated;
+    /** @var string */
+    private $parameterName;
+    /** @var Type */
+    private $targetType;
+    /** @var Type */
+    private $if;
+    /** @var Type */
+    private $else;
+
+    public function __construct(bool $negated, string $parameterName, Type $targetType, Type $if, Type $else)
+    {
+        $this->negated = $negated;
+        $this->parameterName = $parameterName;
+        $this->targetType = $targetType;
+        $this->if = $if;
+        $this->else = $else;
+    }
+
+    public function isNegated(): bool
+    {
+        return $this->negated;
+    }
+
+    public function getParameterName(): string
+    {
+        return $this->parameterName;
+    }
+
+    public function getTargetType(): Type
+    {
+        return $this->targetType;
+    }
+
+    public function getIf(): Type
+    {
+        return $this->if;
+    }
+
+    public function getElse(): Type
+    {
+        return $this->else;
+    }
+
+    public function underlyingType(): Type
+    {
+        return new Mixed_();
+    }
+
+    public function __toString(): string
+    {
+        return sprintf(
+            '(%s %s %s ? %s : %s)',
+            '$' . $this->parameterName,
+            $this->negated ? 'is not' : 'is',
+            (string) $this->targetType,
+            (string) $this->if,
+            (string) $this->else
+        );
+    }
+}
diff -pruN 1.10.0-3/src/PseudoTypes/IntMask.php 1.12.0-1/src/PseudoTypes/IntMask.php
--- 1.10.0-3/src/PseudoTypes/IntMask.php	1970-01-01 00:00:00.000000000 +0000
+++ 1.12.0-1/src/PseudoTypes/IntMask.php	2025-11-21 15:09:14.000000000 +0000
@@ -0,0 +1,54 @@
+<?php
+/*
+ * This file is part of phpDocumentor.
+ *
+ *  For the full copyright and license information, please view the LICENSE
+ *  file that was distributed with this source code.
+ *
+ *  @link      http://phpdoc.org
+ *
+ */
+
+declare(strict_types=1);
+
+namespace phpDocumentor\Reflection\PseudoTypes;
+
+use phpDocumentor\Reflection\PseudoType;
+use phpDocumentor\Reflection\Type;
+use phpDocumentor\Reflection\Types\Integer;
+
+use function implode;
+
+/**
+ * Value Object representing the `int-mask` type.
+ *
+ * @psalm-immutable
+ */
+final class IntMask extends Integer implements PseudoType
+{
+    /** @var Type[] */
+    private $types;
+
+    public function __construct(Type ...$types)
+    {
+        $this->types = $types;
+    }
+
+    /**
+     * @return Type[]
+     */
+    public function getTypes(): array
+    {
+        return $this->types;
+    }
+
+    public function underlyingType(): Type
+    {
+        return new Integer();
+    }
+
+    public function __toString(): string
+    {
+        return 'int-mask<' . implode(', ', $this->types) . '>';
+    }
+}
diff -pruN 1.10.0-3/src/PseudoTypes/IntMaskOf.php 1.12.0-1/src/PseudoTypes/IntMaskOf.php
--- 1.10.0-3/src/PseudoTypes/IntMaskOf.php	1970-01-01 00:00:00.000000000 +0000
+++ 1.12.0-1/src/PseudoTypes/IntMaskOf.php	2025-11-21 15:09:14.000000000 +0000
@@ -0,0 +1,49 @@
+<?php
+/*
+ * This file is part of phpDocumentor.
+ *
+ *  For the full copyright and license information, please view the LICENSE
+ *  file that was distributed with this source code.
+ *
+ *  @link      http://phpdoc.org
+ *
+ */
+
+declare(strict_types=1);
+
+namespace phpDocumentor\Reflection\PseudoTypes;
+
+use phpDocumentor\Reflection\PseudoType;
+use phpDocumentor\Reflection\Type;
+use phpDocumentor\Reflection\Types\Integer;
+
+/**
+ * Value Object representing the `int-mask-of` type.
+ *
+ * @psalm-immutable
+ */
+final class IntMaskOf extends Integer implements PseudoType
+{
+    /** @var Type */
+    private $type;
+
+    public function __construct(Type $type)
+    {
+        $this->type = $type;
+    }
+
+    public function getType(): Type
+    {
+        return $this->type;
+    }
+
+    public function underlyingType(): Type
+    {
+        return new Integer();
+    }
+
+    public function __toString(): string
+    {
+        return 'int-mask-of<' . $this->type . '>';
+    }
+}
diff -pruN 1.10.0-3/src/PseudoTypes/KeyOf.php 1.12.0-1/src/PseudoTypes/KeyOf.php
--- 1.10.0-3/src/PseudoTypes/KeyOf.php	1970-01-01 00:00:00.000000000 +0000
+++ 1.12.0-1/src/PseudoTypes/KeyOf.php	2025-11-21 15:09:14.000000000 +0000
@@ -0,0 +1,49 @@
+<?php
+/*
+ * This file is part of phpDocumentor.
+ *
+ *  For the full copyright and license information, please view the LICENSE
+ *  file that was distributed with this source code.
+ *
+ *  @link      http://phpdoc.org
+ *
+ */
+
+declare(strict_types=1);
+
+namespace phpDocumentor\Reflection\PseudoTypes;
+
+use phpDocumentor\Reflection\PseudoType;
+use phpDocumentor\Reflection\Type;
+use phpDocumentor\Reflection\Types\ArrayKey;
+
+/**
+ * Value Object representing the `key-of` type.
+ *
+ * @psalm-immutable
+ */
+final class KeyOf extends ArrayKey implements PseudoType
+{
+    /** @var Type */
+    private $type;
+
+    public function __construct(Type $type)
+    {
+        $this->type = $type;
+    }
+
+    public function getType(): Type
+    {
+        return $this->type;
+    }
+
+    public function underlyingType(): Type
+    {
+        return new ArrayKey();
+    }
+
+    public function __toString(): string
+    {
+        return 'key-of<' . $this->type . '>';
+    }
+}
diff -pruN 1.10.0-3/src/PseudoTypes/OffsetAccess.php 1.12.0-1/src/PseudoTypes/OffsetAccess.php
--- 1.10.0-3/src/PseudoTypes/OffsetAccess.php	1970-01-01 00:00:00.000000000 +0000
+++ 1.12.0-1/src/PseudoTypes/OffsetAccess.php	2025-11-21 15:09:14.000000000 +0000
@@ -0,0 +1,67 @@
+<?php
+/*
+ * This file is part of phpDocumentor.
+ *
+ *  For the full copyright and license information, please view the LICENSE
+ *  file that was distributed with this source code.
+ *
+ *  @link      http://phpdoc.org
+ *
+ */
+
+declare(strict_types=1);
+
+namespace phpDocumentor\Reflection\PseudoTypes;
+
+use phpDocumentor\Reflection\PseudoType;
+use phpDocumentor\Reflection\Type;
+use phpDocumentor\Reflection\Types\Callable_;
+use phpDocumentor\Reflection\Types\Mixed_;
+use phpDocumentor\Reflection\Types\Nullable;
+
+/**
+ * Value Object representing the offset access type.
+ *
+ * @psalm-immutable
+ */
+final class OffsetAccess extends Mixed_ implements PseudoType
+{
+    /** @var Type */
+    private $type;
+    /** @var Type */
+    private $offset;
+
+    public function __construct(Type $type, Type $offset)
+    {
+        $this->type = $type;
+        $this->offset = $offset;
+    }
+
+    public function getType(): Type
+    {
+        return $this->type;
+    }
+
+    public function getOffset(): Type
+    {
+        return $this->offset;
+    }
+
+    public function underlyingType(): Type
+    {
+        return new Mixed_();
+    }
+
+    public function __toString(): string
+    {
+        if (
+            $this->type instanceof Callable_
+            || $this->type instanceof ConstExpression
+            || $this->type instanceof Nullable
+        ) {
+            return '(' . $this->type . ')[' . $this->offset . ']';
+        }
+
+        return $this->type . '[' . $this->offset . ']';
+    }
+}
diff -pruN 1.10.0-3/src/PseudoTypes/ShapeItem.php 1.12.0-1/src/PseudoTypes/ShapeItem.php
--- 1.10.0-3/src/PseudoTypes/ShapeItem.php	2024-11-09 15:12:26.000000000 +0000
+++ 1.12.0-1/src/PseudoTypes/ShapeItem.php	2025-11-21 15:09:14.000000000 +0000
@@ -42,7 +42,7 @@ abstract class ShapeItem
 
     public function __toString(): string
     {
-        if ($this->key !== null) {
+        if ($this->key !== null && $this->key !== '') {
             return sprintf(
                 '%s%s: %s',
                 $this->key,
diff -pruN 1.10.0-3/src/PseudoTypes/ValueOf.php 1.12.0-1/src/PseudoTypes/ValueOf.php
--- 1.10.0-3/src/PseudoTypes/ValueOf.php	1970-01-01 00:00:00.000000000 +0000
+++ 1.12.0-1/src/PseudoTypes/ValueOf.php	2025-11-21 15:09:14.000000000 +0000
@@ -0,0 +1,49 @@
+<?php
+/*
+ * This file is part of phpDocumentor.
+ *
+ *  For the full copyright and license information, please view the LICENSE
+ *  file that was distributed with this source code.
+ *
+ *  @link      http://phpdoc.org
+ *
+ */
+
+declare(strict_types=1);
+
+namespace phpDocumentor\Reflection\PseudoTypes;
+
+use phpDocumentor\Reflection\PseudoType;
+use phpDocumentor\Reflection\Type;
+use phpDocumentor\Reflection\Types\Mixed_;
+
+/**
+ * Value Object representing the `value-of` type.
+ *
+ * @psalm-immutable
+ */
+final class ValueOf extends Mixed_ implements PseudoType
+{
+    /** @var Type */
+    private $type;
+
+    public function __construct(Type $type)
+    {
+        $this->type = $type;
+    }
+
+    public function getType(): Type
+    {
+        return $this->type;
+    }
+
+    public function underlyingType(): Type
+    {
+        return new Mixed_();
+    }
+
+    public function __toString(): string
+    {
+        return 'value-of<' . $this->type . '>';
+    }
+}
diff -pruN 1.10.0-3/src/TypeResolver.php 1.12.0-1/src/TypeResolver.php
--- 1.10.0-3/src/TypeResolver.php	2024-11-09 15:12:26.000000000 +0000
+++ 1.12.0-1/src/TypeResolver.php	2025-11-21 15:09:14.000000000 +0000
@@ -18,12 +18,17 @@ use InvalidArgumentException;
 use phpDocumentor\Reflection\PseudoTypes\ArrayShape;
 use phpDocumentor\Reflection\PseudoTypes\ArrayShapeItem;
 use phpDocumentor\Reflection\PseudoTypes\CallableString;
+use phpDocumentor\Reflection\PseudoTypes\Conditional;
+use phpDocumentor\Reflection\PseudoTypes\ConditionalForParameter;
 use phpDocumentor\Reflection\PseudoTypes\ConstExpression;
 use phpDocumentor\Reflection\PseudoTypes\False_;
 use phpDocumentor\Reflection\PseudoTypes\FloatValue;
 use phpDocumentor\Reflection\PseudoTypes\HtmlEscapedString;
 use phpDocumentor\Reflection\PseudoTypes\IntegerRange;
 use phpDocumentor\Reflection\PseudoTypes\IntegerValue;
+use phpDocumentor\Reflection\PseudoTypes\IntMask;
+use phpDocumentor\Reflection\PseudoTypes\IntMaskOf;
+use phpDocumentor\Reflection\PseudoTypes\KeyOf;
 use phpDocumentor\Reflection\PseudoTypes\List_;
 use phpDocumentor\Reflection\PseudoTypes\ListShape;
 use phpDocumentor\Reflection\PseudoTypes\ListShapeItem;
@@ -38,10 +43,12 @@ use phpDocumentor\Reflection\PseudoTypes
 use phpDocumentor\Reflection\PseudoTypes\NumericString;
 use phpDocumentor\Reflection\PseudoTypes\ObjectShape;
 use phpDocumentor\Reflection\PseudoTypes\ObjectShapeItem;
+use phpDocumentor\Reflection\PseudoTypes\OffsetAccess;
 use phpDocumentor\Reflection\PseudoTypes\PositiveInteger;
 use phpDocumentor\Reflection\PseudoTypes\StringValue;
 use phpDocumentor\Reflection\PseudoTypes\TraitString;
 use phpDocumentor\Reflection\PseudoTypes\True_;
+use phpDocumentor\Reflection\PseudoTypes\ValueOf;
 use phpDocumentor\Reflection\Types\AggregatedType;
 use phpDocumentor\Reflection\Types\Array_;
 use phpDocumentor\Reflection\Types\ArrayKey;
@@ -112,6 +119,7 @@ use function in_array;
 use function sprintf;
 use function strpos;
 use function strtolower;
+use function substr;
 use function trim;
 
 final class TypeResolver
@@ -255,7 +263,7 @@ final class TypeResolver
                             ...array_map(
                                 function (ArrayShapeItemNode $item) use ($context): ArrayShapeItem {
                                     return new ArrayShapeItem(
-                                        (string) $item->keyName,
+                                        $item->keyName !== null ? (string) $item->keyName : null,
                                         $this->createType($item->valueType, $context),
                                         $item->optional
                                     );
@@ -350,8 +358,29 @@ final class TypeResolver
                 return new This();
 
             case ConditionalTypeNode::class:
+                return new Conditional(
+                    $type->negated,
+                    $this->createType($type->subjectType, $context),
+                    $this->createType($type->targetType, $context),
+                    $this->createType($type->if, $context),
+                    $this->createType($type->else, $context),
+                );
+
             case ConditionalTypeForParameterNode::class:
+                return new ConditionalForParameter(
+                    $type->negated,
+                    substr($type->parameterName, 1),
+                    $this->createType($type->targetType, $context),
+                    $this->createType($type->if, $context),
+                    $this->createType($type->else, $context),
+                );
+
             case OffsetAccessTypeNode::class:
+                return new OffsetAccess(
+                    $this->createType($type->type, $context),
+                    $this->createType($type->offset, $context)
+                );
+
             default:
                 return new Mixed_();
         }
@@ -405,16 +434,25 @@ final class TypeResolver
                 return new IntegerRange((string) $type->genericTypes[0], (string) $type->genericTypes[1]);
 
             case 'iterable':
-                return new Iterable_(
-                    ...array_reverse(
-                        array_map(
-                            function (TypeNode $genericType) use ($context): Type {
-                                return $this->createType($genericType, $context);
-                            },
-                            $type->genericTypes
-                        )
-                    )
-                );
+                return new Iterable_(...array_reverse($this->createTypesByTypeNodes($type->genericTypes, $context)));
+
+            case 'key-of':
+                return new KeyOf($this->createType($type->genericTypes[0], $context));
+
+            case 'value-of':
+                return new ValueOf($this->createType($type->genericTypes[0], $context));
+
+            case 'int-mask':
+                return new IntMask(...$this->createTypesByTypeNodes($type->genericTypes, $context));
+
+            case 'int-mask-of':
+                return new IntMaskOf($this->createType($type->genericTypes[0], $context));
+
+            case 'static':
+                return new Static_(...$this->createTypesByTypeNodes($type->genericTypes, $context));
+
+            case 'self':
+                return new Self_(...$this->createTypesByTypeNodes($type->genericTypes, $context));
 
             default:
                 $collectionType = $this->createType($type->type, $context);
@@ -424,14 +462,7 @@ final class TypeResolver
 
                 return new Collection(
                     $collectionType->getFqsen(),
-                    ...array_reverse(
-                        array_map(
-                            function (TypeNode $genericType) use ($context): Type {
-                                return $this->createType($genericType, $context);
-                            },
-                            $type->genericTypes
-                        )
-                    )
+                    ...array_reverse($this->createTypesByTypeNodes($type->genericTypes, $context))
                 );
         }
     }
@@ -597,14 +628,7 @@ final class TypeResolver
     /** @param TypeNode[] $typeNodes */
     private function createArray(array $typeNodes, Context $context): Array_
     {
-        $types = array_reverse(
-            array_map(
-                function (TypeNode $node) use ($context): Type {
-                    return $this->createType($node, $context);
-                },
-                $typeNodes
-            )
-        );
+        $types = array_reverse($this->createTypesByTypeNodes($typeNodes, $context));
 
         if (isset($types[1]) === false) {
             return new Array_(...$types);
@@ -679,4 +703,19 @@ final class TypeResolver
 
         return $type;
     }
+
+    /**
+     * @param TypeNode[] $nodes
+     *
+     * @return Type[]
+     */
+    private function createTypesByTypeNodes(array $nodes, Context $context): array
+    {
+        return array_map(
+            function (TypeNode $node) use ($context): Type {
+                return $this->createType($node, $context);
+            },
+            $nodes
+        );
+    }
 }
diff -pruN 1.10.0-3/src/Types/AbstractList.php 1.12.0-1/src/Types/AbstractList.php
--- 1.10.0-3/src/Types/AbstractList.php	2024-11-09 15:12:26.000000000 +0000
+++ 1.12.0-1/src/Types/AbstractList.php	2025-11-21 15:09:14.000000000 +0000
@@ -45,6 +45,11 @@ abstract class AbstractList implements T
         $this->keyType        = $keyType;
     }
 
+    public function getOriginalKeyType(): ?Type
+    {
+        return $this->keyType;
+    }
+
     /**
      * Returns the type for the keys of this array.
      */
diff -pruN 1.10.0-3/src/Types/ArrayKey.php 1.12.0-1/src/Types/ArrayKey.php
--- 1.10.0-3/src/Types/ArrayKey.php	2024-11-09 15:12:26.000000000 +0000
+++ 1.12.0-1/src/Types/ArrayKey.php	2025-11-21 15:09:14.000000000 +0000
@@ -23,7 +23,7 @@ use phpDocumentor\Reflection\Type;
  *
  * @psalm-immutable
  */
-final class ArrayKey extends AggregatedType implements PseudoType
+class ArrayKey extends AggregatedType implements PseudoType
 {
     public function __construct()
     {
diff -pruN 1.10.0-3/src/Types/Context.php 1.12.0-1/src/Types/Context.php
--- 1.10.0-3/src/Types/Context.php	2024-11-09 15:12:26.000000000 +0000
+++ 1.12.0-1/src/Types/Context.php	2025-11-21 15:09:14.000000000 +0000
@@ -28,7 +28,7 @@ use function trim;
  * own application it is possible to generate a Context class using the ContextFactory; this will analyze the file in
  * which an associated class resides for its namespace and imports.
  *
- * @see ContextFactory::createFromClassReflector()
+ * @see ContextFactory::createFromReflector()
  * @see ContextFactory::createForNamespace()
  *
  * @psalm-immutable
diff -pruN 1.10.0-3/src/Types/Mixed_.php 1.12.0-1/src/Types/Mixed_.php
--- 1.10.0-3/src/Types/Mixed_.php	2024-11-09 15:12:26.000000000 +0000
+++ 1.12.0-1/src/Types/Mixed_.php	2025-11-21 15:09:14.000000000 +0000
@@ -20,7 +20,7 @@ use phpDocumentor\Reflection\Type;
  *
  * @psalm-immutable
  */
-final class Mixed_ implements Type
+class Mixed_ implements Type
 {
     /**
      * Returns a rendered output of the Type as it would be used in a DocBlock.
diff -pruN 1.10.0-3/src/Types/Self_.php 1.12.0-1/src/Types/Self_.php
--- 1.10.0-3/src/Types/Self_.php	2024-11-09 15:12:26.000000000 +0000
+++ 1.12.0-1/src/Types/Self_.php	2025-11-21 15:09:14.000000000 +0000
@@ -15,6 +15,8 @@ namespace phpDocumentor\Reflection\Types
 
 use phpDocumentor\Reflection\Type;
 
+use function implode;
+
 /**
  * Value Object representing the 'self' type.
  *
@@ -24,11 +26,31 @@ use phpDocumentor\Reflection\Type;
  */
 final class Self_ implements Type
 {
+    /** @var Type[] */
+    private $genericTypes;
+
+    public function __construct(Type ...$genericTypes)
+    {
+        $this->genericTypes = $genericTypes;
+    }
+
+    /**
+     * @return Type[]
+     */
+    public function getGenericTypes(): array
+    {
+        return $this->genericTypes;
+    }
+
     /**
      * Returns a rendered output of the Type as it would be used in a DocBlock.
      */
     public function __toString(): string
     {
+        if ($this->genericTypes) {
+            return 'self<' . implode(', ', $this->genericTypes) . '>';
+        }
+
         return 'self';
     }
 }
diff -pruN 1.10.0-3/src/Types/Static_.php 1.12.0-1/src/Types/Static_.php
--- 1.10.0-3/src/Types/Static_.php	2024-11-09 15:12:26.000000000 +0000
+++ 1.12.0-1/src/Types/Static_.php	2025-11-21 15:09:14.000000000 +0000
@@ -15,6 +15,8 @@ namespace phpDocumentor\Reflection\Types
 
 use phpDocumentor\Reflection\Type;
 
+use function implode;
+
 /**
  * Value Object representing the 'static' type.
  *
@@ -29,11 +31,31 @@ use phpDocumentor\Reflection\Type;
  */
 final class Static_ implements Type
 {
+    /** @var Type[] */
+    private $genericTypes;
+
+    public function __construct(Type ...$genericTypes)
+    {
+        $this->genericTypes = $genericTypes;
+    }
+
+    /**
+     * @return Type[]
+     */
+    public function getGenericTypes(): array
+    {
+        return $this->genericTypes;
+    }
+
     /**
      * Returns a rendered output of the Type as it would be used in a DocBlock.
      */
     public function __toString(): string
     {
+        if ($this->genericTypes) {
+            return 'static<' . implode(', ', $this->genericTypes) . '>';
+        }
+
         return 'static';
     }
 }
diff -pruN 1.10.0-3/tests/unit/PseudoTypes/ArrayShapeTest.php 1.12.0-1/tests/unit/PseudoTypes/ArrayShapeTest.php
--- 1.10.0-3/tests/unit/PseudoTypes/ArrayShapeTest.php	2024-11-09 15:12:26.000000000 +0000
+++ 1.12.0-1/tests/unit/PseudoTypes/ArrayShapeTest.php	2025-11-21 15:09:14.000000000 +0000
@@ -23,4 +23,43 @@ class ArrayShapeTest extends TestCase
 
         $this->assertSame([$item1, $item2], $arrayShape->getItems());
     }
+
+    /**
+     * @dataProvider provideToStringData
+     * @covers ::__toString
+     */
+    public function testToString(string $expectedResult, ArrayShape $arrayShape): void
+    {
+        $this->assertSame($expectedResult, (string) $arrayShape);
+    }
+
+    /**
+     * @return array<string, array{string, ArrayShape}>
+     */
+    public static function provideToStringData(): array
+    {
+        return [
+            'with keys' => [
+                'array{foo: true, bar?: false}',
+                new ArrayShape(
+                    new ArrayShapeItem('foo', new True_(), false),
+                    new ArrayShapeItem('bar', new False_(), true)
+                ),
+            ],
+            'with empty keys' => [
+                'array{true, false}',
+                new ArrayShape(
+                    new ArrayShapeItem('', new True_(), false),
+                    new ArrayShapeItem('', new False_(), false)
+                ),
+            ],
+            'without keys' => [
+                'array{true, false}',
+                new ArrayShape(
+                    new ArrayShapeItem(null, new True_(), false),
+                    new ArrayShapeItem(null, new False_(), false)
+                ),
+            ],
+        ];
+    }
 }
diff -pruN 1.10.0-3/tests/unit/PseudoTypes/ConditionalForParameterTest.php 1.12.0-1/tests/unit/PseudoTypes/ConditionalForParameterTest.php
--- 1.10.0-3/tests/unit/PseudoTypes/ConditionalForParameterTest.php	1970-01-01 00:00:00.000000000 +0000
+++ 1.12.0-1/tests/unit/PseudoTypes/ConditionalForParameterTest.php	2025-11-21 15:09:14.000000000 +0000
@@ -0,0 +1,76 @@
+<?php
+
+declare(strict_types=1);
+
+namespace phpDocumentor\Reflection\PseudoTypes;
+
+use phpDocumentor\Reflection\Types\Array_;
+use phpDocumentor\Reflection\Types\Integer;
+use phpDocumentor\Reflection\Types\Static_;
+use PHPUnit\Framework\TestCase;
+
+/**
+ * @coversDefaultClass \phpDocumentor\Reflection\PseudoTypes\ConditionalForParameter
+ */
+class ConditionalForParameterTest extends TestCase
+{
+    /**
+     * @covers ::isNegated
+     * @covers ::getParameterName
+     * @covers ::getTargetType
+     * @covers ::getIf
+     * @covers ::getElse
+     */
+    public function testCreate(): void
+    {
+        $parameterName = 'some';
+        $targetType = new Integer();
+        $if = new Static_();
+        $else = new Array_(new Static_());
+        $type = new ConditionalForParameter(false, $parameterName, $targetType, $if, $else);
+
+        $this->assertFalse($type->isNegated());
+        $this->assertSame($parameterName, $type->getParameterName());
+        $this->assertSame($targetType, $type->getTargetType());
+        $this->assertSame($if, $type->getIf());
+        $this->assertSame($else, $type->getElse());
+    }
+
+    /**
+     * @dataProvider provideToStringData
+     * @covers ::__toString
+     */
+    public function testToString(string $expectedResult, ConditionalForParameter $type): void
+    {
+        $this->assertSame($expectedResult, (string) $type);
+    }
+
+    /**
+     * @return array<string, array{string, ConditionalForParameter}>
+     */
+    public static function provideToStringData(): array
+    {
+        return [
+            'basic' => [
+                '($test is int ? static : static[])',
+                new ConditionalForParameter(
+                    false,
+                    'test',
+                    new Integer(),
+                    new Static_(),
+                    new Array_(new Static_())
+                ),
+            ],
+            'negated' => [
+                '($test2 is not int ? static : static[])',
+                new ConditionalForParameter(
+                    true,
+                    'test2',
+                    new Integer(),
+                    new Static_(),
+                    new Array_(new Static_())
+                ),
+            ],
+        ];
+    }
+}
diff -pruN 1.10.0-3/tests/unit/PseudoTypes/ConditionalTest.php 1.12.0-1/tests/unit/PseudoTypes/ConditionalTest.php
--- 1.10.0-3/tests/unit/PseudoTypes/ConditionalTest.php	1970-01-01 00:00:00.000000000 +0000
+++ 1.12.0-1/tests/unit/PseudoTypes/ConditionalTest.php	2025-11-21 15:09:14.000000000 +0000
@@ -0,0 +1,78 @@
+<?php
+
+declare(strict_types=1);
+
+namespace phpDocumentor\Reflection\PseudoTypes;
+
+use phpDocumentor\Reflection\Fqsen;
+use phpDocumentor\Reflection\Types\Array_;
+use phpDocumentor\Reflection\Types\Integer;
+use phpDocumentor\Reflection\Types\Object_;
+use phpDocumentor\Reflection\Types\Static_;
+use PHPUnit\Framework\TestCase;
+
+/**
+ * @coversDefaultClass \phpDocumentor\Reflection\PseudoTypes\Conditional
+ */
+class ConditionalTest extends TestCase
+{
+    /**
+     * @covers ::isNegated
+     * @covers ::getSubjectType
+     * @covers ::getTargetType
+     * @covers ::getIf
+     * @covers ::getElse
+     */
+    public function testCreate(): void
+    {
+        $subjectType = new Object_(new Fqsen('\\phpDocumentor\\T'));
+        $targetType = new Integer();
+        $if = new Static_();
+        $else = new Array_(new Static_());
+        $type = new Conditional(false, $subjectType, $targetType, $if, $else);
+
+        $this->assertFalse($type->isNegated());
+        $this->assertSame($subjectType, $type->getSubjectType());
+        $this->assertSame($targetType, $type->getTargetType());
+        $this->assertSame($if, $type->getIf());
+        $this->assertSame($else, $type->getElse());
+    }
+
+    /**
+     * @dataProvider provideToStringData
+     * @covers ::__toString
+     */
+    public function testToString(string $expectedResult, Conditional $type): void
+    {
+        $this->assertSame($expectedResult, (string) $type);
+    }
+
+    /**
+     * @return array<string, array{string, Conditional}>
+     */
+    public static function provideToStringData(): array
+    {
+        return [
+            'basic' => [
+                '(\\phpDocumentor\\T is int ? static : static[])',
+                new Conditional(
+                    false,
+                    new Object_(new Fqsen('\\phpDocumentor\\T')),
+                    new Integer(),
+                    new Static_(),
+                    new Array_(new Static_())
+                ),
+            ],
+            'negated' => [
+                '(\\phpDocumentor\\T is not int ? static : static[])',
+                new Conditional(
+                    true,
+                    new Object_(new Fqsen('\\phpDocumentor\\T')),
+                    new Integer(),
+                    new Static_(),
+                    new Array_(new Static_())
+                ),
+            ],
+        ];
+    }
+}
diff -pruN 1.10.0-3/tests/unit/PseudoTypes/IntMaskOfTest.php 1.12.0-1/tests/unit/PseudoTypes/IntMaskOfTest.php
--- 1.10.0-3/tests/unit/PseudoTypes/IntMaskOfTest.php	1970-01-01 00:00:00.000000000 +0000
+++ 1.12.0-1/tests/unit/PseudoTypes/IntMaskOfTest.php	2025-11-21 15:09:14.000000000 +0000
@@ -0,0 +1,35 @@
+<?php
+
+declare(strict_types=1);
+
+namespace phpDocumentor\Reflection\PseudoTypes;
+
+use phpDocumentor\Reflection\Types\Compound;
+use PHPUnit\Framework\TestCase;
+
+/**
+ * @coversDefaultClass \phpDocumentor\Reflection\PseudoTypes\IntMaskOf
+ */
+class IntMaskOfTest extends TestCase
+{
+    /**
+     * @covers ::getType
+     */
+    public function testCreate(): void
+    {
+        $childType = new Compound([new IntegerValue(1), new IntegerValue(5), new IntegerValue(10)]);
+        $type = new IntMaskOf($childType);
+
+        $this->assertSame($childType, $type->getType());
+    }
+
+    /**
+     * @covers ::__toString
+     */
+    public function testToString(): void
+    {
+        $type = new IntMask(new Compound([new IntegerValue(1), new IntegerValue(5), new IntegerValue(10)]));
+
+        $this->assertSame('int-mask<1|5|10>', (string) $type);
+    }
+}
diff -pruN 1.10.0-3/tests/unit/PseudoTypes/IntMaskTest.php 1.12.0-1/tests/unit/PseudoTypes/IntMaskTest.php
--- 1.10.0-3/tests/unit/PseudoTypes/IntMaskTest.php	1970-01-01 00:00:00.000000000 +0000
+++ 1.12.0-1/tests/unit/PseudoTypes/IntMaskTest.php	2025-11-21 15:09:14.000000000 +0000
@@ -0,0 +1,33 @@
+<?php
+
+declare(strict_types=1);
+
+namespace phpDocumentor\Reflection\PseudoTypes;
+
+use PHPUnit\Framework\TestCase;
+
+/**
+ * @coversDefaultClass \phpDocumentor\Reflection\PseudoTypes\IntMask
+ */
+class IntMaskTest extends TestCase
+{
+    /**
+     * @covers ::getTypes
+     */
+    public function testCreate(): void
+    {
+        $childTypes = [new IntegerValue(1), new IntegerValue(5), new IntegerValue(10)];
+        $type = new IntMask(...$childTypes);
+
+        $this->assertSame($childTypes, $type->getTypes());
+    }
+
+    /**
+     * @covers ::__toString
+     */
+    public function testToString(): void
+    {
+        $type = new IntMask(new IntegerValue(1), new IntegerValue(510), new IntegerValue(6000));
+        $this->assertSame('int-mask<1, 510, 6000>', (string) $type);
+    }
+}
diff -pruN 1.10.0-3/tests/unit/PseudoTypes/KeyOfTest.php 1.12.0-1/tests/unit/PseudoTypes/KeyOfTest.php
--- 1.10.0-3/tests/unit/PseudoTypes/KeyOfTest.php	1970-01-01 00:00:00.000000000 +0000
+++ 1.12.0-1/tests/unit/PseudoTypes/KeyOfTest.php	2025-11-21 15:09:14.000000000 +0000
@@ -0,0 +1,36 @@
+<?php
+
+declare(strict_types=1);
+
+namespace phpDocumentor\Reflection\PseudoTypes;
+
+use phpDocumentor\Reflection\Fqsen;
+use phpDocumentor\Reflection\Types\Object_;
+use PHPUnit\Framework\TestCase;
+
+/**
+ * @coversDefaultClass \phpDocumentor\Reflection\PseudoTypes\KeyOf
+ */
+class KeyOfTest extends TestCase
+{
+    /**
+     * @covers ::getType
+     */
+    public function testCreate(): void
+    {
+        $childType = new ConstExpression(new Object_(new Fqsen('\\phpDocumentor\\Type')), 'ARRAY_CONST');
+        $type = new KeyOf($childType);
+
+        $this->assertSame($childType, $type->getType());
+    }
+
+    /**
+     * @covers ::__toString
+     */
+    public function testToString(): void
+    {
+        $type = new KeyOf(new ConstExpression(new Object_(new Fqsen('\\phpDocumentor\\Type')), 'ARRAY_CONST'));
+
+        $this->assertSame('key-of<\\phpDocumentor\\Type::ARRAY_CONST>', (string) $type);
+    }
+}
diff -pruN 1.10.0-3/tests/unit/PseudoTypes/OffsetAccessTest.php 1.12.0-1/tests/unit/PseudoTypes/OffsetAccessTest.php
--- 1.10.0-3/tests/unit/PseudoTypes/OffsetAccessTest.php	1970-01-01 00:00:00.000000000 +0000
+++ 1.12.0-1/tests/unit/PseudoTypes/OffsetAccessTest.php	2025-11-21 15:09:14.000000000 +0000
@@ -0,0 +1,58 @@
+<?php
+
+declare(strict_types=1);
+
+namespace phpDocumentor\Reflection\PseudoTypes;
+
+use phpDocumentor\Reflection\Fqsen;
+use phpDocumentor\Reflection\Types\Object_;
+use PHPUnit\Framework\TestCase;
+
+/**
+ * @coversDefaultClass \phpDocumentor\Reflection\PseudoTypes\OffsetAccess
+ */
+class OffsetAccessTest extends TestCase
+{
+    /**
+     * @covers ::getType
+     * @covers ::getOffset
+     */
+    public function testCreate(): void
+    {
+        $mainType = new Object_(new Fqsen('\\phpDocumentor\\MyArray'));
+        $offset = new StringValue('bar');
+        $type = new OffsetAccess($mainType, $offset);
+
+        $this->assertSame($mainType, $type->getType());
+        $this->assertSame($offset, $type->getOffset());
+    }
+
+    /**
+     * @dataProvider provideToStringData
+     * @covers ::__toString
+     */
+    public function testToString(string $expectedResult, OffsetAccess $type): void
+    {
+        $this->assertSame($expectedResult, (string) $type);
+    }
+
+    /**
+     * @return array<string, array{string, OffsetAccess}>
+     */
+    public static function provideToStringData(): array
+    {
+        return [
+            'basic' => [
+                '\\phpDocumentor\\MyArray["bar"]',
+                new OffsetAccess(new Object_(new Fqsen('\\phpDocumentor\\MyArray')), new StringValue('bar')),
+            ],
+            'with const expression' => [
+                '(\\phpDocumentor\\Foo::SOME_ARRAY)["bar"]',
+                new OffsetAccess(
+                    new ConstExpression(new Object_(new Fqsen('\\phpDocumentor\\Foo')), 'SOME_ARRAY'),
+                    new StringValue('bar')
+                ),
+            ],
+        ];
+    }
+}
diff -pruN 1.10.0-3/tests/unit/PseudoTypes/ValueOfTest.php 1.12.0-1/tests/unit/PseudoTypes/ValueOfTest.php
--- 1.10.0-3/tests/unit/PseudoTypes/ValueOfTest.php	1970-01-01 00:00:00.000000000 +0000
+++ 1.12.0-1/tests/unit/PseudoTypes/ValueOfTest.php	2025-11-21 15:09:14.000000000 +0000
@@ -0,0 +1,36 @@
+<?php
+
+declare(strict_types=1);
+
+namespace phpDocumentor\Reflection\PseudoTypes;
+
+use phpDocumentor\Reflection\Fqsen;
+use phpDocumentor\Reflection\Types\Object_;
+use PHPUnit\Framework\TestCase;
+
+/**
+ * @coversDefaultClass \phpDocumentor\Reflection\PseudoTypes\ValueOf
+ */
+class ValueOfTest extends TestCase
+{
+    /**
+     * @covers ::getType
+     */
+    public function testCreate(): void
+    {
+        $childType = new ConstExpression(new Object_(new Fqsen('\\phpDocumentor\\Type')), 'ARRAY_CONST');
+        $type = new ValueOf($childType);
+
+        $this->assertSame($childType, $type->getType());
+    }
+
+    /**
+     * @covers ::__toString
+     */
+    public function testToString(): void
+    {
+        $type = new ValueOf(new ConstExpression(new Object_(new Fqsen('\\phpDocumentor\\Type')), 'ARRAY_CONST'));
+
+        $this->assertSame('value-of<\\phpDocumentor\\Type::ARRAY_CONST>', (string) $type);
+    }
+}
diff -pruN 1.10.0-3/tests/unit/TypeResolverTest.php 1.12.0-1/tests/unit/TypeResolverTest.php
--- 1.10.0-3/tests/unit/TypeResolverTest.php	2024-11-09 15:12:26.000000000 +0000
+++ 1.12.0-1/tests/unit/TypeResolverTest.php	2025-11-21 15:09:14.000000000 +0000
@@ -18,12 +18,17 @@ use InvalidArgumentException;
 use phpDocumentor\Reflection\PseudoTypes\ArrayShape;
 use phpDocumentor\Reflection\PseudoTypes\ArrayShapeItem;
 use phpDocumentor\Reflection\PseudoTypes\CallableString;
+use phpDocumentor\Reflection\PseudoTypes\Conditional;
+use phpDocumentor\Reflection\PseudoTypes\ConditionalForParameter;
 use phpDocumentor\Reflection\PseudoTypes\ConstExpression;
 use phpDocumentor\Reflection\PseudoTypes\False_;
 use phpDocumentor\Reflection\PseudoTypes\FloatValue;
 use phpDocumentor\Reflection\PseudoTypes\HtmlEscapedString;
 use phpDocumentor\Reflection\PseudoTypes\IntegerRange;
 use phpDocumentor\Reflection\PseudoTypes\IntegerValue;
+use phpDocumentor\Reflection\PseudoTypes\IntMask;
+use phpDocumentor\Reflection\PseudoTypes\IntMaskOf;
+use phpDocumentor\Reflection\PseudoTypes\KeyOf;
 use phpDocumentor\Reflection\PseudoTypes\List_;
 use phpDocumentor\Reflection\PseudoTypes\ListShape;
 use phpDocumentor\Reflection\PseudoTypes\ListShapeItem;
@@ -38,10 +43,12 @@ use phpDocumentor\Reflection\PseudoTypes
 use phpDocumentor\Reflection\PseudoTypes\NumericString;
 use phpDocumentor\Reflection\PseudoTypes\ObjectShape;
 use phpDocumentor\Reflection\PseudoTypes\ObjectShapeItem;
+use phpDocumentor\Reflection\PseudoTypes\OffsetAccess;
 use phpDocumentor\Reflection\PseudoTypes\PositiveInteger;
 use phpDocumentor\Reflection\PseudoTypes\StringValue;
 use phpDocumentor\Reflection\PseudoTypes\TraitString;
 use phpDocumentor\Reflection\PseudoTypes\True_;
+use phpDocumentor\Reflection\PseudoTypes\ValueOf;
 use phpDocumentor\Reflection\Types\Array_;
 use phpDocumentor\Reflection\Types\ArrayKey;
 use phpDocumentor\Reflection\Types\Boolean;
@@ -958,6 +965,24 @@ class TypeResolverTest extends TestCase
                 ),
             ],
             [
+                '(A&B)|C|(D&E)',
+                new Compound([
+                    new Expression(
+                        new Intersection([
+                            new Object_(new Fqsen('\\phpDocumentor\\A')),
+                            new Object_(new Fqsen('\\phpDocumentor\\B')),
+                        ]),
+                    ),
+                    new Object_(new Fqsen('\\phpDocumentor\\C')),
+                    new Expression(
+                        new Intersection([
+                            new Object_(new Fqsen('\\phpDocumentor\\D')),
+                            new Object_(new Fqsen('\\phpDocumentor\\E')),
+                        ]),
+                    ),
+                ]),
+            ],
+            [
                 'string[]',
                 new Array_(
                     new String_()
@@ -974,9 +999,60 @@ class TypeResolverTest extends TestCase
                 ),
             ],
             [
+                'static',
+                new Static_(),
+            ],
+            [
                 'self',
                 new Self_(),
             ],
+            [
+                '($size is positive-int ? non-empty-array : array)',
+                new ConditionalForParameter(
+                    false,
+                    'size',
+                    new PositiveInteger(),
+                    new NonEmptyArray(),
+                    new Array_()
+                ),
+            ],
+            [
+                '($size is not positive-int ? non-empty-array : int)',
+                new ConditionalForParameter(
+                    true,
+                    'size',
+                    new PositiveInteger(),
+                    new NonEmptyArray(),
+                    new Integer()
+                ),
+            ],
+            [
+                '(T is int ? static : array<static>)',
+                new Conditional(
+                    false,
+                    new Object_(new Fqsen('\\phpDocumentor\\T')),
+                    new Integer(),
+                    new Static_(),
+                    new Array_(new Static_())
+                ),
+            ],
+            [
+                '(T is not int ? self : array<static>)',
+                new Conditional(
+                    true,
+                    new Object_(new Fqsen('\\phpDocumentor\\T')),
+                    new Integer(),
+                    new Self_(),
+                    new Array_(new Static_())
+                ),
+            ],
+            [
+                "MyArray['bar']",
+                new OffsetAccess(
+                    new Object_(new Fqsen('\\phpDocumentor\\MyArray')),
+                    new StringValue('bar')
+                ),
+            ],
         ];
     }
 
@@ -1035,6 +1111,46 @@ class TypeResolverTest extends TestCase
                 'int<1, 100>',
                 new IntegerRange('1', '100'),
             ],
+            [
+                'key-of<Type::ARRAY_CONST>',
+                new KeyOf(new ConstExpression(new Object_(new Fqsen('\\phpDocumentor\\Type')), 'ARRAY_CONST')),
+            ],
+            [
+                'value-of<Type::ARRAY_CONST>',
+                new ValueOf(new ConstExpression(new Object_(new Fqsen('\\phpDocumentor\\Type')), 'ARRAY_CONST')),
+            ],
+            [
+                'int-mask<1, 2, 4>',
+                new IntMask(new IntegerValue(1), new IntegerValue(2), new IntegerValue(4)),
+            ],
+            [
+                'int-mask-of<1|2|4>',
+                new IntMaskOf(new Compound([new IntegerValue(1), new IntegerValue(2), new IntegerValue(4)])),
+            ],
+            [
+                'int-mask-of<Foo::INT_*>',
+                new IntMaskOf(new ConstExpression(new Object_(new Fqsen('\\phpDocumentor\\Foo')), 'INT_*')),
+            ],
+            [
+                'iterable<int, string>',
+                new Iterable_(new String_(), new Integer()),
+            ],
+            [
+                'static<FirstClass, SecondClass, ThirdClass>',
+                new Static_(
+                    new Object_(new Fqsen('\\phpDocumentor\\FirstClass')),
+                    new Object_(new Fqsen('\\phpDocumentor\\SecondClass')),
+                    new Object_(new Fqsen('\\phpDocumentor\\ThirdClass')),
+                ),
+            ],
+            [
+                'self<FirstClass, SecondClass, ThirdClass>',
+                new Self_(
+                    new Object_(new Fqsen('\\phpDocumentor\\FirstClass')),
+                    new Object_(new Fqsen('\\phpDocumentor\\SecondClass')),
+                    new Object_(new Fqsen('\\phpDocumentor\\ThirdClass')),
+                ),
+            ],
         ];
     }
 
@@ -1151,6 +1267,13 @@ class TypeResolverTest extends TestCase
                 ),
             ],
             [
+                'array{string, int}',
+                new ArrayShape(
+                    new ArrayShapeItem(null, new String_(), false),
+                    new ArrayShapeItem(null, new Integer(), false)
+                ),
+            ],
+            [
                 'array{foo?: string, bar: int}',
                 new ArrayShape(
                     new ArrayShapeItem('foo', new String_(), true),
diff -pruN 1.10.0-3/tests/unit/Types/SelfTest.php 1.12.0-1/tests/unit/Types/SelfTest.php
--- 1.10.0-3/tests/unit/Types/SelfTest.php	1970-01-01 00:00:00.000000000 +0000
+++ 1.12.0-1/tests/unit/Types/SelfTest.php	2025-11-21 15:09:14.000000000 +0000
@@ -0,0 +1,60 @@
+<?php
+
+declare(strict_types=1);
+
+namespace phpDocumentor\Reflection\Types;
+
+use phpDocumentor\Reflection\Fqsen;
+use PHPUnit\Framework\TestCase;
+
+/**
+ * @coversDefaultClass \phpDocumentor\Reflection\Types\Self_
+ */
+class SelfTest extends TestCase
+{
+    /**
+     * @covers ::getGenericTypes
+     */
+    public function testCreate(): void
+    {
+        $genericTypes = [
+            new Object_(new Fqsen('\\phpDocumentor\\FirstClass')),
+            new Object_(new Fqsen('\\phpDocumentor\\SecondClass')),
+            new Object_(new Fqsen('\\phpDocumentor\\ThirdClass')),
+        ];
+
+        $type = new Self_(...$genericTypes);
+
+        $this->assertSame($genericTypes, $type->getGenericTypes());
+    }
+
+    /**
+     * @dataProvider provideToStringData
+     * @covers ::__toString
+     */
+    public function testToString(string $expectedResult, Self_ $type): void
+    {
+        $this->assertSame($expectedResult, (string) $type);
+    }
+
+    /**
+     * @return array<string, array{string, Self_}>
+     */
+    public static function provideToStringData(): array
+    {
+        return [
+            'basic' => [
+                'self',
+                new Self_(),
+            ],
+            'with generic' => [
+                'self<\\phpDocumentor\\FirstClass, \\phpDocumentor\\SecondClass, \\phpDocumentor\\ThirdClass>',
+                new Self_(
+                    new Object_(new Fqsen('\\phpDocumentor\\FirstClass')),
+                    new Object_(new Fqsen('\\phpDocumentor\\SecondClass')),
+                    new Object_(new Fqsen('\\phpDocumentor\\ThirdClass')),
+                ),
+            ],
+        ];
+    }
+}
diff -pruN 1.10.0-3/tests/unit/Types/StaticTest.php 1.12.0-1/tests/unit/Types/StaticTest.php
--- 1.10.0-3/tests/unit/Types/StaticTest.php	1970-01-01 00:00:00.000000000 +0000
+++ 1.12.0-1/tests/unit/Types/StaticTest.php	2025-11-21 15:09:14.000000000 +0000
@@ -0,0 +1,60 @@
+<?php
+
+declare(strict_types=1);
+
+namespace phpDocumentor\Reflection\Types;
+
+use phpDocumentor\Reflection\Fqsen;
+use PHPUnit\Framework\TestCase;
+
+/**
+ * @coversDefaultClass \phpDocumentor\Reflection\Types\Static_
+ */
+class StaticTest extends TestCase
+{
+    /**
+     * @covers ::getGenericTypes
+     */
+    public function testCreate(): void
+    {
+        $genericTypes = [
+            new Object_(new Fqsen('\\phpDocumentor\\FirstClass')),
+            new Object_(new Fqsen('\\phpDocumentor\\SecondClass')),
+            new Object_(new Fqsen('\\phpDocumentor\\ThirdClass')),
+        ];
+
+        $type = new Static_(...$genericTypes);
+
+        $this->assertSame($genericTypes, $type->getGenericTypes());
+    }
+
+    /**
+     * @dataProvider provideToStringData
+     * @covers ::__toString
+     */
+    public function testToString(string $expectedResult, Static_ $type): void
+    {
+        $this->assertSame($expectedResult, (string) $type);
+    }
+
+    /**
+     * @return array<string, array{string, Static_}>
+     */
+    public static function provideToStringData(): array
+    {
+        return [
+            'basic' => [
+                'static',
+                new Static_(),
+            ],
+            'with generic' => [
+                'static<\\phpDocumentor\\FirstClass, \\phpDocumentor\\SecondClass, \\phpDocumentor\\ThirdClass>',
+                new Static_(
+                    new Object_(new Fqsen('\\phpDocumentor\\FirstClass')),
+                    new Object_(new Fqsen('\\phpDocumentor\\SecondClass')),
+                    new Object_(new Fqsen('\\phpDocumentor\\ThirdClass')),
+                ),
+            ],
+        ];
+    }
+}
