diff --git a/.github/workflows/e2e.yaml b/.github/workflows/e2e.yaml index b682af5cb7c..ddb859558e9 100644 --- a/.github/workflows/e2e.yaml +++ b/.github/workflows/e2e.yaml @@ -33,6 +33,7 @@ jobs: - 'e2e/use-rector-configurator' - 'e2e/applied-rule-removed-node' - 'e2e/parallel with space' + - 'e2e/removed-and-added-files-collector' name: End to end test - ${{ matrix.directory }} diff --git a/e2e/e2eTestRunner.php b/e2e/e2eTestRunner.php index c7be130e324..0bf1730ac7c 100644 --- a/e2e/e2eTestRunner.php +++ b/e2e/e2eTestRunner.php @@ -34,6 +34,7 @@ exec($e2eCommand, $output, $exitCode); $output = trim(implode("\n", $output)); +$output = str_replace(__DIR__, '.', $output); $expectedDiff = 'expected-output.diff'; if (!file_exists($expectedDiff)) { diff --git a/e2e/removed-and-added-files-collector/.gitignore b/e2e/removed-and-added-files-collector/.gitignore new file mode 100644 index 00000000000..61ead86667c --- /dev/null +++ b/e2e/removed-and-added-files-collector/.gitignore @@ -0,0 +1 @@ +/vendor diff --git a/e2e/removed-and-added-files-collector/TestRector.php b/e2e/removed-and-added-files-collector/TestRector.php new file mode 100644 index 00000000000..831ccedb390 --- /dev/null +++ b/e2e/removed-and-added-files-collector/TestRector.php @@ -0,0 +1,66 @@ +removedAndAddedFilesCollector = $removedAndAddedFilesCollector; + } + + public function getRuleDefinition(): RuleDefinition + { + return new RuleDefinition( + 'Test adding file.', + [ + new CodeSample( + <<<'CODE_SAMPLE' + function test() {} + CODE_SAMPLE, + <<<'CODE_SAMPLE' + function test() {} + /* file named “test” is added */ + CODE_SAMPLE + ), + ] + ); + } + + /** + * @return array> + */ + public function getNodeTypes(): array + { + return [Function_::class]; + } + + /** + * @param Function_ $node + */ + public function refactor(Node $node): ?Node + { + // Create a fixture. + $this->removedAndAddedFilesCollector->addAddedFile( + new AddedFileWithContent( + __DIR__ . '/test', + 'test' + ) + ); + + return $new; + } +} diff --git a/e2e/removed-and-added-files-collector/composer.json b/e2e/removed-and-added-files-collector/composer.json new file mode 100644 index 00000000000..cf3f9a325c0 --- /dev/null +++ b/e2e/removed-and-added-files-collector/composer.json @@ -0,0 +1,10 @@ +{ + "require": { + "php": "^8.1" + }, + "autoload-dev": { + "psr-4": { + "Maintenance\\": "." + } + } +} diff --git a/e2e/removed-and-added-files-collector/expected-output.diff b/e2e/removed-and-added-files-collector/expected-output.diff new file mode 100644 index 00000000000..14879270096 --- /dev/null +++ b/e2e/removed-and-added-files-collector/expected-output.diff @@ -0,0 +1,7 @@ +! [NOTE] File + ! "./removed-and-added-files-c + ! ollector/test" will be added + + + + [OK] Rector is done! \ No newline at end of file diff --git a/e2e/removed-and-added-files-collector/rector.php b/e2e/removed-and-added-files-collector/rector.php new file mode 100644 index 00000000000..c52824bc0a2 --- /dev/null +++ b/e2e/removed-and-added-files-collector/rector.php @@ -0,0 +1,14 @@ +rule(TestRector::class); + $rectorConfig->paths([ + __DIR__ . '/src', + ]); +}; diff --git a/e2e/removed-and-added-files-collector/src/Test.php b/e2e/removed-and-added-files-collector/src/Test.php new file mode 100644 index 00000000000..5dfa3887e78 --- /dev/null +++ b/e2e/removed-and-added-files-collector/src/Test.php @@ -0,0 +1,4 @@ +currentFileProvider->setFile($file); - if (! $this->phpFileProcessor->supports($file, $configuration)) { - continue; - } - - $currentErrorsAndFileDiffs = $this->phpFileProcessor->process($file, $configuration); - - $errorAndFileDiffs = $this->arrayParametersMerger->merge( - $errorAndFileDiffs, - $currentErrorsAndFileDiffs - ); + $errorAndFileDiffs = $this->processFiles($file, $configuration, $errorAndFileDiffs); // warn about deprecated @noRector annotation if (! str_ends_with($file->getFilePath(), 'WorkerRunner.php') @@ -130,6 +127,28 @@ public function run(Encoder $encoder, Decoder $decoder, Configuration $configura $decoder->on(ReactEvent::ERROR, $handleErrorCallback); } + /** + * @param array{system_errors: SystemError[], file_diffs: FileDiff[]}|mixed[] $errorAndFileDiffs + * @return array{system_errors: SystemError[], file_diffs: FileDiff[]} + */ + public function processFiles(File $file, Configuration $configuration, array $errorAndFileDiffs): array + { + foreach ($this->fileProcessors as $fileProcessor) { + if (! $fileProcessor->supports($file, $configuration)) { + continue; + } + + $currentErrorsAndFileDiffs = $fileProcessor->process($file, $configuration); + $errorAndFileDiffs = $this->arrayParametersMerger->merge( + $errorAndFileDiffs, + $currentErrorsAndFileDiffs + ); + } + + $this->removedAndAddedFilesProcessor->run($configuration); + return $errorAndFileDiffs; + } + /** * @param SystemError[] $systemErrors * @return SystemError[] diff --git a/phpstan.neon b/phpstan.neon index 7e94c30062a..617d08701dd 100644 --- a/phpstan.neon +++ b/phpstan.neon @@ -329,6 +329,7 @@ parameters: - packages/BetterPhpDocParser/ValueObject/Parser/BetterTokenIterator.php # reported only in non-CI, for some reason; keep it there even if it's reported as fixed error - packages/Parallel/Application/ParallelFileProcessor.php + - packages/Parallel/WorkerRunner.php # skipped on purpose, as ctor overrie - '#Rector\\StaticTypeMapper\\ValueObject\\Type\\SimpleStaticType\:\:__construct\(\) does not call parent constructor from PHPStan\\Type\\StaticType#'