1111use PHPStan \Type \ArrayType ;
1212use PHPStan \Type \MixedType ;
1313use Rector \BetterPhpDocParser \PhpDocInfo \PhpDocInfoFactory ;
14+ use Rector \BetterPhpDocParser \PhpDocManipulator \PhpDocTypeChanger ;
15+ use Rector \Privatization \TypeManipulator \TypeNormalizer ;
1416use Rector \Rector \AbstractRector ;
15- use Rector \TypeDeclarationDocblocks \NodeDocblockTypeDecorator ;
1617use Rector \TypeDeclarationDocblocks \NodeFinder \ArrayDimFetchFinder ;
18+ use Rector \TypeDeclarationDocblocks \TagNodeAnalyzer \UsefulArrayTagNodeAnalyzer ;
1719use Symplify \RuleDocGenerator \ValueObject \CodeSample \CodeSample ;
1820use Symplify \RuleDocGenerator \ValueObject \RuleDefinition ;
1921
@@ -25,7 +27,9 @@ final class AddParamArrayDocblockFromAssignsParamToParamReferenceRector extends
2527 public function __construct (
2628 private readonly PhpDocInfoFactory $ phpDocInfoFactory ,
2729 private readonly ArrayDimFetchFinder $ arrayDimFetchFinder ,
28- private readonly NodeDocblockTypeDecorator $ nodeDocblockTypeDecorator ,
30+ private readonly UsefulArrayTagNodeAnalyzer $ usefulArrayTagNodeAnalyzer ,
31+ private readonly TypeNormalizer $ typeNormalizer ,
32+ private readonly PhpDocTypeChanger $ phpDocTypeChanger
2933 ) {
3034 }
3135
@@ -101,7 +105,9 @@ public function refactor(Node $node): ?Node
101105 $ paramTagValueNode = $ phpDocInfo ->getParamTagValueByName ($ paramName );
102106
103107 // already defined, lets skip it
104- if ($ paramTagValueNode instanceof ParamTagValueNode) {
108+ if ($ paramTagValueNode instanceof ParamTagValueNode && $ this ->usefulArrayTagNodeAnalyzer ->isUsefulArrayTag (
109+ $ paramTagValueNode
110+ )) {
105111 continue ;
106112 }
107113
@@ -113,18 +119,11 @@ public function refactor(Node $node): ?Node
113119 }
114120
115121 $ assignedExprType = $ this ->getType ($ exprs [0 ]);
116- $ iterableType = new ArrayType (new MixedType (), $ assignedExprType );
117-
118- $ hasParamTypeChanged = $ this ->nodeDocblockTypeDecorator ->decorateGenericIterableParamType (
119- $ iterableType ,
120- $ phpDocInfo ,
121- $ node ,
122- $ paramName
122+ $ iterableType = $ this ->typeNormalizer ->generalizeConstantTypes (
123+ new ArrayType (new MixedType (), $ assignedExprType )
123124 );
124125
125- if (! $ hasParamTypeChanged ) {
126- continue ;
127- }
126+ $ this ->phpDocTypeChanger ->changeParamType ($ node , $ phpDocInfo , $ iterableType , $ param , $ paramName );
128127
129128 $ hasChanged = true ;
130129 }
0 commit comments