From 861a7f4ab1f313c00ff9ace2c7fab0abe60e51b7 Mon Sep 17 00:00:00 2001 From: Abdul Malik Ikhsan Date: Tue, 21 Oct 2025 01:10:55 +0700 Subject: [PATCH 1/5] Add getVisitorsForNode() method to NodeTraverser --- lib/PhpParser/NodeTraverser.php | 18 ++++++++++++++---- 1 file changed, 14 insertions(+), 4 deletions(-) diff --git a/lib/PhpParser/NodeTraverser.php b/lib/PhpParser/NodeTraverser.php index bb3d6ddbfa..7bfdd83ba8 100644 --- a/lib/PhpParser/NodeTraverser.php +++ b/lib/PhpParser/NodeTraverser.php @@ -110,7 +110,8 @@ protected function traverseNode(Node $node): void { $traverseChildren = true; $visitorIndex = -1; - foreach ($this->visitors as $visitorIndex => $visitor) { + $visitors = $this->getVisitorsForNode($subNode); + foreach ($visitors as $visitorIndex => $visitor) { $return = $visitor->enterNode($subNode); if (null !== $return) { if ($return instanceof Node) { @@ -143,7 +144,7 @@ protected function traverseNode(Node $node): void { } for (; $visitorIndex >= 0; --$visitorIndex) { - $visitor = $this->visitors[$visitorIndex]; + $visitor = $visitors[$visitorIndex]; $return = $visitor->leaveNode($subNode); if (null !== $return) { @@ -192,7 +193,8 @@ protected function traverseArray(array $nodes): array { $traverseChildren = true; $visitorIndex = -1; - foreach ($this->visitors as $visitorIndex => $visitor) { + $visitors = $this->getVisitorsForNode($node); + foreach ($visitors as $visitorIndex => $visitor) { $return = $visitor->enterNode($node); if (null !== $return) { if ($return instanceof Node) { @@ -231,7 +233,7 @@ protected function traverseArray(array $nodes): array { } for (; $visitorIndex >= 0; --$visitorIndex) { - $visitor = $this->visitors[$visitorIndex]; + $visitor = $visitors[$visitorIndex]; $return = $visitor->leaveNode($node); if (null !== $return) { @@ -268,6 +270,14 @@ protected function traverseArray(array $nodes): array { return $nodes; } + /** + * @return NodeVisitor[] + */ + public function getVisitorsForNode(Node $node) + { + return $this->visitors; + } + private function ensureReplacementReasonable(Node $old, Node $new): void { if ($old instanceof Node\Stmt && $new instanceof Node\Expr) { throw new \LogicException( From 52fc3584d2c6b63e78681f53607bc796d429c544 Mon Sep 17 00:00:00 2001 From: Abdul Malik Ikhsan Date: Tue, 21 Oct 2025 01:14:58 +0700 Subject: [PATCH 2/5] cs fix --- lib/PhpParser/NodeTraverser.php | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/lib/PhpParser/NodeTraverser.php b/lib/PhpParser/NodeTraverser.php index 7bfdd83ba8..2cf0439af8 100644 --- a/lib/PhpParser/NodeTraverser.php +++ b/lib/PhpParser/NodeTraverser.php @@ -273,8 +273,7 @@ protected function traverseArray(array $nodes): array { /** * @return NodeVisitor[] */ - public function getVisitorsForNode(Node $node) - { + public function getVisitorsForNode(Node $node) { return $this->visitors; } From 5e726681c8403c7a66bd22c47596cfd48253a364 Mon Sep 17 00:00:00 2001 From: Abdul Malik Ikhsan Date: Tue, 21 Oct 2025 09:54:51 +0700 Subject: [PATCH 3/5] make getVisitorsForNode method protected --- lib/PhpParser/NodeTraverser.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/PhpParser/NodeTraverser.php b/lib/PhpParser/NodeTraverser.php index 2cf0439af8..1280a08f95 100644 --- a/lib/PhpParser/NodeTraverser.php +++ b/lib/PhpParser/NodeTraverser.php @@ -273,7 +273,7 @@ protected function traverseArray(array $nodes): array { /** * @return NodeVisitor[] */ - public function getVisitorsForNode(Node $node) { + protected function getVisitorsForNode(Node $node) { return $this->visitors; } From 540e5b1ba99bfab03269c0f2faad1b4e04e40d29 Mon Sep 17 00:00:00 2001 From: Abdul Malik Ikhsan Date: Tue, 21 Oct 2025 09:57:33 +0700 Subject: [PATCH 4/5] add comment why the method is needed --- lib/PhpParser/NodeTraverser.php | 2 ++ 1 file changed, 2 insertions(+) diff --git a/lib/PhpParser/NodeTraverser.php b/lib/PhpParser/NodeTraverser.php index 1280a08f95..1c7c5fc537 100644 --- a/lib/PhpParser/NodeTraverser.php +++ b/lib/PhpParser/NodeTraverser.php @@ -271,6 +271,8 @@ protected function traverseArray(array $nodes): array { } /** + * This method give ability to customize which visitors are applied to a given node in child class. + * * @return NodeVisitor[] */ protected function getVisitorsForNode(Node $node) { From 512d31d8ea039310302e8acead597b2c2750e6f0 Mon Sep 17 00:00:00 2001 From: Abdul Malik Ikhsan Date: Tue, 21 Oct 2025 09:57:57 +0700 Subject: [PATCH 5/5] add array return type --- lib/PhpParser/NodeTraverser.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/PhpParser/NodeTraverser.php b/lib/PhpParser/NodeTraverser.php index 1c7c5fc537..c59050845d 100644 --- a/lib/PhpParser/NodeTraverser.php +++ b/lib/PhpParser/NodeTraverser.php @@ -275,7 +275,7 @@ protected function traverseArray(array $nodes): array { * * @return NodeVisitor[] */ - protected function getVisitorsForNode(Node $node) { + protected function getVisitorsForNode(Node $node): array { return $this->visitors; }