X-Git-Url: http://www.aleph1.co.uk/gitweb/?p=yaffs-website;a=blobdiff_plain;f=vendor%2Fnikic%2Fphp-parser%2Flib%2FPhpParser%2FNodeTraverser.php;fp=vendor%2Fnikic%2Fphp-parser%2Flib%2FPhpParser%2FNodeTraverser.php;h=97d45bdaaa7c95ba7ecdae9580a83e3239732bd1;hp=fe3045aebcf45998783fbe96d15c7ea770d6e85e;hb=0bf8d09d2542548982e81a441b1f16e75873a04f;hpb=74df008bdbb3a11eeea356744f39b802369bda3c diff --git a/vendor/nikic/php-parser/lib/PhpParser/NodeTraverser.php b/vendor/nikic/php-parser/lib/PhpParser/NodeTraverser.php index fe3045aeb..97d45bdaa 100644 --- a/vendor/nikic/php-parser/lib/PhpParser/NodeTraverser.php +++ b/vendor/nikic/php-parser/lib/PhpParser/NodeTraverser.php @@ -30,17 +30,23 @@ class NodeTraverser implements NodeTraverserInterface */ const REMOVE_NODE = 3; + /** + * If NodeVisitor::enterNode() returns DONT_TRAVERSE_CURRENT_AND_CHILDREN, child nodes + * of the current node will not be traversed for any visitors. + * + * For subsequent visitors enterNode() will not be called as well. + * leaveNode() will be invoked for visitors that has enterNode() method invoked. + */ + const DONT_TRAVERSE_CURRENT_AND_CHILDREN = 4; + /** @var NodeVisitor[] Visitors */ - protected $visitors; + protected $visitors = []; /** @var bool Whether traversal should be stopped */ protected $stopTraversal; - /** - * Constructs a node traverser. - */ public function __construct() { - $this->visitors = []; + // for BC } /** @@ -111,7 +117,9 @@ class NodeTraverser implements NodeTraverserInterface } } elseif ($subNode instanceof Node) { $traverseChildren = true; - foreach ($this->visitors as $visitor) { + $breakVisitorIndex = null; + + foreach ($this->visitors as $visitorIndex => $visitor) { $return = $visitor->enterNode($subNode); if (null !== $return) { if ($return instanceof Node) { @@ -119,6 +127,10 @@ class NodeTraverser implements NodeTraverserInterface $subNode = $return; } elseif (self::DONT_TRAVERSE_CHILDREN === $return) { $traverseChildren = false; + } elseif (self::DONT_TRAVERSE_CURRENT_AND_CHILDREN === $return) { + $traverseChildren = false; + $breakVisitorIndex = $visitorIndex; + break; } elseif (self::STOP_TRAVERSAL === $return) { $this->stopTraversal = true; break 2; @@ -137,8 +149,9 @@ class NodeTraverser implements NodeTraverserInterface } } - foreach ($this->visitors as $visitor) { + foreach ($this->visitors as $visitorIndex => $visitor) { $return = $visitor->leaveNode($subNode); + if (null !== $return) { if ($return instanceof Node) { $this->ensureReplacementReasonable($subNode, $return); @@ -157,6 +170,10 @@ class NodeTraverser implements NodeTraverserInterface ); } } + + if ($breakVisitorIndex === $visitorIndex) { + break; + } } } } @@ -177,7 +194,9 @@ class NodeTraverser implements NodeTraverserInterface foreach ($nodes as $i => &$node) { if ($node instanceof Node) { $traverseChildren = true; - foreach ($this->visitors as $visitor) { + $breakVisitorIndex = null; + + foreach ($this->visitors as $visitorIndex => $visitor) { $return = $visitor->enterNode($node); if (null !== $return) { if ($return instanceof Node) { @@ -185,6 +204,10 @@ class NodeTraverser implements NodeTraverserInterface $node = $return; } elseif (self::DONT_TRAVERSE_CHILDREN === $return) { $traverseChildren = false; + } elseif (self::DONT_TRAVERSE_CURRENT_AND_CHILDREN === $return) { + $traverseChildren = false; + $breakVisitorIndex = $visitorIndex; + break; } elseif (self::STOP_TRAVERSAL === $return) { $this->stopTraversal = true; break 2; @@ -203,8 +226,9 @@ class NodeTraverser implements NodeTraverserInterface } } - foreach ($this->visitors as $visitor) { + foreach ($this->visitors as $visitorIndex => $visitor) { $return = $visitor->leaveNode($node); + if (null !== $return) { if ($return instanceof Node) { $this->ensureReplacementReasonable($node, $return); @@ -229,6 +253,10 @@ class NodeTraverser implements NodeTraverserInterface ); } } + + if ($breakVisitorIndex === $visitorIndex) { + break; + } } } elseif (\is_array($node)) { throw new \LogicException('Invalid node structure: Contains nested arrays');