Skip to content

Commit

Permalink
Allow passing visitors to NodeTraverser constructor
Browse files Browse the repository at this point in the history
  • Loading branch information
nikic committed Jul 9, 2023
1 parent 8b13719 commit c48ee36
Show file tree
Hide file tree
Showing 9 changed files with 29 additions and 24 deletions.
6 changes: 2 additions & 4 deletions doc/component/FAQ.markdown
Original file line number Diff line number Diff line change
Expand Up @@ -16,8 +16,7 @@ use PhpParser\ParserFactory;

$code = '...';

$traverser = new NodeTraverser;
$traverser->addVisitor(new ParentConnectingVisitor);
$traverser = new NodeTraverser(new ParentConnectingVisitor);

$parser = (new ParserFactory())->createForHostVersion();
$ast = $parser->parse($code);
Expand All @@ -39,8 +38,7 @@ use PhpParser\ParserFactory;

$code = '...';

$traverser = new NodeTraverser;
$traverser->addVisitor(new NodeConnectingVisitor);
$traverser = new NodeTraverser(new NodeConnectingVisitor);

$parser = (new ParserFactory())->createForHostVersion();
$ast = $parser->parse($code);
Expand Down
3 changes: 1 addition & 2 deletions doc/component/Lexer.markdown
Original file line number Diff line number Diff line change
Expand Up @@ -81,8 +81,7 @@ $lexerOptions = array(
$parser = (new PhpParser\ParserFactory())->createForHostVersion($lexerOptions);

$visitor = new MyNodeVisitor();
$traverser = new PhpParser\NodeTraverser();
$traverser->addVisitor($visitor);
$traverser = new PhpParser\NodeTraverser($visitor);

try {
$stmts = $parser->parse($code);
Expand Down
3 changes: 1 addition & 2 deletions doc/component/Pretty_printing.markdown
Original file line number Diff line number Diff line change
Expand Up @@ -75,8 +75,7 @@ $lexerOptions = new [
];
$parser = (new ParserFactory())->createForHostVersion($lexerOptions);

$traverser = new NodeTraverser();
$traverser->addVisitor(new NodeVisitor\CloningVisitor());
$traverser = new NodeTraverser(new NodeVisitor\CloningVisitor());

$printer = new PrettyPrinter\Standard();

Expand Down
12 changes: 12 additions & 0 deletions doc/component/Walking_the_AST.markdown
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,18 @@ $stmts = ...;
$modifiedStmts = $traverser->traverse($stmts);
```

Visitors can be either passed to the `NodeTraverser` constructor, or added using `addVisitor()`:

```php
$traverser = new NodeTraverser($visitor1, $visitor2, $visitor3);

// Equivalent to:
$traverser = new NodeTraverser();
$traverser->addVisitor($visitor1);
$traverser->addVisitor($visitor2);
$traverser->addVisitor($visitor3);
```

Node visitors
-------------

Expand Down
6 changes: 2 additions & 4 deletions lib/PhpParser/NodeFinder.php
Original file line number Diff line number Diff line change
Expand Up @@ -21,8 +21,7 @@ public function find($nodes, callable $filter): array {

$visitor = new FindingVisitor($filter);

$traverser = new NodeTraverser();
$traverser->addVisitor($visitor);
$traverser = new NodeTraverser($visitor);
$traverser->traverse($nodes);

return $visitor->getFoundNodes();
Expand Down Expand Up @@ -59,8 +58,7 @@ public function findFirst($nodes, callable $filter): ?Node {

$visitor = new FirstFindingVisitor($filter);

$traverser = new NodeTraverser();
$traverser->addVisitor($visitor);
$traverser = new NodeTraverser($visitor);
$traverser->traverse($nodes);

return $visitor->getFoundNode();
Expand Down
9 changes: 7 additions & 2 deletions lib/PhpParser/NodeTraverser.php
Original file line number Diff line number Diff line change
Expand Up @@ -29,8 +29,13 @@ class NodeTraverser implements NodeTraverserInterface {
/** @var bool Whether traversal should be stopped */
protected $stopTraversal;

public function __construct() {
// for BC
/**
* Create a traverser with the given visitors.
*
* @param NodeVisitor ...$visitors Node visitors
*/
public function __construct(NodeVisitor... $visitors) {
$this->visitors = $visitors;
}

/**
Expand Down
3 changes: 1 addition & 2 deletions test/PhpParser/CodeParsingTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -69,8 +69,7 @@ private function checkAttributes($stmts) {
return;
}

$traverser = new NodeTraverser();
$traverser->addVisitor(new class () extends NodeVisitorAbstract {
$traverser = new NodeTraverser(new class () extends NodeVisitorAbstract {
public function enterNode(Node $node) {
$startLine = $node->getStartLine();
$endLine = $node->getEndLine();
Expand Down
5 changes: 1 addition & 4 deletions test/PhpParser/NodeTraverserTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -49,10 +49,7 @@ public function testModifying() {
]);
$visitor3 = new NodeVisitorForTesting();

$traverser = new NodeTraverser();
$traverser->addVisitor($visitor1);
$traverser->addVisitor($visitor2);
$traverser->addVisitor($visitor3);
$traverser = new NodeTraverser($visitor1, $visitor2, $visitor3);

// as all operations are reversed we end where we start
$this->assertEquals([], $traverser->traverse([]));
Expand Down
6 changes: 2 additions & 4 deletions test/PhpParser/PrettyPrinterTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -193,8 +193,7 @@ public function testFormatPreservingPrint($name, $code, $modification, $expected
]);

$parser = new Parser\Php7($lexer);
$traverser = new NodeTraverser();
$traverser->addVisitor(new NodeVisitor\CloningVisitor());
$traverser = new NodeTraverser(new NodeVisitor\CloningVisitor());

$printer = new PrettyPrinter\Standard();

Expand Down Expand Up @@ -244,8 +243,7 @@ public function testRoundTripPrint($name, $code, $expected, $modeLine) {

$parser = new Php7($lexer);

$traverser = new NodeTraverser();
$traverser->addVisitor(new NodeVisitor\CloningVisitor());
$traverser = new NodeTraverser(new NodeVisitor\CloningVisitor());

$printer = new PrettyPrinter\Standard();

Expand Down

0 comments on commit c48ee36

Please sign in to comment.