66
77use PhpParser \Node ;
88use PhpParser \Node \Stmt \Class_ ;
9- use PHPStan \PhpDocParser \Ast \PhpDoc \ParamTagValueNode ;
10- use PHPStan \Type \ArrayType ;
11- use PHPStan \Type \MixedType ;
129use Rector \BetterPhpDocParser \PhpDocInfo \PhpDocInfoFactory ;
13- use Rector \Comments \NodeDocBlock \DocBlockUpdater ;
1410use Rector \PHPUnit \NodeAnalyzer \TestsNodeAnalyzer ;
15- use Rector \Privatization \TypeManipulator \TypeNormalizer ;
1611use Rector \Rector \AbstractRector ;
17- use Rector \StaticTypeMapper \StaticTypeMapper ;
1812use Rector \TypeDeclaration \TypeAnalyzer \ParameterTypeFromDataProviderResolver ;
13+ use Rector \TypeDeclarationDocblocks \NodeDocblockTypeDecorator ;
1914use Rector \TypeDeclarationDocblocks \NodeFinder \DataProviderMethodsFinder ;
15+ use Rector \TypeDeclarationDocblocks \TagNodeAnalyzer \UsefulArrayTagNodeAnalyzer ;
2016use Symplify \RuleDocGenerator \ValueObject \CodeSample \CodeSample ;
2117use Symplify \RuleDocGenerator \ValueObject \RuleDefinition ;
2218
@@ -27,12 +23,11 @@ final class AddParamArrayDocblockFromDataProviderRector extends AbstractRector
2723{
2824 public function __construct (
2925 private readonly PhpDocInfoFactory $ phpDocInfoFactory ,
30- private readonly DocBlockUpdater $ docBlockUpdater ,
3126 private readonly TestsNodeAnalyzer $ testsNodeAnalyzer ,
3227 private readonly DataProviderMethodsFinder $ dataProviderMethodsFinder ,
3328 private readonly ParameterTypeFromDataProviderResolver $ parameterTypeFromDataProviderResolver ,
34- private readonly StaticTypeMapper $ staticTypeMapper ,
35- private readonly TypeNormalizer $ typeNormalizer ,
29+ private readonly UsefulArrayTagNodeAnalyzer $ usefulArrayTagNodeAnalyzer ,
30+ private readonly NodeDocblockTypeDecorator $ nodeDocblockTypeDecorator
3631 ) {
3732 }
3833
@@ -137,7 +132,7 @@ public function refactor(Node $node): ?Node
137132 $ paramTagValueNode = $ phpDocInfo ->getParamTagValueByName ($ paramName );
138133
139134 // already defined, lets skip it
140- if ($ paramTagValueNode instanceof ParamTagValueNode ) {
135+ if ($ this -> usefulArrayTagNodeAnalyzer -> isUsefulArrayTag ( $ paramTagValueNode) ) {
141136 continue ;
142137 }
143138
@@ -146,26 +141,19 @@ public function refactor(Node $node): ?Node
146141 $ dataProviderNodes ->getClassMethods ()
147142 );
148143
149- // skip mixed type, as it is not informative
150- if ($ parameterType instanceof ArrayType && $ parameterType ->getItemType () instanceof MixedType) {
151- continue ;
152- }
144+ $ hasParamTypeChanged = $ this ->nodeDocblockTypeDecorator ->decorateGenericIterableParamType (
145+ $ parameterType ,
146+ $ phpDocInfo ,
147+ $ classMethod ,
148+ $ param ,
149+ $ paramName
150+ );
153151
154- if ($ parameterType instanceof MixedType ) {
152+ if (! $ hasParamTypeChanged ) {
155153 continue ;
156154 }
157155
158- $ generalizedParameterType = $ this ->typeNormalizer ->generalizeConstantTypes ($ parameterType );
159-
160- $ parameterTypeNode = $ this ->staticTypeMapper ->mapPHPStanTypeToPHPStanPhpDocTypeNode (
161- $ generalizedParameterType
162- );
163-
164- $ paramTagValueNode = new ParamTagValueNode ($ parameterTypeNode , false , '$ ' . $ paramName , '' , false );
165- $ phpDocInfo ->addTagValueNode ($ paramTagValueNode );
166156 $ hasChanged = true ;
167-
168- $ this ->docBlockUpdater ->updateRefactoredNodeWithPhpDocInfo ($ classMethod );
169157 }
170158
171159 }
0 commit comments