add removed nodes collector (#1818)

add removed nodes collector
This commit is contained in:
Tomáš Votruba 2019-08-06 10:20:41 +02:00 committed by GitHub
commit 5400d6c5c1
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
7 changed files with 77 additions and 4 deletions

View File

@ -7,6 +7,7 @@ use Rector\Application\FileSystem\RemovedAndAddedFilesCollector;
use Rector\ConsoleDiffer\DifferAndFormatter;
use Rector\Error\ExceptionCorrector;
use Rector\Reporting\FileDiff;
use Rector\Reporting\RemovedNodesCollector;
use Symplify\PackageBuilder\FileSystem\SmartFileInfo;
use Throwable;
@ -42,16 +43,23 @@ final class ErrorAndDiffCollector
*/
private $removedAndAddedFilesCollector;
/**
* @var RemovedNodesCollector
*/
private $removedNodesCollector;
public function __construct(
DifferAndFormatter $differAndFormatter,
AppliedRectorCollector $appliedRectorCollector,
ExceptionCorrector $exceptionCorrector,
RemovedAndAddedFilesCollector $removedAndAddedFilesCollector
RemovedAndAddedFilesCollector $removedAndAddedFilesCollector,
RemovedNodesCollector $removedNodesCollector
) {
$this->differAndFormatter = $differAndFormatter;
$this->appliedRectorCollector = $appliedRectorCollector;
$this->exceptionCorrector = $exceptionCorrector;
$this->removedAndAddedFilesCollector = $removedAndAddedFilesCollector;
$this->removedNodesCollector = $removedNodesCollector;
}
public function addError(Error $error): void
@ -72,6 +80,11 @@ final class ErrorAndDiffCollector
return $this->removedAndAddedFilesCollector->getAffectedFilesCount();
}
public function getRemovedNodeCount(): int
{
return $this->removedNodesCollector->getCount();
}
public function addFileDiff(SmartFileInfo $smartFileInfo, string $newContent, string $oldContent): void
{
if ($newContent === $oldContent) {

View File

@ -29,6 +29,7 @@ final class ConsoleOutputFormatter implements OutputFormatterInterface
{
$this->reportFileDiffs($errorAndDiffCollector->getFileDiffs());
$this->reportErrors($errorAndDiffCollector->getErrors());
$this->reportRemovedFilesAndNodes($errorAndDiffCollector);
if ($errorAndDiffCollector->getErrors() !== []) {
return;
@ -100,4 +101,17 @@ final class ConsoleOutputFormatter implements OutputFormatterInterface
$this->symfonyStyle->error($message);
}
}
private function reportRemovedFilesAndNodes(ErrorAndDiffCollector $errorAndDiffCollector): void
{
if ($errorAndDiffCollector->getRemovedAndAddedFilesCount()) {
$this->symfonyStyle->note(
sprintf('%d files were added/removed', $errorAndDiffCollector->getRemovedAndAddedFilesCount())
);
}
if ($errorAndDiffCollector->getRemovedNodeCount()) {
$this->symfonyStyle->note(sprintf('%d nodes were removed', $errorAndDiffCollector->getRemovedNodeCount()));
}
}
}

View File

@ -48,6 +48,7 @@ final class JsonOutputFormatter implements OutputFormatterInterface
'totals' => [
'changed_files' => count($fileDiffs),
'removed_and_added_files_count' => $errorAndDiffCollector->getRemovedAndAddedFilesCount(),
'removed_node_count' => $errorAndDiffCollector->getRemovedNodeCount(),
],
];

View File

@ -51,7 +51,7 @@ abstract class AbstractRector extends NodeVisitorAbstract implements PhpRectorIn
/**
* @required
*/
public function setAbstractRectorDependencies(
public function autowireAbstractRectorDependencies(
SymfonyStyle $symfonyStyle,
RemovedAndAddedFilesCollector $removedAndAddedFilesCollector,
PhpVersionProvider $phpVersionProvider,

View File

@ -10,6 +10,7 @@ use Rector\PhpParser\Node\Commander\NodeAddingCommander;
use Rector\PhpParser\Node\Commander\NodeRemovingCommander;
use Rector\PhpParser\Node\Commander\PropertyAddingCommander;
use Rector\PhpParser\Node\VariableInfo;
use Rector\Reporting\RemovedNodesCollector;
/**
* This could be part of @see AbstractRector, but decopuling to trait
@ -39,19 +40,26 @@ trait NodeCommandersTrait
*/
private $useAddingCommander;
/**
* @var RemovedNodesCollector
*/
private $removedNodesCollector;
/**
* @required
*/
public function setRequiredCommanders(
public function autowireNodeCommandersTrait(
NodeRemovingCommander $nodeRemovingCommander,
NodeAddingCommander $nodeAddingCommander,
PropertyAddingCommander $propertyAddingCommander,
UseAddingCommander $useAddingCommander
UseAddingCommander $useAddingCommander,
RemovedNodesCollector $removedNodesCollector
): void {
$this->nodeRemovingCommander = $nodeRemovingCommander;
$this->nodeAddingCommander = $nodeAddingCommander;
$this->propertyAddingCommander = $propertyAddingCommander;
$this->useAddingCommander = $useAddingCommander;
$this->removedNodesCollector = $removedNodesCollector;
}
protected function addNodeAfterNode(Node $newNode, Node $positionNode): void
@ -81,6 +89,8 @@ trait NodeCommandersTrait
$this->nodeRemovingCommander->addNode($node);
$this->notifyNodeChangeFileInfo($node);
$this->removedNodesCollector->collect($node);
}
protected function isNodeRemoved(Node $node): bool

View File

@ -0,0 +1,23 @@
<?php declare(strict_types=1);
namespace Rector\Reporting;
use PhpParser\Node;
final class RemovedNodesCollector
{
/**
* @var Node[]
*/
private $removedNodes = [];
public function collect(Node $node): void
{
$this->removedNodes[] = $node;
}
public function getCount(): int
{
return count($this->removedNodes);
}
}

View File

@ -3,6 +3,7 @@
namespace Rector\Testing\PHPUnit;
use Nette\Utils\FileSystem;
use PHPStan\Analyser\NodeScopeResolver;
use Psr\Container\ContainerInterface;
use Rector\Application\FileProcessor;
use Rector\Configuration\Option;
@ -45,6 +46,11 @@ abstract class AbstractRectorTestCase extends AbstractKernelTestCase
*/
private static $allRectorContainer;
/**
* @var NodeScopeResolver
*/
private $nodeScopeResolver;
protected function setUp(): void
{
$this->fixtureSplitter = new FixtureSplitter($this->getTempPath());
@ -79,6 +85,9 @@ abstract class AbstractRectorTestCase extends AbstractKernelTestCase
$this->fileProcessor = static::$container->get(FileProcessor::class);
$this->parameterProvider = static::$container->get(ParameterProvider::class);
// needed for PHPStan, because the analyzed file is just create in /temp
$this->nodeScopeResolver = static::$container->get(NodeScopeResolver::class);
}
/**
@ -123,6 +132,9 @@ abstract class AbstractRectorTestCase extends AbstractKernelTestCase
$smartFileInfo,
$this->autoloadTestFixture
);
$this->nodeScopeResolver->setAnalysedFiles([$originalFile]);
$this->doTestFileMatchesExpectedContent($originalFile, $changedFile, $smartFileInfo->getRealPath());
}