Skip to content

Instantly share code, notes, and snippets.

@covex-nn
Last active March 26, 2018 06:12
Show Gist options
  • Save covex-nn/5a42c98402cb95f4125cae4ac2531c31 to your computer and use it in GitHub Desktop.
Save covex-nn/5a42c98402cb95f4125cae4ac2531c31 to your computer and use it in GitHub Desktop.
<?php
private function traverseForVisitor(Twig_NodeVisitorInterface $visitor, Twig_Node $node)
{
$node = $visitor->enterNode($node, $this->env);
$level = 0;
/** @var Twig_Node[] $parents */
$parents = [$node];
$iterator = $node->getIterator();
/** @var ArrayIterator[] $stack */
$stack = [$iterator];
while_true:
if ($iterator->valid()) {
$current = $visitor->enterNode($iterator->current(), $this->env);
$level++;
$parents[$level] = $current;
$stack[$level] = $iterator = $current->getIterator();
goto while_true;
} elseif ($level > 0) {
$level--;
$iterator = $stack[$level];
if (false !== $current = $visitor->leaveNode($iterator->current(), $this->env)) {
$parents[$level]->setNode($iterator->key(), $current);
} else {
$parents[$level]->removeNode($iterator->key());
}
$iterator->next();
goto while_true;
}
return $visitor->leaveNode($node, $this->env);
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment