1212use PHPStan \PhpDocParser \Ast \PhpDoc \ReturnTagValueNode ;
1313use PHPStan \Type \Constant \ConstantArrayType ;
1414use Rector \BetterPhpDocParser \PhpDocInfo \PhpDocInfoFactory ;
15+ use Rector \BetterPhpDocParser \PhpDocManipulator \PhpDocTypeChanger ;
1516use Rector \Comments \NodeDocBlock \DocBlockUpdater ;
1617use Rector \Rector \AbstractRector ;
1718use Rector \TypeDeclarationDocblocks \NodeFinder \ReturnNodeFinder ;
19+ use Rector \TypeDeclarationDocblocks \TagNodeAnalyzer \UsefulArrayTagNodeAnalyzer ;
1820use Rector \TypeDeclarationDocblocks \TypeResolver \ConstantArrayTypeGeneralizer ;
1921use Symplify \RuleDocGenerator \ValueObject \CodeSample \CodeSample ;
2022use Symplify \RuleDocGenerator \ValueObject \RuleDefinition ;
@@ -29,6 +31,8 @@ public function __construct(
2931 private readonly DocBlockUpdater $ docBlockUpdater ,
3032 private readonly ConstantArrayTypeGeneralizer $ constantArrayTypeGeneralizer ,
3133 private readonly ReturnNodeFinder $ returnNodeFinder ,
34+ private readonly UsefulArrayTagNodeAnalyzer $ usefulArrayTagNodeAnalyzer ,
35+ private readonly PhpDocTypeChanger $ phpDocTypeChanger
3236 ) {
3337 }
3438
@@ -82,11 +86,17 @@ public function refactor(Node $node): ?Node
8286 {
8387 $ phpDocInfo = $ this ->phpDocInfoFactory ->createFromNodeOrEmpty ($ node );
8488
85- // return tag is already given
86- if ($ phpDocInfo ->getReturnTagValue () instanceof ReturnTagValueNode) {
89+ if ($ this ->usefulArrayTagNodeAnalyzer ->isUsefulArrayTag ($ phpDocInfo ->getReturnTagValue ())) {
8790 return null ;
8891 }
8992
93+ // if ($phpDocInfo->getReturnTagValue() instanceof ReturnTagValueNode) {
94+ // if ($phpDocInfo->getReturnTagValue()->type);
95+ // die;
96+ //
97+ // return null;
98+ // }
99+
90100 if ($ node ->stmts === null ) {
91101 return null ;
92102 }
@@ -108,8 +118,13 @@ public function refactor(Node $node): ?Node
108118
109119 $ genericTypeNode = $ this ->constantArrayTypeGeneralizer ->generalize ($ returnedType );
110120
111- $ returnTagValueNode = new ReturnTagValueNode ($ genericTypeNode , '' );
112- $ phpDocInfo ->addTagValueNode ($ returnTagValueNode );
121+ $ existingReturnTagValueNode = $ phpDocInfo ->getReturnTagValue ();
122+ if ($ existingReturnTagValueNode instanceof ReturnTagValueNode) {
123+ $ existingReturnTagValueNode ->type = $ genericTypeNode ;
124+ } else {
125+ $ returnTagValueNode = new ReturnTagValueNode ($ genericTypeNode , '' );
126+ $ phpDocInfo ->addTagValueNode ($ returnTagValueNode );
127+ }
113128
114129 $ this ->docBlockUpdater ->updateRefactoredNodeWithPhpDocInfo ($ node );
115130
0 commit comments