From ac82ae6a639b469495c90522bca92b6549a36fe8 Mon Sep 17 00:00:00 2001 From: Tomas Votruba Date: Thu, 6 May 2021 22:06:31 +0200 Subject: [PATCH] Move from SETS parameter to explicit import() (#6375) --- README.md | 5 +-- build/config/config-downgrade-php70.php | 12 +++--- build/config/config-downgrade.php | 10 ++--- docs/init_command.md | 3 +- ecs.php | 5 ++- rector.php | 36 +++++++++-------- src/Configuration/Option.php | 6 +-- src/Console/Command/ShowCommand.php | 36 +---------------- .../DeprecationWarningCompilerPass.php | 40 +++++++++++++++++++ src/HttpKernel/RectorKernel.php | 3 ++ src/Reporting/MissingRectorRulesReporter.php | 3 +- templates/rector.php.dist | 4 +- ...urableRectorImportConfigCallsMergeTest.php | 4 +- tests/DependencyInjection/config/one_set.php | 5 +-- .../config/one_set_with_own_rename.php | 5 +-- tests/DependencyInjection/config/two_sets.php | 6 +-- .../config/two_sets_with_own_rename.php | 9 ++--- 17 files changed, 91 insertions(+), 101 deletions(-) create mode 100644 src/DependencyInjection/CompilerPass/DeprecationWarningCompilerPass.php diff --git a/README.md b/README.md index 2815808c500..4ba1b386602 100644 --- a/README.md +++ b/README.md @@ -112,17 +112,14 @@ And modify it: ```php // rector.php -use Rector\Core\Configuration\Option; use Rector\Php74\Rector\Property\TypedPropertyRector; use Rector\Set\ValueObject\SetList; use Symfony\Component\DependencyInjection\Loader\Configurator\ContainerConfigurator; return static function (ContainerConfigurator $containerConfigurator): void { // here we can define, what sets of rules will be applied - $parameters = $containerConfigurator->parameters(); - // tip: use "SetList" class to autocomplete sets - $parameters->set(Option::SETS, [SetList::CODE_QUALITY]); + $containerConfigurator->import(SetList::CODE_QUALITY); // register single rule $services = $containerConfigurator->services(); diff --git a/build/config/config-downgrade-php70.php b/build/config/config-downgrade-php70.php index 5486a8856cb..999e80f58cd 100644 --- a/build/config/config-downgrade-php70.php +++ b/build/config/config-downgrade-php70.php @@ -16,13 +16,11 @@ return static function (ContainerConfigurator $containerConfigurator): void { $parameters->set(Option::PHPSTAN_FOR_RECTOR_PATH, __DIR__ . '/phpstan-for-downgrade.neon'); - $parameters->set(Option::SETS, [ - DowngradeSetList::PHP_80, - DowngradeSetList::PHP_74, - DowngradeSetList::PHP_73, - DowngradeSetList::PHP_72, - DowngradeSetList::PHP_71, - ]); + $containerConfigurator->import(DowngradeSetList::PHP_80); + $containerConfigurator->import(DowngradeSetList::PHP_74); + $containerConfigurator->import(DowngradeSetList::PHP_73); + $containerConfigurator->import(DowngradeSetList::PHP_72); + $containerConfigurator->import(DowngradeSetList::PHP_71); }; /** diff --git a/build/config/config-downgrade.php b/build/config/config-downgrade.php index eca24203a8b..50338800d55 100644 --- a/build/config/config-downgrade.php +++ b/build/config/config-downgrade.php @@ -25,12 +25,10 @@ return static function (ContainerConfigurator $containerConfigurator): void { $parameters->set(Option::PHPSTAN_FOR_RECTOR_PATH, __DIR__ . '/phpstan-for-downgrade.neon'); - $parameters->set(Option::SETS, [ - DowngradeSetList::PHP_80, - DowngradeSetList::PHP_74, - DowngradeSetList::PHP_73, - DowngradeSetList::PHP_72, - ]); + $containerConfigurator->import(DowngradeSetList::PHP_80); + $containerConfigurator->import(DowngradeSetList::PHP_74); + $containerConfigurator->import(DowngradeSetList::PHP_73); + $containerConfigurator->import(DowngradeSetList::PHP_72); }; /** diff --git a/docs/init_command.md b/docs/init_command.md index 63e037a5e46..eb9bf1c3d98 100644 --- a/docs/init_command.md +++ b/docs/init_command.md @@ -17,8 +17,7 @@ use Symfony\Component\DependencyInjection\Loader\Configurator\ContainerConfigura return static function (ContainerConfigurator $containerConfigurator): void { // here we can define, what sets of rules will be applied - $parameters = $containerConfigurator->parameters(); - $parameters->set(Option::SETS, [SetList::CODE_QUALITY]); + $containerConfigurator->import(SetList::CODE_QUALITY); // register single rule $services = $containerConfigurator->services(); diff --git a/ecs.php b/ecs.php index 4481697f651..cdb842441e9 100644 --- a/ecs.php +++ b/ecs.php @@ -52,7 +52,10 @@ return static function (ContainerConfigurator $containerConfigurator): void { __DIR__ . '/config/set', ]); - $parameters->set(Option::SETS, [SetList::PSR_12, SetList::SYMPLIFY, SetList::COMMON, SetList::CLEAN_CODE]); + $containerConfigurator->import(SetList::PSR_12); + $containerConfigurator->import(SetList::SYMPLIFY); + $containerConfigurator->import(SetList::COMMON); + $containerConfigurator->import(SetList::CLEAN_CODE); $parameters->set(Option::SKIP, [ '*/Source/*', diff --git a/rector.php b/rector.php index 85b39e77d6a..02bd7fd1750 100644 --- a/rector.php +++ b/rector.php @@ -23,6 +23,25 @@ use Symfony\Component\DependencyInjection\Loader\Configurator\ContainerConfigura use Symplify\SymfonyPhpConfig\ValueObjectInliner; return static function (ContainerConfigurator $containerConfigurator): void { + $parameters = $containerConfigurator->parameters(); + $parameters->set(Option::SETS, [SetList::NAMING]); + + // include sets + $containerConfigurator->import(SetList::CODING_STYLE); + $containerConfigurator->import(SetList::CODE_QUALITY); + $containerConfigurator->import(SetList::CODE_QUALITY_STRICT); + $containerConfigurator->import(SetList::DEAD_CODE); + $containerConfigurator->import(SetList::PRIVATIZATION); + $containerConfigurator->import(SetList::NAMING); + $containerConfigurator->import(SetList::TYPE_DECLARATION); + $containerConfigurator->import(SetList::PHP_71); + $containerConfigurator->import(SetList::PHP_72); + $containerConfigurator->import(SetList::PHP_73); + $containerConfigurator->import(SetList::EARLY_RETURN); + $containerConfigurator->import(SetList::TYPE_DECLARATION_STRICT); + $containerConfigurator->import(NetteSetList::NETTE_UTILS_CODE_QUALITY); + $containerConfigurator->import(PHPUnitSetList::PHPUNIT_CODE_QUALITY); + $services = $containerConfigurator->services(); $configuration = ValueObjectInliner::inline([ @@ -42,23 +61,6 @@ return static function (ContainerConfigurator $containerConfigurator): void { $parameters = $containerConfigurator->parameters(); - $parameters->set(Option::SETS, [ - SetList::CODING_STYLE, - SetList::CODE_QUALITY, - SetList::CODE_QUALITY_STRICT, - SetList::DEAD_CODE, - SetList::PRIVATIZATION, - SetList::NAMING, - SetList::TYPE_DECLARATION, - SetList::PHP_71, - SetList::PHP_72, - SetList::PHP_73, - SetList::EARLY_RETURN, - SetList::TYPE_DECLARATION_STRICT, - NetteSetList::NETTE_UTILS_CODE_QUALITY, - PHPUnitSetList::PHPUNIT_CODE_QUALITY, - ]); - $parameters->set(Option::PATHS, [ __DIR__ . '/src', __DIR__ . '/rules', diff --git a/src/Configuration/Option.php b/src/Configuration/Option.php index 2692771a643..bb383675804 100644 --- a/src/Configuration/Option.php +++ b/src/Configuration/Option.php @@ -99,6 +99,7 @@ final class Option public const AUTOLOAD_PATHS = 'autoload_paths'; /** + * @deprecated Use $containerConfigurator->import() as it does the same job, just better and more explicit * @var string */ public const SETS = 'sets'; @@ -138,11 +139,6 @@ final class Option */ public const OPTION_CONFIG = 'config'; - /** - * @var string - */ - public const FIX = 'fix'; - /** * @var string */ diff --git a/src/Console/Command/ShowCommand.php b/src/Console/Command/ShowCommand.php index b0bbb4e545c..06815c3730b 100644 --- a/src/Console/Command/ShowCommand.php +++ b/src/Console/Command/ShowCommand.php @@ -4,7 +4,6 @@ declare(strict_types=1); namespace Rector\Core\Console\Command; -use Rector\Core\Configuration\Option; use Rector\Core\Contract\Rector\RectorInterface; use Rector\PostRector\Contract\Rector\PostRectorInterface; use Symfony\Component\Console\Command\Command; @@ -12,8 +11,6 @@ use Symfony\Component\Console\Input\InputInterface; use Symfony\Component\Console\Output\OutputInterface; use Symfony\Component\Console\Style\SymfonyStyle; use Symplify\PackageBuilder\Console\ShellCode; -use Symplify\PackageBuilder\Parameter\ParameterProvider; -use Symplify\SmartFileSystem\SmartFileInfo; final class ShowCommand extends Command { @@ -22,11 +19,6 @@ final class ShowCommand extends Command */ private $symfonyStyle; - /** - * @var ParameterProvider - */ - private $parameterProvider; - /** * @var RectorInterface[] */ @@ -35,10 +27,9 @@ final class ShowCommand extends Command /** * @param RectorInterface[] $rectors */ - public function __construct(SymfonyStyle $symfonyStyle, ParameterProvider $parameterProvider, array $rectors) + public function __construct(SymfonyStyle $symfonyStyle, array $rectors) { $this->symfonyStyle = $symfonyStyle; - $this->parameterProvider = $parameterProvider; $this->rectors = $rectors; parent::__construct(); @@ -52,7 +43,6 @@ final class ShowCommand extends Command protected function execute(InputInterface $input, OutputInterface $output): int { $this->reportLoadedRectors(); - $this->reportLoadedSets(); return ShellCode::SUCCESS; } @@ -83,28 +73,4 @@ final class ShowCommand extends Command $this->symfonyStyle->warning($warningMessage); } } - - private function reportLoadedSets(): void - { - $sets = (array) $this->parameterProvider->provideParameter(Option::SETS); - if ($sets === []) { - return; - } - - $this->symfonyStyle->newLine(2); - $this->symfonyStyle->title('Loaded Sets'); - - sort($sets); - - $setFilePaths = []; - foreach ($sets as $set) { - $setFileInfo = new SmartFileInfo($set); - $setFilePaths[] = $setFileInfo->getRelativeFilePathFromCwd(); - } - - $this->symfonyStyle->listing($setFilePaths); - - $message = sprintf('%d loaded sets', count($sets)); - $this->symfonyStyle->success($message); - } } diff --git a/src/DependencyInjection/CompilerPass/DeprecationWarningCompilerPass.php b/src/DependencyInjection/CompilerPass/DeprecationWarningCompilerPass.php new file mode 100644 index 00000000000..40b7546ddfa --- /dev/null +++ b/src/DependencyInjection/CompilerPass/DeprecationWarningCompilerPass.php @@ -0,0 +1,40 @@ + + */ + private const DEPRECATED_PARAMETERS = [ + Option::SETS => 'Use $containerConfigurator->import(); instead', + ]; + + public function process(ContainerBuilder $containerBuilder): void + { + $parametersBag = $containerBuilder->getParameterBag(); + + foreach (self::DEPRECATED_PARAMETERS as $parameter => $message) { + if (! $parametersBag->has($parameter)) { + continue; + } + + $setsParameters = $parametersBag->get($parameter); + if ($setsParameters === []) { + continue; + } + + $message = sprintf('The "%s" parameter is deprecated. %s', $parameter, $message); + trigger_error($message); + // to make it noticable + sleep(2); + } + } +} diff --git a/src/HttpKernel/RectorKernel.php b/src/HttpKernel/RectorKernel.php index d8544494f19..0f89a4d6854 100644 --- a/src/HttpKernel/RectorKernel.php +++ b/src/HttpKernel/RectorKernel.php @@ -6,6 +6,7 @@ namespace Rector\Core\HttpKernel; use Rector\Core\Contract\Rector\RectorInterface; use Rector\Core\DependencyInjection\Collector\ConfigureCallValuesCollector; +use Rector\Core\DependencyInjection\CompilerPass\DeprecationWarningCompilerPass; use Rector\Core\DependencyInjection\CompilerPass\MakeRectorsPublicCompilerPass; use Rector\Core\DependencyInjection\CompilerPass\MergeImportedRectorConfigureCallValuesCompilerPass; use Rector\Core\DependencyInjection\CompilerPass\RemoveSkippedRectorsCompilerPass; @@ -108,6 +109,8 @@ final class RectorKernel extends Kernel $containerBuilder->addCompilerPass(new AutowireInterfacesCompilerPass([RectorInterface::class])); $containerBuilder->addCompilerPass(new MakeRectorsPublicCompilerPass()); + $containerBuilder->addCompilerPass(new DeprecationWarningCompilerPass()); + // add all merged arguments of Rector services $containerBuilder->addCompilerPass( new MergeImportedRectorConfigureCallValuesCompilerPass($this->configureCallValuesCollector) diff --git a/src/Reporting/MissingRectorRulesReporter.php b/src/Reporting/MissingRectorRulesReporter.php index 59499fa7bc8..6ba1311fbe9 100644 --- a/src/Reporting/MissingRectorRulesReporter.php +++ b/src/Reporting/MissingRectorRulesReporter.php @@ -55,8 +55,7 @@ final class MissingRectorRulesReporter $this->symfonyStyle->newLine(1); $this->symfonyStyle->title('2. Add set of rules to "rector.php"'); - $this->symfonyStyle->writeln(' $parameters = $containerConfigurator->parameters();'); - $this->symfonyStyle->writeln(' $parameters->set(Option::SETS, [...]);'); + $this->symfonyStyle->writeln(' $containerConfigurator->import(SetList::...);'); $this->symfonyStyle->newLine(1); $this->symfonyStyle->title('Missing "rector.php" in your project? Let Rector create it for you'); diff --git a/templates/rector.php.dist b/templates/rector.php.dist index bf6149a10fd..ab1c6f1a1cb 100644 --- a/templates/rector.php.dist +++ b/templates/rector.php.dist @@ -12,9 +12,7 @@ return static function (ContainerConfigurator $containerConfigurator): void { $parameters = $containerConfigurator->parameters(); // Define what rule sets will be applied - $parameters->set(Option::SETS, [ - SetList::DEAD_CODE, - ]); + $containerConfigurator->import(SetList::DEAD_CODE); // get services (needed for register a single rule) // $services = $containerConfigurator->services(); diff --git a/tests/DependencyInjection/ConfigurableRectorImportConfigCallsMergeTest.php b/tests/DependencyInjection/ConfigurableRectorImportConfigCallsMergeTest.php index 0551041fd66..b2f803190df 100644 --- a/tests/DependencyInjection/ConfigurableRectorImportConfigCallsMergeTest.php +++ b/tests/DependencyInjection/ConfigurableRectorImportConfigCallsMergeTest.php @@ -79,13 +79,13 @@ final class ConfigurableRectorImportConfigCallsMergeTest extends AbstractRectorT yield [ __DIR__ . '/config/one_set_with_own_rename.php', [ + 'Old' => 'New', 'PHPUnit_Framework_MockObject_Stub' => 'PHPUnit\Framework\MockObject\Stub', 'PHPUnit_Framework_MockObject_Stub_Return' => 'PHPUnit\Framework\MockObject\Stub\ReturnStub', 'PHPUnit_Framework_MockObject_Matcher_Parameters' => 'PHPUnit\Framework\MockObject\Matcher\Parameters', 'PHPUnit_Framework_MockObject_Matcher_Invocation' => 'PHPUnit\Framework\MockObject\Matcher\Invocation', 'PHPUnit_Framework_MockObject_MockObject' => 'PHPUnit\Framework\MockObject\MockObject', 'PHPUnit_Framework_MockObject_Invocation_Object' => 'PHPUnit\Framework\MockObject\Invocation\ObjectInvocation', - 'Old' => 'New', ], ]; @@ -105,6 +105,7 @@ final class ConfigurableRectorImportConfigCallsMergeTest extends AbstractRectorT yield [ __DIR__ . '/config/two_sets_with_own_rename.php', [ + 'Old' => 'New', 'Twig_SimpleFilter' => 'Twig_Filter', 'Twig_SimpleFunction' => 'Twig_Function', 'Twig_SimpleTest' => 'Twig_Test', @@ -114,7 +115,6 @@ final class ConfigurableRectorImportConfigCallsMergeTest extends AbstractRectorT 'PHPUnit_Framework_MockObject_Matcher_Invocation' => 'PHPUnit\Framework\MockObject\Matcher\Invocation', 'PHPUnit_Framework_MockObject_MockObject' => 'PHPUnit\Framework\MockObject\MockObject', 'PHPUnit_Framework_MockObject_Invocation_Object' => 'PHPUnit\Framework\MockObject\Invocation\ObjectInvocation', - 'Old' => 'New', ], ]; } diff --git a/tests/DependencyInjection/config/one_set.php b/tests/DependencyInjection/config/one_set.php index f052a5f2b61..04e7e11ff7d 100644 --- a/tests/DependencyInjection/config/one_set.php +++ b/tests/DependencyInjection/config/one_set.php @@ -2,12 +2,9 @@ declare(strict_types=1); -use Rector\Core\Configuration\Option; use Rector\Set\ValueObject\SetList; use Symfony\Component\DependencyInjection\Loader\Configurator\ContainerConfigurator; return static function (ContainerConfigurator $containerConfigurator): void { - $parameters = $containerConfigurator->parameters(); - - $parameters->set(Option::SETS, [SetList::PHPUNIT_60]); + $containerConfigurator->import(SetList::PHPUNIT_60); }; diff --git a/tests/DependencyInjection/config/one_set_with_own_rename.php b/tests/DependencyInjection/config/one_set_with_own_rename.php index 5696e9a11a1..21cd7a75e7c 100644 --- a/tests/DependencyInjection/config/one_set_with_own_rename.php +++ b/tests/DependencyInjection/config/one_set_with_own_rename.php @@ -2,15 +2,12 @@ declare(strict_types=1); -use Rector\Core\Configuration\Option; use Rector\Renaming\Rector\Name\RenameClassRector; use Rector\Set\ValueObject\SetList; use Symfony\Component\DependencyInjection\Loader\Configurator\ContainerConfigurator; return static function (ContainerConfigurator $containerConfigurator): void { - $parameters = $containerConfigurator->parameters(); - - $parameters->set(Option::SETS, [SetList::PHPUNIT_60]); + $containerConfigurator->import(SetList::PHPUNIT_60); $services = $containerConfigurator->services(); $services->set(RenameClassRector::class) diff --git a/tests/DependencyInjection/config/two_sets.php b/tests/DependencyInjection/config/two_sets.php index 21753001715..38c09ae554d 100644 --- a/tests/DependencyInjection/config/two_sets.php +++ b/tests/DependencyInjection/config/two_sets.php @@ -2,12 +2,10 @@ declare(strict_types=1); -use Rector\Core\Configuration\Option; use Rector\Set\ValueObject\SetList; use Symfony\Component\DependencyInjection\Loader\Configurator\ContainerConfigurator; return static function (ContainerConfigurator $containerConfigurator): void { - $parameters = $containerConfigurator->parameters(); - - $parameters->set(Option::SETS, [SetList::PHPUNIT_60, SetList::TWIG_20]); + $containerConfigurator->import(SetList::PHPUNIT_60); + $containerConfigurator->import(SetList::TWIG_20); }; diff --git a/tests/DependencyInjection/config/two_sets_with_own_rename.php b/tests/DependencyInjection/config/two_sets_with_own_rename.php index 022e2ae4b6d..00256684f66 100644 --- a/tests/DependencyInjection/config/two_sets_with_own_rename.php +++ b/tests/DependencyInjection/config/two_sets_with_own_rename.php @@ -2,15 +2,14 @@ declare(strict_types=1); -use Rector\Core\Configuration\Option; +use Rector\PHPUnit\Set\PHPUnitSetList; use Rector\Renaming\Rector\Name\RenameClassRector; -use Rector\Set\ValueObject\SetList; +use Rector\Symfony\Set\TwigSetList; use Symfony\Component\DependencyInjection\Loader\Configurator\ContainerConfigurator; return static function (ContainerConfigurator $containerConfigurator): void { - $parameters = $containerConfigurator->parameters(); - - $parameters->set(Option::SETS, [SetList::PHPUNIT_60, SetList::TWIG_20]); + $containerConfigurator->import(PHPUnitSetList::PHPUNIT_60); + $containerConfigurator->import(TwigSetList::TWIG_20); $services = $containerConfigurator->services(); $services->set(RenameClassRector::class)