Chris@13
|
1 <?php declare(strict_types=1);
|
Chris@13
|
2
|
Chris@13
|
3 namespace PhpParser;
|
Chris@13
|
4
|
Chris@13
|
5 use PhpParser\NodeVisitor\FindingVisitor;
|
Chris@13
|
6 use PhpParser\NodeVisitor\FirstFindingVisitor;
|
Chris@13
|
7
|
Chris@13
|
8 class NodeFinder
|
Chris@13
|
9 {
|
Chris@13
|
10 /**
|
Chris@13
|
11 * Find all nodes satisfying a filter callback.
|
Chris@13
|
12 *
|
Chris@13
|
13 * @param Node|Node[] $nodes Single node or array of nodes to search in
|
Chris@13
|
14 * @param callable $filter Filter callback: function(Node $node) : bool
|
Chris@13
|
15 *
|
Chris@13
|
16 * @return Node[] Found nodes satisfying the filter callback
|
Chris@13
|
17 */
|
Chris@13
|
18 public function find($nodes, callable $filter) : array {
|
Chris@13
|
19 if (!is_array($nodes)) {
|
Chris@13
|
20 $nodes = [$nodes];
|
Chris@13
|
21 }
|
Chris@13
|
22
|
Chris@13
|
23 $visitor = new FindingVisitor($filter);
|
Chris@13
|
24
|
Chris@13
|
25 $traverser = new NodeTraverser;
|
Chris@13
|
26 $traverser->addVisitor($visitor);
|
Chris@13
|
27 $traverser->traverse($nodes);
|
Chris@13
|
28
|
Chris@13
|
29 return $visitor->getFoundNodes();
|
Chris@13
|
30 }
|
Chris@13
|
31
|
Chris@13
|
32 /**
|
Chris@13
|
33 * Find all nodes that are instances of a certain class.
|
Chris@13
|
34 *
|
Chris@13
|
35 * @param Node|Node[] $nodes Single node or array of nodes to search in
|
Chris@13
|
36 * @param string $class Class name
|
Chris@13
|
37 *
|
Chris@13
|
38 * @return Node[] Found nodes (all instances of $class)
|
Chris@13
|
39 */
|
Chris@13
|
40 public function findInstanceOf($nodes, string $class) : array {
|
Chris@13
|
41 return $this->find($nodes, function ($node) use ($class) {
|
Chris@13
|
42 return $node instanceof $class;
|
Chris@13
|
43 });
|
Chris@13
|
44 }
|
Chris@13
|
45
|
Chris@13
|
46 /**
|
Chris@13
|
47 * Find first node satisfying a filter callback.
|
Chris@13
|
48 *
|
Chris@13
|
49 * @param Node|Node[] $nodes Single node or array of nodes to search in
|
Chris@13
|
50 * @param callable $filter Filter callback: function(Node $node) : bool
|
Chris@13
|
51 *
|
Chris@13
|
52 * @return null|Node Found node (or null if none found)
|
Chris@13
|
53 */
|
Chris@13
|
54 public function findFirst($nodes, callable $filter) {
|
Chris@13
|
55 if (!is_array($nodes)) {
|
Chris@13
|
56 $nodes = [$nodes];
|
Chris@13
|
57 }
|
Chris@13
|
58
|
Chris@13
|
59 $visitor = new FirstFindingVisitor($filter);
|
Chris@13
|
60
|
Chris@13
|
61 $traverser = new NodeTraverser;
|
Chris@13
|
62 $traverser->addVisitor($visitor);
|
Chris@13
|
63 $traverser->traverse($nodes);
|
Chris@13
|
64
|
Chris@13
|
65 return $visitor->getFoundNode();
|
Chris@13
|
66 }
|
Chris@13
|
67
|
Chris@13
|
68 /**
|
Chris@13
|
69 * Find first node that is an instance of a certain class.
|
Chris@13
|
70 *
|
Chris@13
|
71 * @param Node|Node[] $nodes Single node or array of nodes to search in
|
Chris@13
|
72 * @param string $class Class name
|
Chris@13
|
73 *
|
Chris@13
|
74 * @return null|Node Found node, which is an instance of $class (or null if none found)
|
Chris@13
|
75 */
|
Chris@13
|
76 public function findFirstInstanceOf($nodes, string $class) {
|
Chris@13
|
77 return $this->findFirst($nodes, function ($node) use ($class) {
|
Chris@13
|
78 return $node instanceof $class;
|
Chris@13
|
79 });
|
Chris@13
|
80 }
|
Chris@13
|
81 }
|