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