diff --git a/src/Type/Constant/ConstantArrayTypeBuilder.php b/src/Type/Constant/ConstantArrayTypeBuilder.php index db110bfa26e..190b95a8aba 100644 --- a/src/Type/Constant/ConstantArrayTypeBuilder.php +++ b/src/Type/Constant/ConstantArrayTypeBuilder.php @@ -104,14 +104,17 @@ public function setOffsetValueType(?Type $offsetType, Type $valueType, bool $opt $integerRanges = TypeUtils::getIntegerRanges($offsetType); if (count($integerRanges) > 0) { foreach ($integerRanges as $integerRange) { - if ($integerRange->getMin() === null) { + $minRange = $integerRange->getMin(); + if ($minRange === null || $minRange <= -self::ARRAY_COUNT_LIMIT) { break; } - if ($integerRange->getMax() === null) { + + $maxRange = $integerRange->getMax(); + if ($maxRange === null || $maxRange >= self::ARRAY_COUNT_LIMIT) { break; } - foreach (range($integerRange->getMin(), $integerRange->getMax()) as $rangeValue) { + foreach (range($minRange, $maxRange) as $rangeValue) { $scalarTypes[] = new ConstantIntegerType($rangeValue); } } diff --git a/tests/PHPStan/PhpDoc/TypeDescriptionTest.php b/tests/PHPStan/PhpDoc/TypeDescriptionTest.php index 29c3a352314..c6fc0d9ab27 100644 --- a/tests/PHPStan/PhpDoc/TypeDescriptionTest.php +++ b/tests/PHPStan/PhpDoc/TypeDescriptionTest.php @@ -9,9 +9,12 @@ use PHPStan\Type\Accessory\NonEmptyArrayType; use PHPStan\Type\ArrayType; use PHPStan\Type\ClassStringType; +use PHPStan\Type\Constant\ConstantArrayType; use PHPStan\Type\Constant\ConstantArrayTypeBuilder; +use PHPStan\Type\Constant\ConstantIntegerType; use PHPStan\Type\Constant\ConstantStringType; use PHPStan\Type\Generic\GenericClassStringType; +use PHPStan\Type\IntegerRangeType; use PHPStan\Type\IntegerType; use PHPStan\Type\IntersectionType; use PHPStan\Type\MixedType; @@ -67,6 +70,15 @@ public function dataTest(): iterable $builder = ConstantArrayTypeBuilder::createEmpty(); $builder->setOffsetValueType(new ConstantStringType('"foo"'), new IntegerType()); yield ['array{\'"foo"\': int}', $builder->getArray()]; + + $builder = ConstantArrayTypeBuilder::createFromConstantArray( + new ConstantArrayType( + [new ConstantIntegerType(0), new ConstantIntegerType(1)], + [new StringType(), new StringType()], + ), + ); + $builder->setOffsetValueType(IntegerRangeType::fromInterval(-2147483648, 2147483647), new StringType()); + yield ['non-empty-array, string>', $builder->getArray()]; } /**