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 \NodeVisitor ;
2119use PHPStan \Type \Type ;
2220use Rector \Application \ChangedNodeScopeRefresher ;
2321use Rector \Application \Provider \CurrentFileProvider ;
24- use Rector \BetterPhpDocParser \PhpDocInfo \ PhpDocInfo ;
22+ use Rector \BetterPhpDocParser \Comment \ CommentsMerger ;
2523use Rector \ChangesReporting \ValueObject \RectorWithLineChange ;
2624use Rector \Contract \Rector \HTMLAverseRectorInterface ;
2725use Rector \Contract \Rector \RectorInterface ;
@@ -71,6 +69,8 @@ abstract class AbstractRector extends NodeVisitorAbstract implements RectorInter
7169
7270 private CurrentFileProvider $ currentFileProvider ;
7371
72+ private CommentsMerger $ commentsMerger ;
73+
7474 /**
7575 * @var array<int, Node[]>
7676 */
@@ -89,7 +89,8 @@ public function autowire(
8989 NodeComparator $ nodeComparator ,
9090 CurrentFileProvider $ currentFileProvider ,
9191 CreatedByRuleDecorator $ createdByRuleDecorator ,
92- ChangedNodeScopeRefresher $ changedNodeScopeRefresher
92+ ChangedNodeScopeRefresher $ changedNodeScopeRefresher ,
93+ CommentsMerger $ commentsMerger
9394 ): void {
9495 $ this ->nodeNameResolver = $ nodeNameResolver ;
9596 $ this ->nodeTypeResolver = $ nodeTypeResolver ;
@@ -100,6 +101,7 @@ public function autowire(
100101 $ this ->currentFileProvider = $ currentFileProvider ;
101102 $ this ->createdByRuleDecorator = $ createdByRuleDecorator ;
102103 $ this ->changedNodeScopeRefresher = $ changedNodeScopeRefresher ;
104+ $ this ->commentsMerger = $ commentsMerger ;
103105 }
104106
105107 /**
@@ -189,6 +191,8 @@ final public function enterNode(Node $node): int|Node|null
189191 /**
190192 * Replacing nodes in leaveNode() method avoids infinite recursion
191193 * see"infinite recursion" in https://github.com/nikic/PHP-Parser/blob/master/doc/component/Walking_the_AST.markdown
194+ *
195+ * @return Node|Node[]|NodeVisitor::REMOVE_NODE|null
192196 */
193197 final public function leaveNode (Node $ node ): array |int |Node |null
194198 {
@@ -268,31 +272,7 @@ protected function traverseNodesWithCallable(Node | array $nodes, callable $call
268272
269273 protected function mirrorComments (Node $ newNode , Node $ oldNode ): void
270274 {
271- if ($ this ->nodeComparator ->areSameNode ($ newNode , $ oldNode )) {
272- return ;
273- }
274-
275- if ($ oldNode instanceof InlineHTML) {
276- return ;
277- }
278-
279- $ oldPhpDocInfo = $ oldNode ->getAttribute (AttributeKey::PHP_DOC_INFO );
280- $ newPhpDocInfo = $ newNode ->getAttribute (AttributeKey::PHP_DOC_INFO );
281-
282- if ($ newPhpDocInfo instanceof PhpDocInfo) {
283- if (! $ oldPhpDocInfo instanceof PhpDocInfo) {
284- return ;
285- }
286-
287- if ((string ) $ oldPhpDocInfo ->getPhpDocNode () !== (string ) $ newPhpDocInfo ->getPhpDocNode ()) {
288- return ;
289- }
290- }
291-
292- $ newNode ->setAttribute (AttributeKey::PHP_DOC_INFO , $ oldPhpDocInfo );
293- if (! $ newNode instanceof Nop) {
294- $ newNode ->setAttribute (AttributeKey::COMMENTS , $ oldNode ->getAttribute (AttributeKey::COMMENTS ));
295- }
275+ $ this ->commentsMerger ->mirrorComments ($ newNode , $ oldNode );
296276 }
297277
298278 private function decorateCurrentAndChildren (Node $ node ): void
0 commit comments