Skip to content

Commit 8d39262

Browse files
[TypeDeclarationDocblocks] Allow override dummy array param on AddParamArrayDocblockFromAssignsParamToParamReferenceRector (#7375)
* [TypeDeclarationDocblocks] Allow override dummy array param on AddParamArrayDocblockFromAssignsParamToParamReferenceRector * implemented 🎉 * re use NodeDocblockTypeDecorator * re use NodeDocblockTypeDecorator * Update rules/TypeDeclarationDocblocks/Rector/ClassMethod/AddParamArrayDocblockFromAssignsParamToParamReferenceRector.php Co-authored-by: Tomas Votruba <tomas.vot@gmail.com> --------- Co-authored-by: Tomas Votruba <tomas.vot@gmail.com>
1 parent c5e7624 commit 8d39262

File tree

5 files changed

+49
-8
lines changed

5 files changed

+49
-8
lines changed
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
<?php
2+
3+
namespace Rector\Tests\TypeDeclarationDocblocks\Rector\ClassMethod\AddParamArrayDocblockFromAssignsParamToParamReferenceRector\Fixture;
4+
5+
final class OverrideDummyArrayParam
6+
{
7+
/**
8+
* @param array $items
9+
*/
10+
public function run(array &$items)
11+
{
12+
$items[] = 'John';
13+
}
14+
}
15+
16+
?>
17+
-----
18+
<?php
19+
20+
namespace Rector\Tests\TypeDeclarationDocblocks\Rector\ClassMethod\AddParamArrayDocblockFromAssignsParamToParamReferenceRector\Fixture;
21+
22+
final class OverrideDummyArrayParam
23+
{
24+
/**
25+
* @param string[] $items
26+
*/
27+
public function run(array &$items)
28+
{
29+
$items[] = 'John';
30+
}
31+
}
32+
33+
?>

rules/TypeDeclarationDocblocks/NodeDocblockTypeDecorator.php

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44

55
namespace Rector\TypeDeclarationDocblocks;
66

7+
use PhpParser\Node\Param;
78
use PhpParser\Node\Stmt\ClassMethod;
89
use PhpParser\Node\Stmt\Property;
910
use PHPStan\PhpDocParser\Ast\PhpDoc\ParamTagValueNode;
@@ -18,6 +19,7 @@
1819
use PHPStan\Type\NeverType;
1920
use PHPStan\Type\Type;
2021
use Rector\BetterPhpDocParser\PhpDocInfo\PhpDocInfo;
22+
use Rector\BetterPhpDocParser\PhpDocManipulator\PhpDocTypeChanger;
2123
use Rector\Comments\NodeDocBlock\DocBlockUpdater;
2224
use Rector\Privatization\TypeManipulator\TypeNormalizer;
2325
use Rector\StaticTypeMapper\StaticTypeMapper;
@@ -28,13 +30,15 @@ public function __construct(
2830
private TypeNormalizer $typeNormalizer,
2931
private StaticTypeMapper $staticTypeMapper,
3032
private DocBlockUpdater $docBlockUpdater,
33+
private PhpDocTypeChanger $phpDocTypeChanger
3134
) {
3235
}
3336

3437
public function decorateGenericIterableParamType(
3538
Type $type,
3639
PhpDocInfo $phpDocInfo,
3740
ClassMethod $classMethod,
41+
Param $param,
3842
string $parameterName
3943
): bool {
4044
if ($this->isBareMixedType($type)) {
@@ -50,9 +54,7 @@ public function decorateGenericIterableParamType(
5054
return false;
5155
}
5256

53-
$paramTagValueNode = new ParamTagValueNode($typeNode, false, '$' . $parameterName, '', false);
54-
55-
$this->addTagValueNodeAndUpdatePhpDocInfo($phpDocInfo, $paramTagValueNode, $classMethod);
57+
$this->phpDocTypeChanger->changeParamType($classMethod, $phpDocInfo, $normalizedType, $param, $parameterName);
5658

5759
return true;
5860
}

rules/TypeDeclarationDocblocks/Rector/ClassMethod/AddParamArrayDocblockFromAssignsParamToParamReferenceRector.php

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@
1414
use Rector\Rector\AbstractRector;
1515
use Rector\TypeDeclarationDocblocks\NodeDocblockTypeDecorator;
1616
use Rector\TypeDeclarationDocblocks\NodeFinder\ArrayDimFetchFinder;
17+
use Rector\TypeDeclarationDocblocks\TagNodeAnalyzer\UsefulArrayTagNodeAnalyzer;
1718
use Symplify\RuleDocGenerator\ValueObject\CodeSample\CodeSample;
1819
use Symplify\RuleDocGenerator\ValueObject\RuleDefinition;
1920

@@ -25,6 +26,7 @@ final class AddParamArrayDocblockFromAssignsParamToParamReferenceRector extends
2526
public function __construct(
2627
private readonly PhpDocInfoFactory $phpDocInfoFactory,
2728
private readonly ArrayDimFetchFinder $arrayDimFetchFinder,
29+
private readonly UsefulArrayTagNodeAnalyzer $usefulArrayTagNodeAnalyzer,
2830
private readonly NodeDocblockTypeDecorator $nodeDocblockTypeDecorator,
2931
) {
3032
}
@@ -101,7 +103,9 @@ public function refactor(Node $node): ?Node
101103
$paramTagValueNode = $phpDocInfo->getParamTagValueByName($paramName);
102104

103105
// already defined, lets skip it
104-
if ($paramTagValueNode instanceof ParamTagValueNode) {
106+
if ($this->usefulArrayTagNodeAnalyzer->isUsefulArrayTag(
107+
$paramTagValueNode
108+
)) {
105109
continue;
106110
}
107111

@@ -114,11 +118,11 @@ public function refactor(Node $node): ?Node
114118

115119
$assignedExprType = $this->getType($exprs[0]);
116120
$iterableType = new ArrayType(new MixedType(), $assignedExprType);
117-
118121
$hasParamTypeChanged = $this->nodeDocblockTypeDecorator->decorateGenericIterableParamType(
119122
$iterableType,
120123
$phpDocInfo,
121124
$node,
125+
$param,
122126
$paramName
123127
);
124128

rules/TypeDeclarationDocblocks/Rector/Class_/ClassMethodArrayDocblockParamFromLocalCallsRector.php

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -127,6 +127,7 @@ public function refactor(Node $node): ?Node
127127
$resolvedParameterType,
128128
$classMethodPhpDocInfo,
129129
$classMethod,
130+
$param,
130131
$parameterName
131132
);
132133

rules/TypeDeclarationDocblocks/TagNodeAnalyzer/UsefulArrayTagNodeAnalyzer.php

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4,18 +4,19 @@
44

55
namespace Rector\TypeDeclarationDocblocks\TagNodeAnalyzer;
66

7+
use PHPStan\PhpDocParser\Ast\PhpDoc\ParamTagValueNode;
78
use PHPStan\PhpDocParser\Ast\PhpDoc\ReturnTagValueNode;
89
use PHPStan\PhpDocParser\Ast\Type\IdentifierTypeNode;
910

1011
final class UsefulArrayTagNodeAnalyzer
1112
{
12-
public function isUsefulArrayTag(?ReturnTagValueNode $returnTagValueNode): bool
13+
public function isUsefulArrayTag(null|ReturnTagValueNode|ParamTagValueNode $tagValueNode): bool
1314
{
14-
if (! $returnTagValueNode instanceof ReturnTagValueNode) {
15+
if (! $tagValueNode instanceof ReturnTagValueNode && ! $tagValueNode instanceof ParamTagValueNode) {
1516
return false;
1617
}
1718

18-
$type = $returnTagValueNode->type;
19+
$type = $tagValueNode->type;
1920
if (! $type instanceof IdentifierTypeNode) {
2021
return true;
2122
}

0 commit comments

Comments
 (0)