From 40f9239464fc374e506351a0c687ac60c0f7a93f Mon Sep 17 00:00:00 2001 From: Tomas Votruba Date: Fri, 21 Aug 2026 12:35:43 +0100 Subject: [PATCH 1/2] [Configuration] Skip deprecated rules from active set to warn only, not crash with exit code 1 --- src/Configuration/ConfigurationRuleFilter.php | 7 +++++++ .../Configuration/ConfigurationRuleFilterTest.php | 15 +++++++++++++++ 2 files changed, 22 insertions(+) diff --git a/src/Configuration/ConfigurationRuleFilter.php b/src/Configuration/ConfigurationRuleFilter.php index 572bd58a614..7f9ea2cf13b 100644 --- a/src/Configuration/ConfigurationRuleFilter.php +++ b/src/Configuration/ConfigurationRuleFilter.php @@ -4,6 +4,7 @@ namespace Rector\Configuration; +use Rector\Configuration\Deprecation\Contract\DeprecatedInterface; use Rector\Configuration\Parameter\SimpleParameterProvider; use Rector\Contract\Rector\RectorInterface; use Rector\ValueObject\Configuration; @@ -30,6 +31,12 @@ public function setConfiguration(Configuration $configuration): void */ public function filter(array $rectors): array { + // deprecated rules only warn via DeprecatedRulesReporter; they must never run, as their + // refactor() throws to signal the deprecation - keep them out of the active set + $rectors = array_values( + array_filter($rectors, static fn (RectorInterface $rector): bool => ! $rector instanceof DeprecatedInterface) + ); + if (! $this->configuration instanceof Configuration) { return $rectors; } diff --git a/tests/Configuration/ConfigurationRuleFilterTest.php b/tests/Configuration/ConfigurationRuleFilterTest.php index 32d7839a680..0232e43fec2 100644 --- a/tests/Configuration/ConfigurationRuleFilterTest.php +++ b/tests/Configuration/ConfigurationRuleFilterTest.php @@ -8,6 +8,7 @@ use Rector\DeadCode\Rector\If_\RemoveDeadInstanceOfRector; use Rector\Php80\Rector\Class_\StringableForToStringRector; use Rector\Testing\PHPUnit\AbstractLazyTestCase; +use Rector\Transform\Rector\Class_\AddInterfaceByTraitRector; use Rector\ValueObject\Configuration; final class ConfigurationRuleFilterTest extends AbstractLazyTestCase @@ -49,6 +50,20 @@ public function testWithoutPhpOnlyKeepsAllRules(): void $this->assertSame([$stringableForToStringRector, $removeDeadInstanceOfRector], $filteredRectors); } + public function testFiltersOutDeprecatedRules(): void + { + $removeDeadInstanceOfRector = $this->make(RemoveDeadInstanceOfRector::class); + $addInterfaceByTraitRector = $this->make(AddInterfaceByTraitRector::class); + + $this->configurationRuleFilter->setConfiguration($this->createConfiguration(false)); + + $filteredRectors = $this->configurationRuleFilter->filter( + [$removeDeadInstanceOfRector, $addInterfaceByTraitRector] + ); + + $this->assertSame([$removeDeadInstanceOfRector], $filteredRectors); + } + private function createConfiguration(bool $isPhpOnly): Configuration { return new Configuration(isPhpOnly: $isPhpOnly); From f951c9ab5333ef0a3ec8f750ca2ec4447e4f6bd8 Mon Sep 17 00:00:00 2001 From: Tomas Votruba Date: Sat, 22 Aug 2026 11:41:24 +0100 Subject: [PATCH 2/2] [Configuration] Use deprecated rule stub in test to avoid deprecated class reference --- .../ConfigurationRuleFilterTest.php | 6 ++-- .../Source/DeprecatedRectorStub.php | 30 +++++++++++++++++++ 2 files changed, 33 insertions(+), 3 deletions(-) create mode 100644 tests/Configuration/Source/DeprecatedRectorStub.php diff --git a/tests/Configuration/ConfigurationRuleFilterTest.php b/tests/Configuration/ConfigurationRuleFilterTest.php index 0232e43fec2..0ac159485c6 100644 --- a/tests/Configuration/ConfigurationRuleFilterTest.php +++ b/tests/Configuration/ConfigurationRuleFilterTest.php @@ -8,7 +8,7 @@ use Rector\DeadCode\Rector\If_\RemoveDeadInstanceOfRector; use Rector\Php80\Rector\Class_\StringableForToStringRector; use Rector\Testing\PHPUnit\AbstractLazyTestCase; -use Rector\Transform\Rector\Class_\AddInterfaceByTraitRector; +use Rector\Tests\Configuration\Source\DeprecatedRectorStub; use Rector\ValueObject\Configuration; final class ConfigurationRuleFilterTest extends AbstractLazyTestCase @@ -53,12 +53,12 @@ public function testWithoutPhpOnlyKeepsAllRules(): void public function testFiltersOutDeprecatedRules(): void { $removeDeadInstanceOfRector = $this->make(RemoveDeadInstanceOfRector::class); - $addInterfaceByTraitRector = $this->make(AddInterfaceByTraitRector::class); + $deprecatedRectorStub = $this->make(DeprecatedRectorStub::class); $this->configurationRuleFilter->setConfiguration($this->createConfiguration(false)); $filteredRectors = $this->configurationRuleFilter->filter( - [$removeDeadInstanceOfRector, $addInterfaceByTraitRector] + [$removeDeadInstanceOfRector, $deprecatedRectorStub] ); $this->assertSame([$removeDeadInstanceOfRector], $filteredRectors); diff --git a/tests/Configuration/Source/DeprecatedRectorStub.php b/tests/Configuration/Source/DeprecatedRectorStub.php new file mode 100644 index 00000000000..51bb072bcba --- /dev/null +++ b/tests/Configuration/Source/DeprecatedRectorStub.php @@ -0,0 +1,30 @@ +