diff --git a/src/Config/RectorConfig.php b/src/Config/RectorConfig.php index 9c6263762a..8bccaf86fa 100644 --- a/src/Config/RectorConfig.php +++ b/src/Config/RectorConfig.php @@ -41,8 +41,18 @@ final class RectorConfig extends Container */ private array $autotagInterfaces = [Command::class, ResetableInterface::class]; + private static ?bool $recreated = null; + public static function configure(): RectorConfigBuilder { + if (self::$recreated === null) { + self::$recreated = false; + } elseif (self::$recreated === false) { + self::$recreated = true; + } + + SimpleParameterProvider::setParameter(Option::IS_RECTORCONFIG_BUILDER_RECREATED, self::$recreated); + return new RectorConfigBuilder(); } diff --git a/src/Configuration/Option.php b/src/Configuration/Option.php index 9c4469dd91..6db04b763a 100644 --- a/src/Configuration/Option.php +++ b/src/Configuration/Option.php @@ -248,6 +248,12 @@ final class Option */ public const REGISTERED_RECTOR_SETS = 'registered_rector_sets'; + /** + * @internal For verify RectorConfigBuilder instance recreated + * @var string + */ + public const IS_RECTORCONFIG_BUILDER_RECREATED = 'is_rectorconfig_builder_recreated'; + /** * @internal For verify skipped rules exists in registered rules * @var string diff --git a/src/Configuration/RectorConfigBuilder.php b/src/Configuration/RectorConfigBuilder.php index d1dd41080e..0347988599 100644 --- a/src/Configuration/RectorConfigBuilder.php +++ b/src/Configuration/RectorConfigBuilder.php @@ -788,13 +788,16 @@ public function withRules(array $rules): self { $this->rules = array_merge($this->rules, $rules); - // log all explicitly registered rules - // we only check the non-configurable rules, as the configurable ones might override them - $nonConfigurableRules = array_filter( - $rules, - fn (string $rule): bool => ! is_a($rule, ConfigurableRectorInterface::class, true) - ); - SimpleParameterProvider::addParameter(Option::ROOT_STANDALONE_REGISTERED_RULES, $nonConfigurableRules); + if (SimpleParameterProvider::provideBoolParameter(Option::IS_RECTORCONFIG_BUILDER_RECREATED, false) === false) { + // log all explicitly registered rules on root rector.php + // we only check the non-configurable rules, as the configurable ones might override them + $nonConfigurableRules = array_filter( + $rules, + fn (string $rule): bool => ! is_a($rule, ConfigurableRectorInterface::class, true) + ); + + SimpleParameterProvider::addParameter(Option::ROOT_STANDALONE_REGISTERED_RULES, $nonConfigurableRules); + } return $this; } diff --git a/tests/Config/RectorConfigTest.php b/tests/Config/RectorConfigTest.php new file mode 100644 index 0000000000..a0ca5e0f6b --- /dev/null +++ b/tests/Config/RectorConfigTest.php @@ -0,0 +1,29 @@ +withSets([ + TwigSetList::TWIG_134 + ]) + ->withRules([ + ReturnTypeFromReturnNewRector::class + ])(new RectorConfig()); + + // only collect root withRules() + $this->assertCount(1, SimpleParameterProvider::provideArrayParameter(Option::ROOT_STANDALONE_REGISTERED_RULES)); + } +}