diff --git a/rules-tests/TypeDeclarationDocblocks/Rector/ClassMethod/DocblockReturnArrayFromDirectArrayInstanceRector/Fixture/return_empty.php.inc b/rules-tests/TypeDeclarationDocblocks/Rector/ClassMethod/DocblockReturnArrayFromDirectArrayInstanceRector/Fixture/return_empty.php.inc index a68fbdab672..4beb2996db5 100644 --- a/rules-tests/TypeDeclarationDocblocks/Rector/ClassMethod/DocblockReturnArrayFromDirectArrayInstanceRector/Fixture/return_empty.php.inc +++ b/rules-tests/TypeDeclarationDocblocks/Rector/ClassMethod/DocblockReturnArrayFromDirectArrayInstanceRector/Fixture/return_empty.php.inc @@ -19,7 +19,7 @@ namespace Rector\Tests\TypeDeclarationDocblocks\Rector\ClassMethod\DocblockRetur class ReturnEmpty { /** - * @return array + * @return array{} */ public function run(): array { diff --git a/rules/TypeDeclarationDocblocks/TypeResolver/ConstantArrayTypeGeneralizer.php b/rules/TypeDeclarationDocblocks/TypeResolver/ConstantArrayTypeGeneralizer.php index 4e52fe717d5..e3067597f3b 100644 --- a/rules/TypeDeclarationDocblocks/TypeResolver/ConstantArrayTypeGeneralizer.php +++ b/rules/TypeDeclarationDocblocks/TypeResolver/ConstantArrayTypeGeneralizer.php @@ -4,10 +4,10 @@ namespace Rector\TypeDeclarationDocblocks\TypeResolver; +use PHPStan\PhpDocParser\Ast\Type\ArrayShapeNode; use PHPStan\PhpDocParser\Ast\Type\GenericTypeNode; use PHPStan\PhpDocParser\Ast\Type\IdentifierTypeNode; use PHPStan\Type\Constant\ConstantArrayType; -use PHPStan\Type\IntegerType; use PHPStan\Type\MixedType; use PHPStan\Type\NeverType; use PHPStan\Type\Type; @@ -30,7 +30,7 @@ public function __construct( ) { } - public function generalize(ConstantArrayType $constantArrayType, bool $isFresh = true): GenericTypeNode + public function generalize(ConstantArrayType $constantArrayType, bool $isFresh = true): GenericTypeNode|ArrayShapeNode { if ($isFresh) { $this->currentNesting = 0; @@ -40,12 +40,12 @@ public function generalize(ConstantArrayType $constantArrayType, bool $isFresh = $genericKeyType = $this->typeNormalizer->generalizeConstantTypes($constantArrayType->getKeyType()); - if ($constantArrayType->getItemType() instanceof NeverType) { - $genericKeyType = new IntegerType(); - } - $itemType = $constantArrayType->getItemType(); + if ($itemType instanceof NeverType) { + return ArrayShapeNode::createSealed([]); + } + if ($itemType instanceof ConstantArrayType) { if ($this->currentNesting >= self::MAX_NESTING) { $genericItemType = new MixedType(); @@ -64,7 +64,7 @@ public function generalize(ConstantArrayType $constantArrayType, bool $isFresh = return $this->createArrayGenericTypeNode($genericKeyType, $genericItemType); } - private function createArrayGenericTypeNode(Type $keyType, Type|GenericTypeNode $itemType): GenericTypeNode + private function createArrayGenericTypeNode(Type $keyType, Type|GenericTypeNode|ArrayShapeNode $itemType): GenericTypeNode { $keyDocTypeNode = $this->staticTypeMapper->mapPHPStanTypeToPHPStanPhpDocTypeNode($keyType);