From 0936b86277666b18f0f693d49124378e955abdee Mon Sep 17 00:00:00 2001 From: Abdul Malik Ikhsan Date: Tue, 30 Sep 2025 20:31:35 +0700 Subject: [PATCH 1/3] [TypeDeclarationDocblocks] Allow override dummy array param on AddParamArrayDocblockFromDimFetchAccessRector --- .../override_dummy_array_param.php.inc | 37 +++++++++++++++++++ 1 file changed, 37 insertions(+) create mode 100644 rules-tests/TypeDeclarationDocblocks/Rector/ClassMethod/AddParamArrayDocblockFromDimFetchAccessRector/Fixture/override_dummy_array_param.php.inc 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']; + } +} + +?> From a68b78cb44861c7bb8708df5efc1c51d538a4eb3 Mon Sep 17 00:00:00 2001 From: Abdul Malik Ikhsan Date: Tue, 30 Sep 2025 20:43:13 +0700 Subject: [PATCH 2/3] implemented :tada: --- ...mArrayDocblockFromDimFetchAccessRector.php | 29 +++++++++++++------ 1 file changed, 20 insertions(+), 9 deletions(-) diff --git a/rules/TypeDeclarationDocblocks/Rector/ClassMethod/AddParamArrayDocblockFromDimFetchAccessRector.php b/rules/TypeDeclarationDocblocks/Rector/ClassMethod/AddParamArrayDocblockFromDimFetchAccessRector.php index 3ad2384872f..b57d2b0ad50 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,23 @@ 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); + $paramTagValueNode = $phpDocInfo->getParamTagValueByName($paramName); + if ($paramTagValueNode instanceof ParamTagValueNode) { + $paramTagValueNode->type = $arrayGenericTypeNode; + } else { + $paramTagValueNode = new ParamTagValueNode($arrayGenericTypeNode, false, '$' . $paramName, '', false); + $phpDocInfo->addTagValueNode($paramTagValueNode); + } } } From 7cab568054c9e78a3d9633a3f5a66e23c4560923 Mon Sep 17 00:00:00 2001 From: Abdul Malik Ikhsan Date: Tue, 30 Sep 2025 20:44:32 +0700 Subject: [PATCH 3/3] implemented :tada: --- .../AddParamArrayDocblockFromDimFetchAccessRector.php | 1 - 1 file changed, 1 deletion(-) diff --git a/rules/TypeDeclarationDocblocks/Rector/ClassMethod/AddParamArrayDocblockFromDimFetchAccessRector.php b/rules/TypeDeclarationDocblocks/Rector/ClassMethod/AddParamArrayDocblockFromDimFetchAccessRector.php index b57d2b0ad50..d9d073ccd9e 100644 --- a/rules/TypeDeclarationDocblocks/Rector/ClassMethod/AddParamArrayDocblockFromDimFetchAccessRector.php +++ b/rules/TypeDeclarationDocblocks/Rector/ClassMethod/AddParamArrayDocblockFromDimFetchAccessRector.php @@ -198,7 +198,6 @@ private function createParamTagValueNode( new IdentifierTypeNode('mixed'), ]); - $paramTagValueNode = $phpDocInfo->getParamTagValueByName($paramName); if ($paramTagValueNode instanceof ParamTagValueNode) { $paramTagValueNode->type = $arrayGenericTypeNode; } else {