function NodeTraverser::traverseNode
Same name in this branch
- 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
Namespace
PHPStan\PhpDocParser\AstCode
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;
}