Skip to main content
Drupal API
User account menu
  • Log in

Breadcrumb

  1. Drupal Core 11.1.x
  2. NodeTraverser.php

function NodeTraverser::traverseNode

Same name in this branch
  1. 11.1.x vendor/nikic/php-parser/lib/PhpParser/NodeTraverser.php \PhpParser\NodeTraverser::traverseNode()

* Recursively traverse a node. * *

Parameters

Node $node Node to traverse.: * * @return Node Result of traversal (may be original node or new one)

1 call to NodeTraverser::traverseNode()
NodeTraverser::traverseArray in vendor/phpstan/phpdoc-parser/src/Ast/NodeTraverser.php
* Recursively traverse array (usually of nodes). * *

File

vendor/phpstan/phpdoc-parser/src/Ast/NodeTraverser.php, line 119

Class

NodeTraverser
Inspired by https://github.com/nikic/PHP-Parser/tree/36a6dcd04e7b0285e8f0868f44bd49…

Namespace

PHPStan\PhpDocParser\Ast

Code

private function traverseNode(Node $node) : Node {
    $subNodeNames = array_keys(get_object_vars($node));
    foreach ($subNodeNames as $name) {
        $subNode =& $node->{$name};
        if (is_array($subNode)) {
            $subNode = $this->traverseArray($subNode);
            if ($this->stopTraversal) {
                break;
            }
        }
        elseif ($subNode instanceof Node) {
            $traverseChildren = true;
            $breakVisitorIndex = null;
            foreach ($this->visitors as $visitorIndex => $visitor) {
                $return = $visitor->enterNode($subNode);
                if ($return === null) {
                    continue;
                }
                if ($return instanceof Node) {
                    $this->ensureReplacementReasonable($subNode, $return);
                    $subNode = $return;
                }
                elseif ($return === self::DONT_TRAVERSE_CHILDREN) {
                    $traverseChildren = false;
                }
                elseif ($return === self::DONT_TRAVERSE_CURRENT_AND_CHILDREN) {
                    $traverseChildren = false;
                    $breakVisitorIndex = $visitorIndex;
                    break;
                }
                elseif ($return === self::STOP_TRAVERSAL) {
                    $this->stopTraversal = true;
                    break 2;
                }
                else {
                    throw new LogicException('enterNode() returned invalid value of type ' . gettype($return));
                }
            }
            if ($traverseChildren) {
                $subNode = $this->traverseNode($subNode);
                if ($this->stopTraversal) {
                    break;
                }
            }
            foreach ($this->visitors as $visitorIndex => $visitor) {
                $return = $visitor->leaveNode($subNode);
                if ($return !== null) {
                    if ($return instanceof Node) {
                        $this->ensureReplacementReasonable($subNode, $return);
                        $subNode = $return;
                    }
                    elseif ($return === self::STOP_TRAVERSAL) {
                        $this->stopTraversal = true;
                        break 2;
                    }
                    elseif (is_array($return)) {
                        throw new LogicException('leaveNode() may only return an array ' . 'if the parent structure is an array');
                    }
                    else {
                        throw new LogicException('leaveNode() returned invalid value of type ' . gettype($return));
                    }
                }
                if ($breakVisitorIndex === $visitorIndex) {
                    break;
                }
            }
        }
    }
    return $node;
}
RSS feed
Powered by Drupal