diff -pruN 2.2.0-2/.github/workflows/apiref.yml 2.3.0-1/.github/workflows/apiref.yml
--- 2.2.0-2/.github/workflows/apiref.yml	2025-07-13 07:04:09.000000000 +0000
+++ 2.3.0-1/.github/workflows/apiref.yml	2025-08-30 15:50:23.000000000 +0000
@@ -5,7 +5,7 @@ name: "Deploy API Reference"
 on:
   push:
     branches:
-      - "2.2.x"
+      - "2.3.x"
 
 concurrency:
   group: "pages"
@@ -23,6 +23,7 @@ jobs:
           - "2.0.x"
           - "2.1.x"
           - "2.2.x"
+          - "2.3.x"
 
     steps:
       - name: "Checkout"
diff -pruN 2.2.0-2/.github/workflows/backward-compatibility.yml 2.3.0-1/.github/workflows/backward-compatibility.yml
--- 2.2.0-2/.github/workflows/backward-compatibility.yml	2025-07-13 07:04:09.000000000 +0000
+++ 2.3.0-1/.github/workflows/backward-compatibility.yml	2025-08-30 15:50:23.000000000 +0000
@@ -6,7 +6,7 @@ on:
   pull_request:
   push:
     branches:
-      - "2.2.x"
+      - "2.3.x"
 
 jobs:
   backward-compatibility:
diff -pruN 2.2.0-2/.github/workflows/build.yml 2.3.0-1/.github/workflows/build.yml
--- 2.2.0-2/.github/workflows/build.yml	2025-07-13 07:04:09.000000000 +0000
+++ 2.3.0-1/.github/workflows/build.yml	2025-08-30 15:50:23.000000000 +0000
@@ -6,7 +6,7 @@ on:
   pull_request:
   push:
     branches:
-      - "2.2.x"
+      - "2.3.x"
 
 jobs:
   lint:
diff -pruN 2.2.0-2/.github/workflows/test-slevomat-coding-standard.yml 2.3.0-1/.github/workflows/test-slevomat-coding-standard.yml
--- 2.2.0-2/.github/workflows/test-slevomat-coding-standard.yml	2025-07-13 07:04:09.000000000 +0000
+++ 2.3.0-1/.github/workflows/test-slevomat-coding-standard.yml	2025-08-30 15:50:23.000000000 +0000
@@ -6,7 +6,7 @@ on:
   pull_request:
   push:
     branches:
-      - "2.2.x"
+      - "2.3.x"
 
 jobs:
   tests:
diff -pruN 2.2.0-2/README.md 2.3.0-1/README.md
--- 2.2.0-2/README.md	2025-07-13 07:04:09.000000000 +0000
+++ 2.3.0-1/README.md	2025-08-30 15:50:23.000000000 +0000
@@ -13,7 +13,7 @@ For the complete list of supported PHPDo
 
 * [PHPDoc Basics](https://phpstan.org/writing-php-code/phpdocs-basics) (list of PHPDoc tags)
 * [PHPDoc Types](https://phpstan.org/writing-php-code/phpdoc-types) (list of PHPDoc types)
-* [phpdoc-parser API Reference](https://phpstan.github.io/phpdoc-parser/2.2.x/namespace-PHPStan.PhpDocParser.html) with all the AST node types etc.
+* [phpdoc-parser API Reference](https://phpstan.github.io/phpdoc-parser/2.3.x/namespace-PHPStan.PhpDocParser.html) with all the AST node types etc.
 
 This parser also supports parsing [Doctrine Annotations](https://github.com/doctrine/annotations). The AST nodes live in the [PHPStan\PhpDocParser\Ast\PhpDoc\Doctrine namespace](https://phpstan.github.io/phpdoc-parser/2.1.x/namespace-PHPStan.PhpDocParser.Ast.PhpDoc.Doctrine.html).
 
diff -pruN 2.2.0-2/debian/changelog 2.3.0-1/debian/changelog
--- 2.2.0-2/debian/changelog	2025-08-27 06:37:47.000000000 +0000
+++ 2.3.0-1/debian/changelog	2025-08-31 07:41:14.000000000 +0000
@@ -1,3 +1,10 @@
+php-phpstan-phpdoc-parser (2.3.0-1) unstable; urgency=medium
+
+  [ Vincent Langlet ]
+  * Support constant fetch in array key
+
+ -- David Prévot <taffit@debian.org>  Sun, 31 Aug 2025 09:41:14 +0200
+
 php-phpstan-phpdoc-parser (2.2.0-2) unstable; urgency=medium
 
   * Upload to unstable now that Trixie has been released
diff -pruN 2.2.0-2/debian/patches/0002-Adapt-to-recent-version-of-PHPUnit-10.patch 2.3.0-1/debian/patches/0002-Adapt-to-recent-version-of-PHPUnit-10.patch
--- 2.2.0-2/debian/patches/0002-Adapt-to-recent-version-of-PHPUnit-10.patch	2025-08-27 06:36:15.000000000 +0000
+++ 2.3.0-1/debian/patches/0002-Adapt-to-recent-version-of-PHPUnit-10.patch	2025-08-31 07:38:23.000000000 +0000
@@ -481,7 +481,7 @@ index b2857b2..1ec1dc6 100644
  		yield [
  			'/** @return Foo */',
 diff --git a/tests/PHPStan/Parser/TypeParserTest.php b/tests/PHPStan/Parser/TypeParserTest.php
-index 8fe96f5..cae31c1 100644
+index 01a511b..cfaaa16 100644
 --- a/tests/PHPStan/Parser/TypeParserTest.php
 +++ b/tests/PHPStan/Parser/TypeParserTest.php
 @@ -223,7 +223,7 @@ class TypeParserTest extends TestCase
@@ -493,7 +493,7 @@ index 8fe96f5..cae31c1 100644
  	{
  		return [
  			[
-@@ -3047,7 +3047,7 @@ class TypeParserTest extends TestCase
+@@ -3057,7 +3057,7 @@ class TypeParserTest extends TestCase
  	/**
  	 * @return array<mixed>
  	 */
diff -pruN 2.2.0-2/debian/patches/0005-Compatibility-with-recent-PHPUnit-12.patch 2.3.0-1/debian/patches/0005-Compatibility-with-recent-PHPUnit-12.patch
--- 2.2.0-2/debian/patches/0005-Compatibility-with-recent-PHPUnit-12.patch	2025-08-27 06:36:15.000000000 +0000
+++ 2.3.0-1/debian/patches/0005-Compatibility-with-recent-PHPUnit-12.patch	2025-08-31 07:38:23.000000000 +0000
@@ -118,10 +118,10 @@ index 47a25db..054e246 100644
  	{
  		$printer = new Printer();
 diff --git a/tests/PHPStan/Ast/ToString/TypeToStringTest.php b/tests/PHPStan/Ast/ToString/TypeToStringTest.php
-index 6716e43..eb0bd88 100644
+index 254cff5..78721d1 100644
 --- a/tests/PHPStan/Ast/ToString/TypeToStringTest.php
 +++ b/tests/PHPStan/Ast/ToString/TypeToStringTest.php
-@@ -22,6 +22,7 @@ use PHPStan\PhpDocParser\Ast\Type\NullableTypeNode;
+@@ -23,6 +23,7 @@ use PHPStan\PhpDocParser\Ast\Type\NullableTypeNode;
  use PHPStan\PhpDocParser\Ast\Type\OffsetAccessTypeNode;
  use PHPStan\PhpDocParser\Ast\Type\ThisTypeNode;
  use PHPStan\PhpDocParser\Ast\Type\UnionTypeNode;
@@ -129,7 +129,7 @@ index 6716e43..eb0bd88 100644
  use PHPUnit\Framework\TestCase;
  
  class TypeToStringTest extends TestCase
-@@ -35,6 +36,12 @@ class TypeToStringTest extends TestCase
+@@ -36,6 +37,12 @@ class TypeToStringTest extends TestCase
  	 * @dataProvider provideConditionalCases
  	 * @dataProvider provideCombinedCases
  	 */
@@ -378,7 +378,7 @@ index 99f9510..345056e 100644
  	{
  		$config = new ParserConfig([]);
 diff --git a/tests/PHPStan/Parser/TypeParserTest.php b/tests/PHPStan/Parser/TypeParserTest.php
-index cae31c1..78bd68a 100644
+index cfaaa16..655bccb 100644
 --- a/tests/PHPStan/Parser/TypeParserTest.php
 +++ b/tests/PHPStan/Parser/TypeParserTest.php
 @@ -37,6 +37,7 @@ use PHPStan\PhpDocParser\Ast\Type\UnionTypeNode;
@@ -407,7 +407,7 @@ index cae31c1..78bd68a 100644
  	{
  		if ($expectedResult instanceof Exception) {
  			$this->expectException(get_class($expectedResult));
-@@ -3417,6 +3420,7 @@ class TypeParserTest extends TestCase
+@@ -3427,6 +3430,7 @@ class TypeParserTest extends TestCase
  	 * @dataProvider dataLinesAndIndexes
  	 * @param list<array{callable(Node): Node, string, int, int, int, int}> $assertions
  	 */
diff -pruN 2.2.0-2/src/Ast/Type/ArrayShapeItemNode.php 2.3.0-1/src/Ast/Type/ArrayShapeItemNode.php
--- 2.2.0-2/src/Ast/Type/ArrayShapeItemNode.php	2025-07-13 07:04:09.000000000 +0000
+++ 2.3.0-1/src/Ast/Type/ArrayShapeItemNode.php	2025-08-30 15:50:23.000000000 +0000
@@ -4,6 +4,7 @@ namespace PHPStan\PhpDocParser\Ast\Type;
 
 use PHPStan\PhpDocParser\Ast\ConstExpr\ConstExprIntegerNode;
 use PHPStan\PhpDocParser\Ast\ConstExpr\ConstExprStringNode;
+use PHPStan\PhpDocParser\Ast\ConstExpr\ConstFetchNode;
 use PHPStan\PhpDocParser\Ast\Node;
 use PHPStan\PhpDocParser\Ast\NodeAttributes;
 use function sprintf;
@@ -13,7 +14,7 @@ class ArrayShapeItemNode implements Node
 
 	use NodeAttributes;
 
-	/** @var ConstExprIntegerNode|ConstExprStringNode|IdentifierTypeNode|null */
+	/** @var ConstExprIntegerNode|ConstExprStringNode|ConstFetchNode|IdentifierTypeNode|null */
 	public $keyName;
 
 	public bool $optional;
@@ -21,7 +22,7 @@ class ArrayShapeItemNode implements Node
 	public TypeNode $valueType;
 
 	/**
-	 * @param ConstExprIntegerNode|ConstExprStringNode|IdentifierTypeNode|null $keyName
+	 * @param ConstExprIntegerNode|ConstExprStringNode|ConstFetchNode|IdentifierTypeNode|null $keyName
 	 */
 	public function __construct($keyName, bool $optional, TypeNode $valueType)
 	{
diff -pruN 2.2.0-2/src/Parser/TypeParser.php 2.3.0-1/src/Parser/TypeParser.php
--- 2.2.0-2/src/Parser/TypeParser.php	2025-07-13 07:04:09.000000000 +0000
+++ 2.3.0-1/src/Parser/TypeParser.php	2025-08-30 15:50:23.000000000 +0000
@@ -970,7 +970,7 @@ class TypeParser
 
 	/**
 	 * @phpstan-impure
-	 * @return Ast\ConstExpr\ConstExprIntegerNode|Ast\ConstExpr\ConstExprStringNode|Ast\Type\IdentifierTypeNode
+	 * @return Ast\ConstExpr\ConstExprIntegerNode|Ast\ConstExpr\ConstExprStringNode|Ast\ConstExpr\ConstFetchNode|Ast\Type\IdentifierTypeNode
 	 */
 	private function parseArrayShapeKey(TokenIterator $tokens)
 	{
@@ -991,8 +991,17 @@ class TypeParser
 			$tokens->next();
 
 		} else {
-			$key = new Ast\Type\IdentifierTypeNode($tokens->currentTokenValue());
+			$identifier = $tokens->currentTokenValue();
 			$tokens->consumeTokenType(Lexer::TOKEN_IDENTIFIER);
+
+			if ($tokens->tryConsumeTokenType(Lexer::TOKEN_DOUBLE_COLON)) {
+				$classConstantName = $tokens->currentTokenValue();
+				$tokens->consumeTokenType(Lexer::TOKEN_IDENTIFIER);
+
+				$key = new Ast\ConstExpr\ConstFetchNode($identifier, $classConstantName);
+			} else {
+				$key = new Ast\Type\IdentifierTypeNode($identifier);
+			}
 		}
 
 		return $this->enrichWithAttributes(
diff -pruN 2.2.0-2/tests/PHPStan/Ast/ToString/TypeToStringTest.php 2.3.0-1/tests/PHPStan/Ast/ToString/TypeToStringTest.php
--- 2.2.0-2/tests/PHPStan/Ast/ToString/TypeToStringTest.php	2025-07-13 07:04:09.000000000 +0000
+++ 2.3.0-1/tests/PHPStan/Ast/ToString/TypeToStringTest.php	2025-08-30 15:50:23.000000000 +0000
@@ -6,6 +6,7 @@ use Generator;
 use PHPStan\PhpDocParser\Ast\ConstExpr\ConstExprIntegerNode;
 use PHPStan\PhpDocParser\Ast\ConstExpr\ConstExprNullNode;
 use PHPStan\PhpDocParser\Ast\ConstExpr\ConstExprStringNode;
+use PHPStan\PhpDocParser\Ast\ConstExpr\ConstFetchNode;
 use PHPStan\PhpDocParser\Ast\Node;
 use PHPStan\PhpDocParser\Ast\Type\ArrayShapeItemNode;
 use PHPStan\PhpDocParser\Ast\Type\ArrayShapeNode;
@@ -75,6 +76,13 @@ class TypeToStringTest extends TestCase
 					new ArrayShapeItemNode(new ConstExprIntegerNode('1'), false, new IdentifierTypeNode('Baz')),
 				]),
 			],
+			[
+				'array{Foo::BAR: Foo, Bar::FOO?: Bar}',
+				ArrayShapeNode::createSealed([
+					new ArrayShapeItemNode(new ConstFetchNode('Foo', 'BAR'), false, new IdentifierTypeNode('Foo')),
+					new ArrayShapeItemNode(new ConstFetchNode('Bar', 'FOO'), true, new IdentifierTypeNode('Bar')),
+				]),
+			],
 			['list{}', ArrayShapeNode::createSealed([], 'list')],
 			['list{...}', ArrayShapeNode::createUnsealed([], null, 'list')],
 			[
diff -pruN 2.2.0-2/tests/PHPStan/Parser/TypeParserTest.php 2.3.0-1/tests/PHPStan/Parser/TypeParserTest.php
--- 2.2.0-2/tests/PHPStan/Parser/TypeParserTest.php	2025-07-13 07:04:09.000000000 +0000
+++ 2.3.0-1/tests/PHPStan/Parser/TypeParserTest.php	2025-08-30 15:50:23.000000000 +0000
@@ -3041,6 +3041,16 @@ class TypeParserTest extends TestCase
 				new IdentifierTypeNode('MongoCollection'),
 				Lexer::TOKEN_OPEN_ANGLE_BRACKET,
 			],
+			[
+				'array{Foo::BAR: int}',
+				ArrayShapeNode::createSealed([
+					new ArrayShapeItemNode(
+						new ConstFetchNode('Foo', 'BAR'),
+						false,
+						new IdentifierTypeNode('int'),
+					),
+				]),
+			],
 		];
 	}
 
