mirror of
https://github.com/rectorphp/rector.git
synced 2024-05-30 07:50:53 +00:00
2518d99664
84a48e5e10
[tests] Use file paths over value objects in tests to improve performance (#2878)
68 lines
2.8 KiB
PHP
68 lines
2.8 KiB
PHP
<?php
|
|
|
|
declare (strict_types=1);
|
|
namespace Rector\Core\Application;
|
|
|
|
use Rector\ChangesReporting\Collector\AffectedFilesCollector;
|
|
use Rector\Core\PhpParser\NodeTraverser\FileWithoutNamespaceNodeTraverser;
|
|
use Rector\Core\PhpParser\NodeTraverser\RectorNodeTraverser;
|
|
use Rector\Core\PhpParser\Parser\RectorParser;
|
|
use Rector\Core\ValueObject\Application\File;
|
|
use Rector\Core\ValueObject\Configuration;
|
|
use Rector\NodeTypeResolver\NodeScopeAndMetadataDecorator;
|
|
final class FileProcessor
|
|
{
|
|
/**
|
|
* @readonly
|
|
* @var \Rector\ChangesReporting\Collector\AffectedFilesCollector
|
|
*/
|
|
private $affectedFilesCollector;
|
|
/**
|
|
* @readonly
|
|
* @var \Rector\NodeTypeResolver\NodeScopeAndMetadataDecorator
|
|
*/
|
|
private $nodeScopeAndMetadataDecorator;
|
|
/**
|
|
* @readonly
|
|
* @var \Rector\Core\PhpParser\Parser\RectorParser
|
|
*/
|
|
private $rectorParser;
|
|
/**
|
|
* @readonly
|
|
* @var \Rector\Core\PhpParser\NodeTraverser\RectorNodeTraverser
|
|
*/
|
|
private $rectorNodeTraverser;
|
|
/**
|
|
* @readonly
|
|
* @var \Rector\Core\PhpParser\NodeTraverser\FileWithoutNamespaceNodeTraverser
|
|
*/
|
|
private $fileWithoutNamespaceNodeTraverser;
|
|
public function __construct(AffectedFilesCollector $affectedFilesCollector, NodeScopeAndMetadataDecorator $nodeScopeAndMetadataDecorator, RectorParser $rectorParser, RectorNodeTraverser $rectorNodeTraverser, FileWithoutNamespaceNodeTraverser $fileWithoutNamespaceNodeTraverser)
|
|
{
|
|
$this->affectedFilesCollector = $affectedFilesCollector;
|
|
$this->nodeScopeAndMetadataDecorator = $nodeScopeAndMetadataDecorator;
|
|
$this->rectorParser = $rectorParser;
|
|
$this->rectorNodeTraverser = $rectorNodeTraverser;
|
|
$this->fileWithoutNamespaceNodeTraverser = $fileWithoutNamespaceNodeTraverser;
|
|
}
|
|
public function parseFileInfoToLocalCache(File $file) : void
|
|
{
|
|
// store tokens by absolute path, so we don't have to print them right now
|
|
$stmtsAndTokens = $this->rectorParser->parseFileToStmtsAndTokens($file->getFilePath());
|
|
$oldStmts = $stmtsAndTokens->getStmts();
|
|
$oldTokens = $stmtsAndTokens->getTokens();
|
|
$newStmts = $this->nodeScopeAndMetadataDecorator->decorateNodesFromFile($file, $oldStmts);
|
|
$file->hydrateStmtsAndTokens($newStmts, $oldStmts, $oldTokens);
|
|
}
|
|
public function refactor(File $file, Configuration $configuration) : void
|
|
{
|
|
$newStmts = $this->fileWithoutNamespaceNodeTraverser->traverse($file->getNewStmts());
|
|
$newStmts = $this->rectorNodeTraverser->traverse($newStmts);
|
|
$file->changeNewStmts($newStmts);
|
|
$this->affectedFilesCollector->removeFromList($file);
|
|
while ($otherTouchedFile = $this->affectedFilesCollector->getNext()) {
|
|
$this->refactor($otherTouchedFile, $configuration);
|
|
}
|
|
}
|
|
}
|