move diffs to ErrorCollector

This commit is contained in:
Tomas Votruba 2018-12-08 12:59:24 +01:00
parent 4dddf13432
commit 284f732ac8
6 changed files with 123 additions and 114 deletions

View File

@ -7,7 +7,7 @@ use PhpParser\Node;
use PhpParser\Node\Stmt\Class_;
use PhpParser\Node\Stmt\Property;
use PHPStan\PhpDocParser\Ast\PhpDoc\PhpDocTagNode;
use Rector\Application\ErrorCollector;
use Rector\Application\ErrorAndDiffCollector;
use Rector\Bridge\Contract\AnalyzedApplicationContainerInterface;
use Rector\NodeTypeResolver\Node\Attribute;
use Rector\NodeTypeResolver\PhpDoc\NodeAnalyzer\DocBlockAnalyzer;
@ -37,18 +37,18 @@ final class JmsInjectAnnotationRector extends AbstractRector
private $analyzedApplicationContainer;
/**
* @var ErrorCollector
* @var ErrorAndDiffCollector
*/
private $errorCollector;
private $errorAndDiffCollector;
public function __construct(
DocBlockAnalyzer $docBlockAnalyzer,
AnalyzedApplicationContainerInterface $analyzedApplicationContainer,
ErrorCollector $errorCollector
ErrorAndDiffCollector $errorAndDiffCollector
) {
$this->docBlockAnalyzer = $docBlockAnalyzer;
$this->analyzedApplicationContainer = $analyzedApplicationContainer;
$this->errorCollector = $errorCollector;
$this->errorAndDiffCollector = $errorAndDiffCollector;
}
public function getDefinition(): RectorDefinition
@ -137,7 +137,7 @@ CODE_SAMPLE
}
// collect error
$this->errorCollector->addErrorWithRectorMessage(
$this->errorAndDiffCollector->addErrorWithRectorMessage(
self::class,
sprintf('Service "%s" was not found in DI Container of your Symfony App.', $serviceName)
);

View File

@ -0,0 +1,86 @@
<?php declare(strict_types=1);
namespace Rector\Application;
use Rector\ConsoleDiffer\DifferAndFormatter;
use Rector\NodeTypeResolver\FileSystem\CurrentFileInfoProvider;
use Rector\Reporting\FileDiff;
use Symplify\PackageBuilder\FileSystem\SmartFileInfo;
final class ErrorAndDiffCollector
{
/**
* @var Error[]
*/
private $errors = [];
/**
* @var CurrentFileInfoProvider
*/
private $currentFileInfoProvider;
/**
* @var FileDiff[]
*/
private $fileDiffs = [];
/**
* @var DifferAndFormatter
*/
private $differAndFormatter;
/**
* @var AppliedRectorCollector
*/
private $appliedRectorCollector;
public function __construct(
CurrentFileInfoProvider $currentFileInfoProvider,
DifferAndFormatter $differAndFormatter,
AppliedRectorCollector $appliedRectorCollector
) {
$this->currentFileInfoProvider = $currentFileInfoProvider;
$this->differAndFormatter = $differAndFormatter;
$this->appliedRectorCollector = $appliedRectorCollector;
}
public function addError(Error $error): void
{
$this->errors[] = $error;
}
/**
* @return Error[]
*/
public function getErrors(): array
{
return $this->errors;
}
public function addErrorWithRectorMessage(string $rectorClass, string $message): void
{
$this->errors[] = new Error($this->currentFileInfoProvider->getSmartFileInfo(), $message, null, $rectorClass);
}
public function addFileDiff(SmartFileInfo $smartFileInfo, string $newContent, string $oldContent): void
{
if ($newContent === $oldContent) {
return;
}
// always keep the most recent diff
$this->fileDiffs[$smartFileInfo->getRealPath()] = new FileDiff(
$smartFileInfo->getRealPath(),
$this->differAndFormatter->diffAndFormat($oldContent, $newContent),
$this->appliedRectorCollector->getRectorClasses()
);
}
/**
* @return FileDiff[]
*/
public function getFileDiffs(): array
{
return $this->fileDiffs;
}
}

View File

@ -1,41 +0,0 @@
<?php declare(strict_types=1);
namespace Rector\Application;
use Rector\NodeTypeResolver\FileSystem\CurrentFileInfoProvider;
final class ErrorCollector
{
/**
* @var Error[]
*/
private $errors = [];
/**
* @var CurrentFileInfoProvider
*/
private $currentFileInfoProvider;
public function __construct(CurrentFileInfoProvider $currentFileInfoProvider)
{
$this->currentFileInfoProvider = $currentFileInfoProvider;
}
public function addError(Error $error): void
{
$this->errors[] = $error;
}
/**
* @return Error[]
*/
public function getErrors(): array
{
return $this->errors;
}
public function addErrorWithRectorMessage(string $rectorClass, string $message): void
{
$this->errors[] = new Error($this->currentFileInfoProvider->getSmartFileInfo(), $message, null, $rectorClass);
}
}

View File

@ -4,10 +4,8 @@ namespace Rector\Application;
use PHPStan\AnalysedCodeException;
use Rector\Configuration\Configuration;
use Rector\ConsoleDiffer\DifferAndFormatter;
use Rector\Error\ExceptionCorrector;
use Rector\FileSystemRector\FileSystemFileProcessor;
use Rector\Reporting\FileDiff;
use Symfony\Component\Console\Style\SymfonyStyle;
use Symplify\PackageBuilder\FileSystem\SmartFileInfo;
use Throwable;
@ -30,9 +28,9 @@ final class RectorApplication
private $exceptionCorrector;
/**
* @var ErrorCollector
* @var ErrorAndDiffCollector
*/
private $errorCollector;
private $errorAndDiffCollector;
/**
* @var Configuration
@ -49,41 +47,22 @@ final class RectorApplication
*/
private $filesToReprintCollector;
/**
* @var FileDiff[]
*/
private $fileDiffs = [];
/**
* @var DifferAndFormatter
*/
private $differAndFormatter;
/**
* @var AppliedRectorCollector
*/
private $appliedRectorCollector;
public function __construct(
SymfonyStyle $symfonyStyle,
FileSystemFileProcessor $fileSystemFileProcessor,
ExceptionCorrector $exceptionCorrector,
ErrorCollector $errorCollector,
ErrorAndDiffCollector $errorAndDiffCollector,
Configuration $configuration,
FileProcessor $fileProcessor,
FilesToReprintCollector $filesToReprintCollector,
DifferAndFormatter $differAndFormatter,
AppliedRectorCollector $appliedRectorCollector
FilesToReprintCollector $filesToReprintCollector
) {
$this->symfonyStyle = $symfonyStyle;
$this->fileSystemFileProcessor = $fileSystemFileProcessor;
$this->exceptionCorrector = $exceptionCorrector;
$this->errorCollector = $errorCollector;
$this->errorAndDiffCollector = $errorAndDiffCollector;
$this->configuration = $configuration;
$this->fileProcessor = $fileProcessor;
$this->filesToReprintCollector = $filesToReprintCollector;
$this->differAndFormatter = $differAndFormatter;
$this->appliedRectorCollector = $appliedRectorCollector;
}
/**
@ -120,7 +99,7 @@ final class RectorApplication
$message = $this->exceptionCorrector->getAutoloadExceptionMessageAndAddLocation($analysedCodeException);
$this->errorCollector->addError(new Error($fileInfo, $message));
$this->errorAndDiffCollector->addError(new Error($fileInfo, $message));
} catch (Throwable $throwable) {
if ($this->symfonyStyle->isVerbose()) {
throw $throwable;
@ -128,9 +107,11 @@ final class RectorApplication
$rectorClass = $this->exceptionCorrector->matchRectorClass($throwable);
if ($rectorClass) {
$this->errorCollector->addErrorWithRectorMessage($rectorClass, $throwable->getMessage());
$this->errorAndDiffCollector->addErrorWithRectorMessage($rectorClass, $throwable->getMessage());
} else {
$this->errorCollector->addError(new Error($fileInfo, $throwable->getMessage(), $throwable->getCode()));
$this->errorAndDiffCollector->addError(
new Error($fileInfo, $throwable->getMessage(), $throwable->getCode())
);
}
}
}
@ -145,7 +126,11 @@ final class RectorApplication
foreach ($this->filesToReprintCollector->getFileInfos() as $fileInfoToReprint) {
$reprintedOldContent = $fileInfoToReprint->getContents();
$reprintedNewContent = $this->fileProcessor->reprintToString($fileInfoToReprint);
$this->recordFileDiff($fileInfoToReprint, $reprintedNewContent, $reprintedOldContent);
$this->errorAndDiffCollector->addFileDiff(
$fileInfoToReprint,
$reprintedNewContent,
$reprintedOldContent
);
}
} else {
$newContent = $this->fileProcessor->processFile($fileInfo);
@ -153,28 +138,15 @@ final class RectorApplication
foreach ($this->filesToReprintCollector->getFileInfos() as $fileInfoToReprint) {
$reprintedOldContent = $fileInfoToReprint->getContents();
$reprintedNewContent = $this->fileProcessor->reprintFile($fileInfoToReprint);
$this->recordFileDiff($fileInfoToReprint, $reprintedNewContent, $reprintedOldContent);
$this->errorAndDiffCollector->addFileDiff(
$fileInfoToReprint,
$reprintedNewContent,
$reprintedOldContent
);
}
}
$this->recordFileDiff($fileInfo, $newContent, $oldContent);
$this->errorAndDiffCollector->addFileDiff($fileInfo, $newContent, $oldContent);
$this->filesToReprintCollector->reset();
}
/**
* @todo move to error collector
*/
private function recordFileDiff(SmartFileInfo $fileInfo, string $newContent, string $oldContent): void
{
if ($newContent === $oldContent) {
return;
}
// always keep the most recent diff
$this->fileDiffs[$fileInfo->getRealPath()] = new FileDiff(
$fileInfo->getRealPath(),
$this->differAndFormatter->diffAndFormat($oldContent, $newContent),
$this->appliedRectorCollector->getRectorClasses()
);
}
}

View File

@ -33,7 +33,7 @@ final class Configuration
public function resolveFromInput(InputInterface $input): void
{
$this->isDryRun = (bool) $input->getOption(Option::OPTION_DRY_RUN);
$this->source = (array) $input->getOption(Option::SOURCE);
$this->source = (array) $input->getArgument(Option::SOURCE);
$this->hideAutoloadErrors = (bool) $input->getOption(Option::HIDE_AUTOLOAD_ERRORS);
$this->withStyle = (bool) $input->getOption(Option::OPTION_WITH_STYLE);
}

View File

@ -2,7 +2,7 @@
namespace Rector\Console\Command;
use Rector\Application\ErrorCollector;
use Rector\Application\ErrorAndDiffCollector;
use Rector\Application\RectorApplication;
use Rector\Autoloading\AdditionalAutoloader;
use Rector\CodingStyle\AfterRectorCodingStyle;
@ -12,7 +12,6 @@ use Rector\Console\Output\ProcessCommandReporter;
use Rector\Console\Shell;
use Rector\FileSystem\FilesFinder;
use Rector\Guard\RectorGuard;
use Rector\Reporting\FileDiff;
use Symfony\Component\Console\Command\Command;
use Symfony\Component\Console\Input\InputArgument;
use Symfony\Component\Console\Input\InputInterface;
@ -23,11 +22,6 @@ use Symplify\PackageBuilder\Console\Command\CommandNaming;
final class ProcessCommand extends Command
{
/**
* @var FileDiff[]
*/
private $fileDiffs = [];
/**
* @var SymfonyStyle
*/
@ -54,9 +48,9 @@ final class ProcessCommand extends Command
private $rectorGuard;
/**
* @var ErrorCollector
* @var ErrorAndDiffCollector
*/
private $errorCollector;
private $errorAndDiffCollector;
/**
* @var AfterRectorCodingStyle
@ -79,7 +73,7 @@ final class ProcessCommand extends Command
ProcessCommandReporter $processCommandReporter,
AdditionalAutoloader $additionalAutoloader,
RectorGuard $rectorGuard,
ErrorCollector $errorCollector,
ErrorAndDiffCollector $errorAndDiffCollector,
AfterRectorCodingStyle $afterRectorCodingStyle,
Configuration $configuration,
RectorApplication $rectorApplication
@ -91,7 +85,7 @@ final class ProcessCommand extends Command
$this->processCommandReporter = $processCommandReporter;
$this->additionalAutoloader = $additionalAutoloader;
$this->rectorGuard = $rectorGuard;
$this->errorCollector = $errorCollector;
$this->errorAndDiffCollector = $errorAndDiffCollector;
$this->afterRectorCodingStyle = $afterRectorCodingStyle;
$this->configuration = $configuration;
$this->rectorApplication = $rectorApplication;
@ -149,12 +143,10 @@ final class ProcessCommand extends Command
$this->rectorApplication->runOnFileInfos($phpFileInfos);
// $this->processFileInfos($phpFileInfos);
$this->processCommandReporter->reportFileDiffs($this->errorAndDiffCollector->getFileDiffs());
$this->processCommandReporter->reportFileDiffs($this->fileDiffs);
if ($this->errorCollector->getErrors()) {
$this->processCommandReporter->reportErrors($this->errorCollector->getErrors());
if ($this->errorAndDiffCollector->getErrors()) {
$this->processCommandReporter->reportErrors($this->errorAndDiffCollector->getErrors());
return Shell::CODE_ERROR;
}
@ -164,7 +156,7 @@ final class ProcessCommand extends Command
$this->symfonyStyle->success('Rector is done!');
if ($this->configuration->isDryRun() && count($this->fileDiffs)) {
if ($this->configuration->isDryRun() && count($this->errorAndDiffCollector->getFileDiffs())) {
return Shell::CODE_ERROR;
}