99use PhpParser \Node \PropertyItem ;
1010use PhpParser \Node \Stmt \ClassMethod ;
1111use PhpParser \Node \Stmt \Const_ ;
12- use PhpParser \Node \Stmt \InlineHTML ;
1312use PhpParser \Node \Stmt \Interface_ ;
14- use PhpParser \Node \Stmt \Nop ;
1513use PhpParser \Node \Stmt \Property ;
1614use PhpParser \Node \Stmt \Trait_ ;
1715use PhpParser \NodeTraverser ;
2220use PHPStan \Type \Type ;
2321use Rector \Application \ChangedNodeScopeRefresher ;
2422use Rector \Application \Provider \CurrentFileProvider ;
25- use Rector \BetterPhpDocParser \PhpDocInfo \ PhpDocInfo ;
23+ use Rector \BetterPhpDocParser \Comment \ CommentsMerger ;
2624use Rector \ChangesReporting \ValueObject \RectorWithLineChange ;
2725use Rector \Contract \Rector \HTMLAverseRectorInterface ;
2826use Rector \Contract \Rector \RectorInterface ;
@@ -72,6 +70,8 @@ abstract class AbstractRector extends NodeVisitorAbstract implements RectorInter
7270
7371 private CurrentFileProvider $ currentFileProvider ;
7472
73+ private CommentsMerger $ commentsMerger ;
74+
7575 /**
7676 * @var array<int, Node[]>
7777 */
@@ -90,7 +90,8 @@ public function autowire(
9090 NodeComparator $ nodeComparator ,
9191 CurrentFileProvider $ currentFileProvider ,
9292 CreatedByRuleDecorator $ createdByRuleDecorator ,
93- ChangedNodeScopeRefresher $ changedNodeScopeRefresher
93+ ChangedNodeScopeRefresher $ changedNodeScopeRefresher ,
94+ CommentsMerger $ commentsMerger
9495 ): void {
9596 $ this ->nodeNameResolver = $ nodeNameResolver ;
9697 $ this ->nodeTypeResolver = $ nodeTypeResolver ;
@@ -101,6 +102,7 @@ public function autowire(
101102 $ this ->currentFileProvider = $ currentFileProvider ;
102103 $ this ->createdByRuleDecorator = $ createdByRuleDecorator ;
103104 $ this ->changedNodeScopeRefresher = $ changedNodeScopeRefresher ;
105+ $ this ->commentsMerger = $ commentsMerger ;
104106 }
105107
106108 /**
@@ -183,7 +185,7 @@ final public function enterNode(Node $node): int|Node|null
183185 * Replacing nodes in leaveNode() method avoids infinite recursion
184186 * see"infinite recursion" in https://github.com/nikic/PHP-Parser/blob/master/doc/component/Walking_the_AST.markdown
185187 *
186- * @return \PhpParser\ Node|\PhpParser\ Node[]|NodeVisitor::REMOVE_NODE|null
188+ * @return Node|Node[]|NodeVisitor::REMOVE_NODE|null
187189 */
188190 final public function leaveNode (Node $ node ): array |int |Node |null
189191 {
@@ -263,31 +265,7 @@ protected function traverseNodesWithCallable(Node | array $nodes, callable $call
263265
264266 protected function mirrorComments (Node $ newNode , Node $ oldNode ): void
265267 {
266- if ($ this ->nodeComparator ->areSameNode ($ newNode , $ oldNode )) {
267- return ;
268- }
269-
270- if ($ oldNode instanceof InlineHTML) {
271- return ;
272- }
273-
274- $ oldPhpDocInfo = $ oldNode ->getAttribute (AttributeKey::PHP_DOC_INFO );
275- $ newPhpDocInfo = $ newNode ->getAttribute (AttributeKey::PHP_DOC_INFO );
276-
277- if ($ newPhpDocInfo instanceof PhpDocInfo) {
278- if (! $ oldPhpDocInfo instanceof PhpDocInfo) {
279- return ;
280- }
281-
282- if ((string ) $ oldPhpDocInfo ->getPhpDocNode () !== (string ) $ newPhpDocInfo ->getPhpDocNode ()) {
283- return ;
284- }
285- }
286-
287- $ newNode ->setAttribute (AttributeKey::PHP_DOC_INFO , $ oldPhpDocInfo );
288- if (! $ newNode instanceof Nop) {
289- $ newNode ->setAttribute (AttributeKey::COMMENTS , $ oldNode ->getAttribute (AttributeKey::COMMENTS ));
290- }
268+ $ this ->commentsMerger ->mirrorComments ($ newNode , $ oldNode );
291269 }
292270
293271 /**
0 commit comments