From 54cb47b5595c81dcc59b7276974b83fa020a7275 Mon Sep 17 00:00:00 2001 From: Tomas Votruba Date: Wed, 14 Jan 2026 17:34:36 +0100 Subject: [PATCH 1/3] notes --- .../NodeTraverser/RectorNodeTraverser.php | 15 ++++++++++++--- 1 file changed, 12 insertions(+), 3 deletions(-) diff --git a/src/PhpParser/NodeTraverser/RectorNodeTraverser.php b/src/PhpParser/NodeTraverser/RectorNodeTraverser.php index f8bb6c4dba2..9ccb1331186 100644 --- a/src/PhpParser/NodeTraverser/RectorNodeTraverser.php +++ b/src/PhpParser/NodeTraverser/RectorNodeTraverser.php @@ -19,12 +19,19 @@ use Webmozart\Assert\Assert; /** + * Based on native NodeTraverser class, but heavily customized for Rector needs. + * + * The main differences are: + * - no leaveNode(), as we do all in enterNode() that calls refactor() method + * - cached visitors per node class for performance, e.g. when we find rules for Class_ node, they're cached for next time + * - immutability features, register Rector rules once, then use; no changes on the fly + * * @see \Rector\Tests\PhpParser\NodeTraverser\RectorNodeTraverserTest */ final class RectorNodeTraverser implements NodeTraverserInterface { /** - * @var list + * @var RectorInterface[] */ private array $visitors = []; @@ -33,7 +40,7 @@ final class RectorNodeTraverser implements NodeTraverserInterface private bool $areNodeVisitorsPrepared = false; /** - * @var array, NodeVisitor[]> + * @var array, RectorInterface[]> */ private array $visitorsPerNodeClass = []; @@ -103,7 +110,9 @@ public function refreshPhpRectors(array $rectors): void } /** - * @return NodeVisitor[] + * @return RectorInterface[] + * + * @api used in tests */ public function getVisitorsForNode(Node $node): array { From b77cc04a9bf89e3b6719addc2f12a3a9c8441731 Mon Sep 17 00:00:00 2001 From: Tomas Votruba Date: Wed, 14 Jan 2026 17:35:31 +0100 Subject: [PATCH 2/3] sort --- src/PhpParser/NodeTraverser/RectorNodeTraverser.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/PhpParser/NodeTraverser/RectorNodeTraverser.php b/src/PhpParser/NodeTraverser/RectorNodeTraverser.php index 9ccb1331186..68a3bf1af77 100644 --- a/src/PhpParser/NodeTraverser/RectorNodeTraverser.php +++ b/src/PhpParser/NodeTraverser/RectorNodeTraverser.php @@ -48,9 +48,9 @@ final class RectorNodeTraverser implements NodeTraverserInterface * @param RectorInterface[] $rectors */ public function __construct( + private array $rectors, private readonly PhpVersionedFilter $phpVersionedFilter, private readonly ConfigurationRuleFilter $configurationRuleFilter, - private array $rectors ) { } From c6987b58deebeda2d369242e69a9feb705e4bc40 Mon Sep 17 00:00:00 2001 From: Tomas Votruba Date: Wed, 14 Jan 2026 17:36:01 +0100 Subject: [PATCH 3/3] internal note --- src/PhpParser/NodeTraverser/RectorNodeTraverser.php | 1 + 1 file changed, 1 insertion(+) diff --git a/src/PhpParser/NodeTraverser/RectorNodeTraverser.php b/src/PhpParser/NodeTraverser/RectorNodeTraverser.php index 68a3bf1af77..79436baea39 100644 --- a/src/PhpParser/NodeTraverser/RectorNodeTraverser.php +++ b/src/PhpParser/NodeTraverser/RectorNodeTraverser.php @@ -27,6 +27,7 @@ * - immutability features, register Rector rules once, then use; no changes on the fly * * @see \Rector\Tests\PhpParser\NodeTraverser\RectorNodeTraverserTest + * @internal No BC promise on this class, it might change any time. */ final class RectorNodeTraverser implements NodeTraverserInterface {