Skip to content

Commit 9093d16

Browse files
authored
[TypeDeclarationDocblocks] Allow override dummy array param on AddParamArrayDocblockFromDimFetchAccessRector (#7377)
* [TypeDeclarationDocblocks] Allow override dummy array param on AddParamArrayDocblockFromDimFetchAccessRector * implemented 🎉
1 parent f6963ae commit 9093d16

File tree

2 files changed

+56
-9
lines changed

2 files changed

+56
-9
lines changed
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
<?php
2+
3+
namespace Rector\Tests\TypeDeclarationDocblocks\Rector\ClassMethod\AddParamArrayDocblockFromDimFetchAccessRector\Fixture;
4+
5+
final class OverrideDummyArrayParam
6+
{
7+
/**
8+
* @param array $data
9+
*/
10+
public function process(array $data): void
11+
{
12+
$item = $data['key'];
13+
14+
$anotherItem = $data['another_key'];
15+
}
16+
}
17+
18+
?>
19+
-----
20+
<?php
21+
22+
namespace Rector\Tests\TypeDeclarationDocblocks\Rector\ClassMethod\AddParamArrayDocblockFromDimFetchAccessRector\Fixture;
23+
24+
final class OverrideDummyArrayParam
25+
{
26+
/**
27+
* @param array<string, mixed> $data
28+
*/
29+
public function process(array $data): void
30+
{
31+
$item = $data['key'];
32+
33+
$anotherItem = $data['another_key'];
34+
}
35+
}
36+
37+
?>

rules/TypeDeclarationDocblocks/Rector/ClassMethod/AddParamArrayDocblockFromDimFetchAccessRector.php

Lines changed: 19 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -12,10 +12,12 @@
1212
use PHPStan\PhpDocParser\Ast\Type\GenericTypeNode;
1313
use PHPStan\PhpDocParser\Ast\Type\IdentifierTypeNode;
1414
use PHPStan\Type\Type;
15+
use Rector\BetterPhpDocParser\PhpDocInfo\PhpDocInfo;
1516
use Rector\BetterPhpDocParser\PhpDocInfo\PhpDocInfoFactory;
1617
use Rector\Comments\NodeDocBlock\DocBlockUpdater;
1718
use Rector\Rector\AbstractRector;
1819
use Rector\TypeDeclarationDocblocks\NodeFinder\ArrayDimFetchFinder;
20+
use Rector\TypeDeclarationDocblocks\TagNodeAnalyzer\UsefulArrayTagNodeAnalyzer;
1921
use Symplify\RuleDocGenerator\ValueObject\CodeSample\CodeSample;
2022
use Symplify\RuleDocGenerator\ValueObject\RuleDefinition;
2123

@@ -27,7 +29,8 @@ final class AddParamArrayDocblockFromDimFetchAccessRector extends AbstractRector
2729
public function __construct(
2830
private readonly PhpDocInfoFactory $phpDocInfoFactory,
2931
private readonly ArrayDimFetchFinder $arrayDimFetchFinder,
30-
private readonly DocBlockUpdater $docBlockUpdater
32+
private readonly DocBlockUpdater $docBlockUpdater,
33+
private readonly UsefulArrayTagNodeAnalyzer $usefulArrayTagNodeAnalyzer
3134
) {
3235
}
3336

@@ -105,7 +108,7 @@ public function refactor(Node $node): ?Node
105108
$paramTagValueNode = $phpDocInfo->getParamTagValueByName($paramName);
106109

107110
// already defined, lets skip it
108-
if ($paramTagValueNode instanceof ParamTagValueNode) {
111+
if ($this->usefulArrayTagNodeAnalyzer->isUsefulArrayTag($paramTagValueNode)) {
109112
continue;
110113
}
111114

@@ -130,15 +133,13 @@ public function refactor(Node $node): ?Node
130133
}
131134

132135
if ($this->isOnlyStringType($keyTypes)) {
133-
$paramTagValueNode = $this->createParamTagValueNode($paramName, 'string');
134-
$phpDocInfo->addTagValueNode($paramTagValueNode);
136+
$this->createParamTagValueNode($phpDocInfo, $paramName, 'string', $paramTagValueNode);
135137
$hasChanged = true;
136138
continue;
137139
}
138140

139141
if ($this->isOnlyIntegerType($keyTypes)) {
140-
$paramTagValueNode = $this->createParamTagValueNode($paramName, 'int');
141-
$phpDocInfo->addTagValueNode($paramTagValueNode);
142+
$this->createParamTagValueNode($phpDocInfo, $paramName, 'int', $paramTagValueNode);
142143
$hasChanged = true;
143144
continue;
144145
}
@@ -186,13 +187,22 @@ private function isOnlyIntegerType(array $keyTypes): bool
186187
return true;
187188
}
188189

189-
private function createParamTagValueNode(string $paramName, string $keyTypeValue): ParamTagValueNode
190-
{
190+
private function createParamTagValueNode(
191+
PhpDocInfo $phpDocInfo,
192+
string $paramName,
193+
string $keyTypeValue,
194+
?ParamTagValueNode $paramTagValueNode
195+
): void {
191196
$arrayGenericTypeNode = new GenericTypeNode(new IdentifierTypeNode('array'), [
192197
new IdentifierTypeNode($keyTypeValue),
193198
new IdentifierTypeNode('mixed'),
194199
]);
195200

196-
return new ParamTagValueNode($arrayGenericTypeNode, false, '$' . $paramName, '', false);
201+
if ($paramTagValueNode instanceof ParamTagValueNode) {
202+
$paramTagValueNode->type = $arrayGenericTypeNode;
203+
} else {
204+
$paramTagValueNode = new ParamTagValueNode($arrayGenericTypeNode, false, '$' . $paramName, '', false);
205+
$phpDocInfo->addTagValueNode($paramTagValueNode);
206+
}
197207
}
198208
}

0 commit comments

Comments
 (0)