-
Notifications
You must be signed in to change notification settings - Fork 259
/
NodeTraverser.php
84 lines (67 loc) · 2.34 KB
/
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
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
<?php
/*
* (c) Jean-François Lépine <https://twitter.com/Halleck45>
*
* For the full copyright and license information, please view the LICENSE
* file that was distributed with this source code.
*/
namespace Hal\Component\Ast;
use PhpParser\Node;
use PhpParser\NodeTraverser as Mother;
/**
* Custom Ast Traverser
*
* @author Jean-François Lépine <https://twitter.com/Halleck45>
*/
class NodeTraverser extends Mother
{
protected $stopCondition;
public function __construct($cloneNodes = false, $stopCondition = null)
{
parent::__construct($cloneNodes);
$this->stopCondition = $stopCondition;
}
protected function traverseArray(array $nodes) {
$doNodes = array();
foreach ($nodes as $i => &$node) {
if (is_array($node)) {
$node = $this->traverseArray($node);
} elseif ($node instanceof Node) {
$traverseChildren = true;
// custom stop condition
if($node instanceof Node\Stmt\Class_ || $node instanceof Node\Stmt\Interface_) {
$traverseChildren = false;
}
foreach ($this->visitors as $visitor) {
$return = $visitor->enterNode($node);
if (self::DONT_TRAVERSE_CHILDREN === $return) {
$traverseChildren = false;
} else if (null !== $return) {
$node = $return;
}
}
if ($traverseChildren) {
$node = $this->traverseNode($node);
}
foreach ($this->visitors as $visitor) {
$return = $visitor->leaveNode($node);
if (self::REMOVE_NODE === $return) {
$doNodes[] = array($i, array());
break;
} elseif (is_array($return)) {
$doNodes[] = array($i, $return);
break;
} elseif (null !== $return) {
$node = $return;
}
}
}
}
if (!empty($doNodes)) {
while (list($i, $replace) = array_pop($doNodes)) {
array_splice($nodes, $i, 1, $replace);
}
}
return $nodes;
}
}