StandaloneTraverseNodeTraverser: create NodeTraversers just once

This commit is contained in:
TomasVotruba 2017-12-20 02:55:19 +01:00
parent ed5baf3d6e
commit 684b1b933d

View File

@ -3,6 +3,8 @@
namespace Rector\NodeTraverser; namespace Rector\NodeTraverser;
use PhpParser\Node; use PhpParser\Node;
use PhpParser\NodeTraverser;
use PhpParser\NodeTraverserInterface;
use PhpParser\NodeVisitor; use PhpParser\NodeVisitor;
/** /**
@ -21,6 +23,11 @@ final class StandaloneTraverseNodeTraverser
*/ */
private $nodeTraverserFactory; private $nodeTraverserFactory;
/**
* @var NodeTraverserInterface[]
*/
private $nodeTraversers;
public function __construct(NodeTraverserFactory $nodeTraverserFactory) public function __construct(NodeTraverserFactory $nodeTraverserFactory)
{ {
$this->nodeTraverserFactory = $nodeTraverserFactory; $this->nodeTraverserFactory = $nodeTraverserFactory;
@ -37,11 +44,26 @@ final class StandaloneTraverseNodeTraverser
*/ */
public function traverse(array $nodes): array public function traverse(array $nodes): array
{ {
foreach ($this->nodeVisitors as $nodeVisitor) { foreach ($this->getNodeTraversers() as $nodeTraverser) {
$nodeTraverser = $this->nodeTraverserFactory->createWithNodeVisitor($nodeVisitor);
$nodes = $nodeTraverser->traverse($nodes); $nodes = $nodeTraverser->traverse($nodes);
} }
return $nodes; return $nodes;
} }
/**
* @return NodeTraverserInterface[]
*/
private function getNodeTraversers(): array
{
if ($this->nodeTraversers) {
return $this->nodeTraversers;
}
foreach ($this->nodeVisitors as $nodeVisitor) {
$this->nodeTraversers[] = $this->nodeTraverserFactory->createWithNodeVisitor($nodeVisitor);
}
return $this->nodeTraversers;
}
} }