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