diff --git a/rules-tests/TypeDeclarationDocblocks/Rector/ClassMethod/AddParamArrayDocblockFromDimFetchAccessRector/Fixture/override_dummy_array_param.php.inc b/rules-tests/TypeDeclarationDocblocks/Rector/ClassMethod/AddParamArrayDocblockFromDimFetchAccessRector/Fixture/override_dummy_array_param.php.inc new file mode 100644 index 00000000000..c8d115ce3e4 --- /dev/null +++ b/rules-tests/TypeDeclarationDocblocks/Rector/ClassMethod/AddParamArrayDocblockFromDimFetchAccessRector/Fixture/override_dummy_array_param.php.inc @@ -0,0 +1,37 @@ + +----- + $data + */ + public function process(array $data): void + { + $item = $data['key']; + + $anotherItem = $data['another_key']; + } +} + +?> diff --git a/rules/TypeDeclarationDocblocks/Rector/ClassMethod/AddParamArrayDocblockFromDimFetchAccessRector.php b/rules/TypeDeclarationDocblocks/Rector/ClassMethod/AddParamArrayDocblockFromDimFetchAccessRector.php index 3ad2384872f..d9d073ccd9e 100644 --- a/rules/TypeDeclarationDocblocks/Rector/ClassMethod/AddParamArrayDocblockFromDimFetchAccessRector.php +++ b/rules/TypeDeclarationDocblocks/Rector/ClassMethod/AddParamArrayDocblockFromDimFetchAccessRector.php @@ -12,10 +12,12 @@ use PHPStan\PhpDocParser\Ast\Type\GenericTypeNode; use PHPStan\PhpDocParser\Ast\Type\IdentifierTypeNode; use PHPStan\Type\Type; +use Rector\BetterPhpDocParser\PhpDocInfo\PhpDocInfo; use Rector\BetterPhpDocParser\PhpDocInfo\PhpDocInfoFactory; use Rector\Comments\NodeDocBlock\DocBlockUpdater; use Rector\Rector\AbstractRector; use Rector\TypeDeclarationDocblocks\NodeFinder\ArrayDimFetchFinder; +use Rector\TypeDeclarationDocblocks\TagNodeAnalyzer\UsefulArrayTagNodeAnalyzer; use Symplify\RuleDocGenerator\ValueObject\CodeSample\CodeSample; use Symplify\RuleDocGenerator\ValueObject\RuleDefinition; @@ -27,7 +29,8 @@ final class AddParamArrayDocblockFromDimFetchAccessRector extends AbstractRector public function __construct( private readonly PhpDocInfoFactory $phpDocInfoFactory, private readonly ArrayDimFetchFinder $arrayDimFetchFinder, - private readonly DocBlockUpdater $docBlockUpdater + private readonly DocBlockUpdater $docBlockUpdater, + private readonly UsefulArrayTagNodeAnalyzer $usefulArrayTagNodeAnalyzer ) { } @@ -105,7 +108,7 @@ public function refactor(Node $node): ?Node $paramTagValueNode = $phpDocInfo->getParamTagValueByName($paramName); // already defined, lets skip it - if ($paramTagValueNode instanceof ParamTagValueNode) { + if ($this->usefulArrayTagNodeAnalyzer->isUsefulArrayTag($paramTagValueNode)) { continue; } @@ -130,15 +133,13 @@ public function refactor(Node $node): ?Node } if ($this->isOnlyStringType($keyTypes)) { - $paramTagValueNode = $this->createParamTagValueNode($paramName, 'string'); - $phpDocInfo->addTagValueNode($paramTagValueNode); + $this->createParamTagValueNode($phpDocInfo, $paramName, 'string', $paramTagValueNode); $hasChanged = true; continue; } if ($this->isOnlyIntegerType($keyTypes)) { - $paramTagValueNode = $this->createParamTagValueNode($paramName, 'int'); - $phpDocInfo->addTagValueNode($paramTagValueNode); + $this->createParamTagValueNode($phpDocInfo, $paramName, 'int', $paramTagValueNode); $hasChanged = true; continue; } @@ -186,13 +187,22 @@ private function isOnlyIntegerType(array $keyTypes): bool return true; } - private function createParamTagValueNode(string $paramName, string $keyTypeValue): ParamTagValueNode - { + private function createParamTagValueNode( + PhpDocInfo $phpDocInfo, + string $paramName, + string $keyTypeValue, + ?ParamTagValueNode $paramTagValueNode + ): void { $arrayGenericTypeNode = new GenericTypeNode(new IdentifierTypeNode('array'), [ new IdentifierTypeNode($keyTypeValue), new IdentifierTypeNode('mixed'), ]); - return new ParamTagValueNode($arrayGenericTypeNode, false, '$' . $paramName, '', false); + if ($paramTagValueNode instanceof ParamTagValueNode) { + $paramTagValueNode->type = $arrayGenericTypeNode; + } else { + $paramTagValueNode = new ParamTagValueNode($arrayGenericTypeNode, false, '$' . $paramName, '', false); + $phpDocInfo->addTagValueNode($paramTagValueNode); + } } }