diff --git a/CHANGELOG b/CHANGELOG index 58f391701..85ffbe366 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -1,6 +1,6 @@ * 1.40.1 (2019-XX-XX) -* n/a +* fixed regression in NodeTraverser * 1.40.0 (2019-04-28) diff --git a/src/NodeTraverser.php b/src/NodeTraverser.php index 6697f9200..bd25d3cc7 100644 --- a/src/NodeTraverser.php +++ b/src/NodeTraverser.php @@ -69,6 +69,10 @@ class NodeTraverser $node = $visitor->enterNode($node, $this->env); foreach ($node as $k => $n) { + if (null === $n) { + continue; + } + if (false !== ($m = $this->traverseForVisitor($visitor, $n)) && null !== $m) { if ($m !== $n) { $node->setNode($k, $m); diff --git a/test/Twig/Tests/NodeTraverserTest.php b/test/Twig/Tests/NodeTraverserTest.php new file mode 100644 index 000000000..19a3a1f24 --- /dev/null +++ b/test/Twig/Tests/NodeTraverserTest.php @@ -0,0 +1,47 @@ +getMockBuilder('\Twig\Loader\LoaderInterface')->getMock()); + $traverser = new NodeTraverser($env, [new IdentityVisitor()]); + $n = new Node([new Node([]), null, new Node([])]); + $this->assertCount(3, $traverser->traverse($n)); + } +} + +class IdentityVisitor implements NodeVisitorInterface +{ + public function enterNode(\Twig_NodeInterface $node, Environment $env) + { + return $node; + } + + public function leaveNode(\Twig_NodeInterface $node, Environment $env) + { + return $node; + } + + public function getPriority() + { + return 0; + } +}