src/Psalm/Internal/Traverser/CustomTraverser.php
protected function traverseNode(Node $node) : Node
    {
        foreach ($node->getSubNodeNames() as $name) {
            $subNode =& $node->$name;

            if (\is_array($subNode)) {
                $subNode = $this->traverseArray($subNode);
                if ($this->stopTraversal) {
                    break;
                }
            } elseif ($subNode instanceof Node) {
                $traverseChildren = true;
                foreach ($this->visitors as $visitor) {
                    $return = $visitor->enterNode($subNode, $traverseChildren);
                    if (null !== $return) {
                        if ($return instanceof Node) {
                            $subNode = $return;
                        } elseif (self::DONT_TRAVERSE_CHILDREN === $return) {
                            $traverseChildren = false;
                        } elseif (self::STOP_TRAVERSAL === $return) {
                            $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 $visitor) {
                    $return = $visitor->leaveNode($subNode);
                    if (null !== $return) {
                        if ($return instanceof Node) {
                            $subNode = $return;
                        } elseif (self::STOP_TRAVERSAL === $return) {
                            $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)
                            );
                        }
                    }
                }
            }
        }

        return $node;
    }
protected function traverseNode(Node $node) : Node
    {
        foreach ($node->getSubNodeNames() as $name) {
            $subNode =& $node->$name;

            if (\is_array($subNode)) {
                $subNode = $this->traverseArray($subNode);
                if ($this->stopTraversal) {
                    break;
                }
            } elseif ($subNode instanceof Node) {
                $traverseChildren = true;
                foreach ($this->visitors as $visitor) {
                    $return = $visitor->enterNode($subNode, $traverseChildren);
                    if (null !== $return) {
                        if ($return instanceof Node) {
                            $subNode = $return;
                        } elseif (self::DONT_TRAVERSE_CHILDREN === $return) {
                            $traverseChildren = false;
                        } elseif (self::STOP_TRAVERSAL === $return) {
                            $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 $visitor) {
                    $return = $visitor->leaveNode($subNode);
                    if (null !== $return) {
                        if ($return instanceof Node) {
                            $subNode = $return;
                        } elseif (self::STOP_TRAVERSAL === $return) {
                            $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)
                            );
                        }
                    }
                }
            }
        }

        return $node;
    }
protected function traverseNode ( Node $ node ) : Node { foreach ( $ node -> getSubNodeNames ( ) as $ name ) { $ subNode = & $ node -> $ name ; if ( \ is_array ( $ subNode ) ) { $ subNode = $ this -> traverseArray ( $ subNode ) ; if ( $ this -> stopTraversal ) { break ; } } elseif ( $ subNode instanceof Node ) { $ traverseChildren = true ; foreach ( $ this -> visitors as $ visitor ) { $ return = $ visitor -> enterNode ( $ subNode , $ traverseChildren ) ; if ( null !== $ return ) { if ( $ return instanceof Node ) { $ subNode = $ return ; } elseif ( self :: DONT_TRAVERSE_CHILDREN === $ return ) { $ traverseChildren = false ; } elseif ( self :: STOP_TRAVERSAL === $ return ) { $ 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 $ visitor ) { $ return = $ visitor -> leaveNode ( $ subNode ) ; if ( null !== $ return ) { if ( $ return instanceof Node ) { $ subNode = $ return ; } elseif ( self :: STOP_TRAVERSAL === $ return ) { $ 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 ) ) ; } } } } } return $ node ; }
Recursively traverse a node.

@param Node $node Node to traverse.

@return Node Result of traversal (may be original node or new one)
Recursively traverse a node .