1<?php declare(strict_types=1);
2
3namespace PhpParser\NodeVisitor;
4
5use PhpParser\Node;
6use PhpParser\NodeVisitorAbstract;
7
8use function array_pop;
9use 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 */
17final 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