1: <?php declare(strict_types=1);
2:
3: namespace PhpParser\NodeVisitor;
4:
5: use PhpParser\Node;
6: use PhpParser\NodeVisitorAbstract;
7:
8: use function array_pop;
9: use function count;
10:
11: /**
12: * Visitor that connects a child node to its parent node.
13: *
14: * On the child node, the parent node can be accessed through
15: * <code>$node->getAttribute('parent')</code>.
16: */
17: final class ParentConnectingVisitor extends NodeVisitorAbstract {
18: /**
19: * @var Node[]
20: */
21: private array $stack = [];
22:
23: public function beforeTraverse(array $nodes) {
24: $this->stack = [];
25: }
26:
27: public function enterNode(Node $node) {
28: if (!empty($this->stack)) {
29: $node->setAttribute('parent', $this->stack[count($this->stack) - 1]);
30: }
31:
32: $this->stack[] = $node;
33: }
34:
35: public function leaveNode(Node $node) {
36: array_pop($this->stack);
37: }
38: }
39: