From 25a0deba3ef516fc20cf109ed188019f46804df3 Mon Sep 17 00:00:00 2001 From: Markus Staab Date: Tue, 10 Feb 2026 11:38:41 +0100 Subject: [PATCH 1/6] Do not degrade array-shapes in phpdocs --- src/PhpDoc/TypeNodeResolver.php | 5 +- .../Constant/ConstantArrayTypeBuilder.php | 6 + tests/PHPStan/Analyser/nsrt/bug-14012b.php | 293 ++++++++++++++++++ 3 files changed, 300 insertions(+), 4 deletions(-) create mode 100644 tests/PHPStan/Analyser/nsrt/bug-14012b.php diff --git a/src/PhpDoc/TypeNodeResolver.php b/src/PhpDoc/TypeNodeResolver.php index 9fc4e5836a..88b4f80c66 100644 --- a/src/PhpDoc/TypeNodeResolver.php +++ b/src/PhpDoc/TypeNodeResolver.php @@ -1049,10 +1049,6 @@ function (CallableTypeParameterNode $parameterNode) use ($nameScope, &$isVariadi private function resolveArrayShapeNode(ArrayShapeNode $typeNode, NameScope $nameScope): Type { $builder = ConstantArrayTypeBuilder::createEmpty(); - if (count($typeNode->items) > ConstantArrayTypeBuilder::ARRAY_COUNT_LIMIT) { - $builder->degradeToGeneralArray(true); - } - foreach ($typeNode->items as $itemNode) { if ($itemNode->valueType instanceof CallableTypeNode) { $builder->disableClosureDegradation(); @@ -1062,6 +1058,7 @@ private function resolveArrayShapeNode(ArrayShapeNode $typeNode, NameScope $name $builder->setOffsetValueType($offsetType, $this->resolve($itemNode->valueType, $nameScope), $itemNode->optional); } + $builder->disableArrayDegradation(); $arrayType = $builder->getArray(); $accessories = []; diff --git a/src/Type/Constant/ConstantArrayTypeBuilder.php b/src/Type/Constant/ConstantArrayTypeBuilder.php index 4d919a0e5a..5f878296d1 100644 --- a/src/Type/Constant/ConstantArrayTypeBuilder.php +++ b/src/Type/Constant/ConstantArrayTypeBuilder.php @@ -305,6 +305,12 @@ public function disableClosureDegradation(): void $this->degradeClosures = false; } + public function disableArrayDegradation(): void + { + $this->degradeToGeneralArray = false; + $this->oversized = false; + } + public function getArray(): Type { $keyTypesCount = count($this->keyTypes); diff --git a/tests/PHPStan/Analyser/nsrt/bug-14012b.php b/tests/PHPStan/Analyser/nsrt/bug-14012b.php new file mode 100644 index 0000000000..2e11b1173d --- /dev/null +++ b/tests/PHPStan/Analyser/nsrt/bug-14012b.php @@ -0,0 +1,293 @@ + Date: Tue, 10 Feb 2026 11:41:34 +0100 Subject: [PATCH 2/6] Update bug-8775.php --- tests/PHPStan/Analyser/nsrt/bug-8775.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/PHPStan/Analyser/nsrt/bug-8775.php b/tests/PHPStan/Analyser/nsrt/bug-8775.php index 3a1678e919..c763fcc178 100644 --- a/tests/PHPStan/Analyser/nsrt/bug-8775.php +++ b/tests/PHPStan/Analyser/nsrt/bug-8775.php @@ -273,7 +273,7 @@ class Test public static $fixtures; function doFoo():void { - assertType('(int|string)', Test::$fixtures['257']); + assertType('int', Test::$fixtures['257']); } } From 84154cef8261263ebbac0a11b92e375bb3fcd41c Mon Sep 17 00:00:00 2001 From: Markus Staab Date: Tue, 10 Feb 2026 11:56:50 +0100 Subject: [PATCH 3/6] separate flag --- src/PhpDoc/TypeNodeResolver.php | 3 ++- src/Type/Constant/ConstantArrayTypeBuilder.php | 16 +++++++++++++--- 2 files changed, 15 insertions(+), 4 deletions(-) diff --git a/src/PhpDoc/TypeNodeResolver.php b/src/PhpDoc/TypeNodeResolver.php index 88b4f80c66..7ad5d80e29 100644 --- a/src/PhpDoc/TypeNodeResolver.php +++ b/src/PhpDoc/TypeNodeResolver.php @@ -1049,6 +1049,8 @@ function (CallableTypeParameterNode $parameterNode) use ($nameScope, &$isVariadi private function resolveArrayShapeNode(ArrayShapeNode $typeNode, NameScope $nameScope): Type { $builder = ConstantArrayTypeBuilder::createEmpty(); + $builder->disableArrayDegradation(); + foreach ($typeNode->items as $itemNode) { if ($itemNode->valueType instanceof CallableTypeNode) { $builder->disableClosureDegradation(); @@ -1058,7 +1060,6 @@ private function resolveArrayShapeNode(ArrayShapeNode $typeNode, NameScope $name $builder->setOffsetValueType($offsetType, $this->resolve($itemNode->valueType, $nameScope), $itemNode->optional); } - $builder->disableArrayDegradation(); $arrayType = $builder->getArray(); $accessories = []; diff --git a/src/Type/Constant/ConstantArrayTypeBuilder.php b/src/Type/Constant/ConstantArrayTypeBuilder.php index 5f878296d1..cefe898d9b 100644 --- a/src/Type/Constant/ConstantArrayTypeBuilder.php +++ b/src/Type/Constant/ConstantArrayTypeBuilder.php @@ -35,6 +35,8 @@ final class ConstantArrayTypeBuilder private bool $degradeToGeneralArray = false; + private bool $disableArrayDegradation = false; + private ?bool $degradeClosures = null; private bool $oversized = false; @@ -83,8 +85,11 @@ public function setOffsetValueType(?Type $offsetType, Type $valueType, bool $opt $offsetType = $offsetType->toArrayKey(); } - if (!$this->degradeToGeneralArray) { - if ($valueType instanceof ClosureType && $this->degradeClosures !== false) { + if (!$this->degradeToGeneralArray || $this->disableArrayDegradation) { + if ( + $valueType instanceof ClosureType + && $this->degradeClosures !== false + ) { $numClosures = 1; foreach ($this->valueTypes as $innerType) { if (!($innerType instanceof ClosureType)) { @@ -296,6 +301,10 @@ public function setOffsetValueType(?Type $offsetType, Type $valueType, bool $opt public function degradeToGeneralArray(bool $oversized = false): void { + if ($this->disableArrayDegradation) { + throw new ShouldNotHappenException(); + } + $this->degradeToGeneralArray = true; $this->oversized = $this->oversized || $oversized; } @@ -309,6 +318,7 @@ public function disableArrayDegradation(): void { $this->degradeToGeneralArray = false; $this->oversized = false; + $this->disableArrayDegradation = true; } public function getArray(): Type @@ -318,7 +328,7 @@ public function getArray(): Type return new ConstantArrayType([], []); } - if (!$this->degradeToGeneralArray) { + if (!$this->degradeToGeneralArray || $this->disableArrayDegradation) { /** @var list $keyTypes */ $keyTypes = $this->keyTypes; return new ConstantArrayType($keyTypes, $this->valueTypes, $this->nextAutoIndexes, $this->optionalKeys, $this->isList); From 8c8b65a5e0504a308917b0cd2dbfe33658897564 Mon Sep 17 00:00:00 2001 From: Markus Staab Date: Tue, 10 Feb 2026 12:02:42 +0100 Subject: [PATCH 4/6] add AnalyserIntegrationTest --- tests/PHPStan/Analyser/AnalyserIntegrationTest.php | 6 ++++++ tests/PHPStan/Analyser/nsrt/bug-14012b.php | 2 +- 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/tests/PHPStan/Analyser/AnalyserIntegrationTest.php b/tests/PHPStan/Analyser/AnalyserIntegrationTest.php index db1a3d6b6b..cf56a34adc 100644 --- a/tests/PHPStan/Analyser/AnalyserIntegrationTest.php +++ b/tests/PHPStan/Analyser/AnalyserIntegrationTest.php @@ -1637,6 +1637,12 @@ public function testBug13945Two(): void $this->assertNoErrors($errors); } + public function testBigPhpdocArrayShape(): void + { + $errors = $this->runAnalyse(__DIR__ . '/nsrt/bug-14012b.php'); + $this->assertNoErrors($errors); + } + /** * @param string[]|null $allAnalysedFiles * @return list diff --git a/tests/PHPStan/Analyser/nsrt/bug-14012b.php b/tests/PHPStan/Analyser/nsrt/bug-14012b.php index 2e11b1173d..0b82760e40 100644 --- a/tests/PHPStan/Analyser/nsrt/bug-14012b.php +++ b/tests/PHPStan/Analyser/nsrt/bug-14012b.php @@ -287,7 +287,7 @@ final class ExpectationMethodResolver * aisTrue: bool, * } */ - public static array $resolvers = []; + public static array $resolvers; } assertType("array{hasMethod: bool, hasProperty: bool, isArray: bool, isBool: bool, isCallable: bool, isCountable: bool, isFalse: bool, isFloat: bool, isInstanceOf: bool, isInt: bool, isIterable: bool, isList: bool, isMap: bool, isNaturalInt: bool, isNegativeInt: bool, isNonEmptyString: bool, isNull: bool, isNumeric: bool, isObject: bool, isPositiveInt: bool, isResource: bool, isSameAs: bool, isScalar: bool, isString: bool, isTrue: bool, jhasMethod: bool, jhasProperty: bool, jisArray: bool, jisBool: bool, jisCallable: bool, jisCountable: bool, jisFalse: bool, jisFloat: bool, jisInstanceOf: bool, jisInt: bool, jisIterable: bool, jisList: bool, jisMap: bool, jisNaturalInt: bool, jisNegativeInt: bool, jisNonEmptyString: bool, jisNull: bool, jisNumeric: bool, jisObject: bool, jisPositiveInt: bool, jisResource: bool, jisSameAs: bool, jisScalar: bool, jisString: bool, jisTrue: bool, ihasMethod: bool, ihasProperty: bool, iisArray: bool, iisBool: bool, iisCallable: bool, iisCountable: bool, iisFalse: bool, iisFloat: bool, iisInstanceOf: bool, iisInt: bool, iisIterable: bool, iisList: bool, iisMap: bool, iisNaturalInt: bool, iisNegativeInt: bool, iisNonEmptyString: bool, iisNull: bool, iisNumeric: bool, iisObject: bool, iisPositiveInt: bool, iisResource: bool, iisSameAs: bool, iisScalar: bool, iisString: bool, iisTrue: bool, hhasMethod: bool, hhasProperty: bool, hisArray: bool, hisBool: bool, hisCallable: bool, hisCountable: bool, hisFalse: bool, hisFloat: bool, hisInstanceOf: bool, hisInt: bool, hisIterable: bool, hisList: bool, hisMap: bool, hisNaturalInt: bool, hisNegativeInt: bool, hisNonEmptyString: bool, hisNull: bool, hisNumeric: bool, hisObject: bool, hisPositiveInt: bool, hisResource: bool, hisSameAs: bool, hisScalar: bool, hisString: bool, hisTrue: bool, ghasMethod: bool, ghasProperty: bool, gisArray: bool, gisBool: bool, gisCallable: bool, gisCountable: bool, gisFalse: bool, gisFloat: bool, gisInstanceOf: bool, gisInt: bool, gisIterable: bool, gisList: bool, gisMap: bool, gisNaturalInt: bool, gisNegativeInt: bool, gisNonEmptyString: bool, gisNull: bool, gisNumeric: bool, gisObject: bool, gisPositiveInt: bool, gisResource: bool, gisSameAs: bool, gisScalar: bool, gisString: bool, gisTrue: bool, fhasMethod: bool, fhasProperty: bool, fisArray: bool, fisBool: bool, fisCallable: bool, fisCountable: bool, fisFalse: bool, fisFloat: bool, fisInstanceOf: bool, fisInt: bool, fisIterable: bool, fisList: bool, fisMap: bool, fisNaturalInt: bool, fisNegativeInt: bool, fisNonEmptyString: bool, fisNull: bool, fisNumeric: bool, fisObject: bool, fisPositiveInt: bool, fisResource: bool, fisSameAs: bool, fisScalar: bool, fisString: bool, fisTrue: bool, ehasMethod: bool, ehasProperty: bool, eisArray: bool, eisBool: bool, eisCallable: bool, eisCountable: bool, eisFalse: bool, eisFloat: bool, eisInstanceOf: bool, eisInt: bool, eisIterable: bool, eisList: bool, eisMap: bool, eisNaturalInt: bool, eisNegativeInt: bool, eisNonEmptyString: bool, eisNull: bool, eisNumeric: bool, eisObject: bool, eisPositiveInt: bool, eisResource: bool, eisSameAs: bool, eisScalar: bool, eisString: bool, eisTrue: bool, dhasMethod: bool, dhasProperty: bool, disArray: bool, disBool: bool, disCallable: bool, disCountable: bool, disFalse: bool, disFloat: bool, disInstanceOf: bool, disInt: bool, disIterable: bool, disList: bool, disMap: bool, disNaturalInt: bool, disNegativeInt: bool, disNonEmptyString: bool, disNull: bool, disNumeric: bool, disObject: bool, disPositiveInt: bool, disResource: bool, disSameAs: bool, disScalar: bool, disString: bool, disTrue: bool, chasMethod: bool, chasProperty: bool, cisArray: bool, cisBool: bool, cisCallable: bool, cisCountable: bool, cisFalse: bool, cisFloat: bool, cisInstanceOf: bool, cisInt: bool, cisIterable: bool, cisList: bool, cisMap: bool, cisNaturalInt: bool, cisNegativeInt: bool, cisNonEmptyString: bool, cisNull: bool, cisNumeric: bool, cisObject: bool, cisPositiveInt: bool, cisResource: bool, cisSameAs: bool, cisScalar: bool, cisString: bool, cisTrue: bool, bhasMethod: bool, bhasProperty: bool, bisArray: bool, bisBool: bool, bisCallable: bool, bisCountable: bool, bisFalse: bool, bisFloat: bool, bisInstanceOf: bool, bisInt: bool, bisIterable: bool, bisList: bool, bisMap: bool, bisNaturalInt: bool, bisNegativeInt: bool, bisNonEmptyString: bool, bisNull: bool, bisNumeric: bool, bisObject: bool, bisPositiveInt: bool, bisResource: bool, bisSameAs: bool, bisScalar: bool, bisString: bool, bisTrue: bool, ahasMethod: bool, ahasProperty: bool, aisArray: bool, aisBool: bool, aisCallable: bool, aisCountable: bool, aisFalse: bool, aisFloat: bool, aisInstanceOf: bool, aisInt: bool, aisIterable: bool, aisList: bool, aisMap: bool, aisNaturalInt: bool, aisNegativeInt: bool, aisNonEmptyString: bool, aisNull: bool, aisNumeric: bool, aisObject: bool, aisPositiveInt: bool, aisResource: bool, aisSameAs: bool, aisScalar: bool, aisString: bool, aisTrue: bool}", ExpectationMethodResolver::$resolvers); From f00655f0836307e5f8b68c02f57c10b43841da7d Mon Sep 17 00:00:00 2001 From: Markus Staab Date: Tue, 10 Feb 2026 13:48:42 +0100 Subject: [PATCH 5/6] testDegradesWhileDisableArrayDegradation --- src/Type/Constant/ConstantArrayTypeBuilder.php | 15 +++++++++++---- .../Constant/ConstantArrayTypeBuilderTest.php | 14 ++++++++++++++ 2 files changed, 25 insertions(+), 4 deletions(-) diff --git a/src/Type/Constant/ConstantArrayTypeBuilder.php b/src/Type/Constant/ConstantArrayTypeBuilder.php index cefe898d9b..0a8695faea 100644 --- a/src/Type/Constant/ConstantArrayTypeBuilder.php +++ b/src/Type/Constant/ConstantArrayTypeBuilder.php @@ -85,10 +85,11 @@ public function setOffsetValueType(?Type $offsetType, Type $valueType, bool $opt $offsetType = $offsetType->toArrayKey(); } - if (!$this->degradeToGeneralArray || $this->disableArrayDegradation) { + if (!$this->degradeToGeneralArray) { if ( $valueType instanceof ClosureType && $this->degradeClosures !== false + && !$this->disableArrayDegradation ) { $numClosures = 1; foreach ($this->valueTypes as $innerType) { @@ -152,7 +153,10 @@ public function setOffsetValueType(?Type $offsetType, Type $valueType, bool $opt $this->optionalKeys[] = count($this->keyTypes) - 1; } - if (count($this->keyTypes) > self::ARRAY_COUNT_LIMIT) { + if ( + !$this->disableArrayDegradation + && count($this->keyTypes) > self::ARRAY_COUNT_LIMIT + ) { $this->degradeToGeneralArray = true; $this->oversized = true; } @@ -225,7 +229,10 @@ public function setOffsetValueType(?Type $offsetType, Type $valueType, bool $opt $this->optionalKeys[] = count($this->keyTypes) - 1; } - if (count($this->keyTypes) > self::ARRAY_COUNT_LIMIT) { + if ( + !$this->disableArrayDegradation + && count($this->keyTypes) > self::ARRAY_COUNT_LIMIT + ) { $this->degradeToGeneralArray = true; $this->oversized = true; } @@ -328,7 +335,7 @@ public function getArray(): Type return new ConstantArrayType([], []); } - if (!$this->degradeToGeneralArray || $this->disableArrayDegradation) { + if (!$this->degradeToGeneralArray) { /** @var list $keyTypes */ $keyTypes = $this->keyTypes; return new ConstantArrayType($keyTypes, $this->valueTypes, $this->nextAutoIndexes, $this->optionalKeys, $this->isList); diff --git a/tests/PHPStan/Type/Constant/ConstantArrayTypeBuilderTest.php b/tests/PHPStan/Type/Constant/ConstantArrayTypeBuilderTest.php index 8052c4f8ae..560c3d3419 100644 --- a/tests/PHPStan/Type/Constant/ConstantArrayTypeBuilderTest.php +++ b/tests/PHPStan/Type/Constant/ConstantArrayTypeBuilderTest.php @@ -4,6 +4,7 @@ use PHPStan\Testing\PHPStanTestCase; use PHPStan\Type\BooleanType; +use PHPStan\Type\IntegerType; use PHPStan\Type\NullType; use PHPStan\Type\StringType; use PHPStan\Type\TypeCombinator; @@ -112,6 +113,19 @@ public function testDegradedArrayIsNotAlwaysOversized(): void $this->assertSame('non-empty-array', $array->describe(VerbosityLevel::precise())); } + public function testDegradesWhileDisableArrayDegradation(): void + { + $builder = ConstantArrayTypeBuilder::createEmpty(); + $builder->disableArrayDegradation(); + for ($i = 0; $i < 30; $i++) { + $builder->setOffsetValueType(new StringType(), new ConstantIntegerType($i)); + } + $builder->setOffsetValueType(new StringType(), new IntegerType()); + + $array = $builder->getArray(); + $this->assertSame('non-empty-array', $array->describe(VerbosityLevel::precise())); + } + public function testIsList(): void { $builder = ConstantArrayTypeBuilder::createEmpty(); From 71303cc4855c8721629389d94d941e02fe972a08 Mon Sep 17 00:00:00 2001 From: Markus Staab Date: Tue, 10 Feb 2026 13:51:43 +0100 Subject: [PATCH 6/6] Update ConstantArrayTypeBuilderTest.php --- .../Constant/ConstantArrayTypeBuilderTest.php | 23 +++++++++++++++++++ 1 file changed, 23 insertions(+) diff --git a/tests/PHPStan/Type/Constant/ConstantArrayTypeBuilderTest.php b/tests/PHPStan/Type/Constant/ConstantArrayTypeBuilderTest.php index 560c3d3419..12b8352566 100644 --- a/tests/PHPStan/Type/Constant/ConstantArrayTypeBuilderTest.php +++ b/tests/PHPStan/Type/Constant/ConstantArrayTypeBuilderTest.php @@ -126,6 +126,29 @@ public function testDegradesWhileDisableArrayDegradation(): void $this->assertSame('non-empty-array', $array->describe(VerbosityLevel::precise())); } + public function testDisableArrayDegradation(): void + { + $builder = ConstantArrayTypeBuilder::createEmpty(); + $builder->disableArrayDegradation(); + for ($i = 0; $i < 300; $i++) { + $builder->setOffsetValueType(new ConstantIntegerType($i), new ConstantIntegerType($i)); + } + + $array = $builder->getArray(); + $this->assertSame('array{0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, 172, 173, 174, 175, 176, 177, 178, 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, 192, 193, 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, 205, 206, 207, 208, 209, 210, 211, 212, 213, 214, 215, 216, 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, 228, 229, 230, 231, 232, 233, 234, 235, 236, 237, 238, 239, 240, 241, 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, 252, 253, 254, 255, 256, 257, 258, 259, 260, 261, 262, 263, 264, 265, 266, 267, 268, 269, 270, 271, 272, 273, 274, 275, 276, 277, 278, 279, 280, 281, 282, 283, 284, 285, 286, 287, 288, 289, 290, 291, 292, 293, 294, 295, 296, 297, 298, 299}', $array->describe(VerbosityLevel::precise())); + } + + public function testArrayDegradation(): void + { + $builder = ConstantArrayTypeBuilder::createEmpty(); + for ($i = 0; $i < 300; $i++) { + $builder->setOffsetValueType(new ConstantIntegerType($i), new ConstantIntegerType($i)); + } + + $array = $builder->getArray(); + $this->assertSame('non-empty-array<0|1|2|3|4|5|6|7|8|9|10|11|12|13|14|15|16|17|18|19|20|21|22|23|24|25|26|27|28|29|30|31|32|33|34|35|36|37|38|39|40|41|42|43|44|45|46|47|48|49|50|51|52|53|54|55|56|57|58|59|60|61|62|63|64|65|66|67|68|69|70|71|72|73|74|75|76|77|78|79|80|81|82|83|84|85|86|87|88|89|90|91|92|93|94|95|96|97|98|99|100|101|102|103|104|105|106|107|108|109|110|111|112|113|114|115|116|117|118|119|120|121|122|123|124|125|126|127|128|129|130|131|132|133|134|135|136|137|138|139|140|141|142|143|144|145|146|147|148|149|150|151|152|153|154|155|156|157|158|159|160|161|162|163|164|165|166|167|168|169|170|171|172|173|174|175|176|177|178|179|180|181|182|183|184|185|186|187|188|189|190|191|192|193|194|195|196|197|198|199|200|201|202|203|204|205|206|207|208|209|210|211|212|213|214|215|216|217|218|219|220|221|222|223|224|225|226|227|228|229|230|231|232|233|234|235|236|237|238|239|240|241|242|243|244|245|246|247|248|249|250|251|252|253|254|255|256|257|258|259|260|261|262|263|264|265|266|267|268|269|270|271|272|273|274|275|276|277|278|279|280|281|282|283|284|285|286|287|288|289|290|291|292|293|294|295|296|297|298|299, 0|1|2|3|4|5|6|7|8|9|10|11|12|13|14|15|16|17|18|19|20|21|22|23|24|25|26|27|28|29|30|31|32|33|34|35|36|37|38|39|40|41|42|43|44|45|46|47|48|49|50|51|52|53|54|55|56|57|58|59|60|61|62|63|64|65|66|67|68|69|70|71|72|73|74|75|76|77|78|79|80|81|82|83|84|85|86|87|88|89|90|91|92|93|94|95|96|97|98|99|100|101|102|103|104|105|106|107|108|109|110|111|112|113|114|115|116|117|118|119|120|121|122|123|124|125|126|127|128|129|130|131|132|133|134|135|136|137|138|139|140|141|142|143|144|145|146|147|148|149|150|151|152|153|154|155|156|157|158|159|160|161|162|163|164|165|166|167|168|169|170|171|172|173|174|175|176|177|178|179|180|181|182|183|184|185|186|187|188|189|190|191|192|193|194|195|196|197|198|199|200|201|202|203|204|205|206|207|208|209|210|211|212|213|214|215|216|217|218|219|220|221|222|223|224|225|226|227|228|229|230|231|232|233|234|235|236|237|238|239|240|241|242|243|244|245|246|247|248|249|250|251|252|253|254|255|256|257|258|259|260|261|262|263|264|265|266|267|268|269|270|271|272|273|274|275|276|277|278|279|280|281|282|283|284|285|286|287|288|289|290|291|292|293|294|295|296|297|298|299>&oversized-array', $array->describe(VerbosityLevel::precise())); + } + public function testIsList(): void { $builder = ConstantArrayTypeBuilder::createEmpty();