/var/www/html_de/wp-content/plugins/elementor/vendor_prefixed/twig/twig/twig/src/NodeTraverser.php


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
<?php

/*
 * This file is part of Twig.
 *
 * (c) Fabien Potencier
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */
namespace ElementorDeps\Twig;

use 
ElementorDeps\Twig\Node\Node;
use 
ElementorDeps\Twig\NodeVisitor\NodeVisitorInterface;
/**
 * A node traverser.
 *
 * It visits all nodes and their children and calls the given visitor for each.
 *
 * @author Fabien Potencier <[email protected]>
 */
final class NodeTraverser
{
    private 
$env;
    private 
$visitors = [];
    
/**
     * @param NodeVisitorInterface[] $visitors
     */
    
public function __construct(Environment $env, array $visitors = [])
    {
        
$this->env $env;
        foreach (
$visitors as $visitor) {
            
$this->addVisitor($visitor);
        }
    }
    public function 
addVisitor(NodeVisitorInterface $visitor) : void
    
{
        
$this->visitors[$visitor->getPriority()][] = $visitor;
    }
    
/**
     * Traverses a node and calls the registered visitors.
     */
    
public function traverse(Node $node) : Node
    
{
        
\ksort($this->visitors);
        foreach (
$this->visitors as $visitors) {
            foreach (
$visitors as $visitor) {
                
$node $this->traverseForVisitor($visitor$node);
            }
        }
        return 
$node;
    }
    private function 
traverseForVisitor(NodeVisitorInterface $visitorNode $node) : ?Node
    
{
        
$node $visitor->enterNode($node$this->env);
        foreach (
$node as $k => $n) {
            if (
null !== ($m $this->traverseForVisitor($visitor$n))) {
                if (
$m !== $n) {
                    
$node->setNode($k$m);
                }
            } else {
                
$node->removeNode($k);
            }
        }
        return 
$visitor->leaveNode($node$this->env);
    }
}