1212use PhpParser \Node \Stmt \Interface_ ;
1313use PhpParser \Node \Stmt \Property ;
1414use PhpParser \Node \Stmt \Trait_ ;
15- use PhpParser \NodeTraverser ;
1615use PhpParser \NodeVisitor ;
1716use PhpParser \NodeVisitorAbstract ;
1817use PHPStan \Analyser \MutatingScope ;
@@ -72,15 +71,8 @@ abstract class AbstractRector extends NodeVisitorAbstract implements RectorInter
7271
7372 private CommentsMerger $ commentsMerger ;
7473
75- /**
76- * @var array<int, Node[]>
77- */
78- private array $ nodesToReturn = [];
79-
8074 private CreatedByRuleDecorator $ createdByRuleDecorator ;
8175
82- private ?int $ toBeRemovedNodeId = null ;
83-
8476 public function autowire (
8577 NodeNameResolver $ nodeNameResolver ,
8678 NodeTypeResolver $ nodeTypeResolver ,
@@ -128,9 +120,9 @@ public function beforeTraverse(array $nodes): ?array
128120 }
129121
130122 /**
131- * @return NodeTraverser ::REMOVE_NODE|Node|null
123+ * @return NodeVisitor ::REMOVE_NODE|Node|null|Node[]
132124 */
133- final public function enterNode (Node $ node ): int |Node |null
125+ final public function enterNode (Node $ node ): int |Node |null | array
134126 {
135127 if (is_a ($ this , HTMLAverseRectorInterface::class, true ) && $ this ->file ->containsHTML ()) {
136128 return null ;
@@ -167,47 +159,16 @@ final public function enterNode(Node $node): int|Node|null
167159 return null ;
168160 }
169161
170- // log here, so we can remove the node in leaveNode() method
171- $ this ->toBeRemovedNodeId = spl_object_id ($ originalNode );
172-
173162 // notify this rule changed code
174163 $ rectorWithLineChange = new RectorWithLineChange (static ::class, $ originalNode ->getStartLine ());
175164 $ this ->file ->addRectorClassWithLine ($ rectorWithLineChange );
176165
177- // keep original node as node will be removed in leaveNode()
178- return $ originalNode ;
166+ return $ refactoredNodeOrState ;
179167 }
180168
181169 return $ this ->postRefactorProcess ($ originalNode , $ node , $ refactoredNodeOrState , $ filePath );
182170 }
183171
184- /**
185- * Replacing nodes in leaveNode() method avoids infinite recursion
186- * see"infinite recursion" in https://github.com/nikic/PHP-Parser/blob/master/doc/component/Walking_the_AST.markdown
187- *
188- * @return Node|Node[]|NodeVisitor::REMOVE_NODE|null
189- */
190- final public function leaveNode (Node $ node ): array |int |Node |null
191- {
192- if ($ node ->hasAttribute (AttributeKey::ORIGINAL_NODE )) {
193- return null ;
194- }
195-
196- // nothing to change here
197- if ($ this ->toBeRemovedNodeId === null && $ this ->nodesToReturn === []) {
198- return null ;
199- }
200-
201- $ objectId = spl_object_id ($ node );
202- if ($ this ->toBeRemovedNodeId === $ objectId ) {
203- $ this ->toBeRemovedNodeId = null ;
204-
205- return NodeVisitor::REMOVE_NODE ;
206- }
207-
208- return $ this ->nodesToReturn [$ objectId ] ?? $ node ;
209- }
210-
211172 protected function isName (Node $ node , string $ name ): bool
212173 {
213174 return $ this ->nodeNameResolver ->isName ($ node , $ name );
@@ -270,13 +231,14 @@ protected function mirrorComments(Node $newNode, Node $oldNode): void
270231
271232 /**
272233 * @param Node|Node[] $refactoredNode
234+ * @return Node|Node[]
273235 */
274236 private function postRefactorProcess (
275237 Node $ originalNode ,
276238 Node $ node ,
277239 Node |array $ refactoredNode ,
278240 string $ filePath
279- ): Node {
241+ ): Node | array {
280242 /** @var non-empty-array<Node>|Node $refactoredNode */
281243 $ this ->createdByRuleDecorator ->decorate ($ refactoredNode , $ originalNode , static ::class);
282244
@@ -285,20 +247,8 @@ private function postRefactorProcess(
285247
286248 /** @var MutatingScope|null $currentScope */
287249 $ currentScope = $ node ->getAttribute (AttributeKey::SCOPE );
288-
289- if (is_array ($ refactoredNode )) {
290- $ this ->refreshScopeNodes ($ refactoredNode , $ filePath , $ currentScope );
291-
292- // search "infinite recursion" in https://github.com/nikic/PHP-Parser/blob/master/doc/component/Walking_the_AST.markdown
293- $ originalNodeId = spl_object_id ($ originalNode );
294-
295- // will be replaced in leaveNode() the original node must be passed
296- $ this ->nodesToReturn [$ originalNodeId ] = $ refactoredNode ;
297-
298- return $ originalNode ;
299- }
300-
301250 $ this ->refreshScopeNodes ($ refactoredNode , $ filePath , $ currentScope );
251+
302252 return $ refactoredNode ;
303253 }
304254
0 commit comments