From c177e0bab99f60f61fcabd498cbcadfaad279eb6 Mon Sep 17 00:00:00 2001 From: Tomas Votruba Date: Thu, 30 Jul 2026 23:53:40 +0200 Subject: [PATCH] [scripts] Skip configurable rules in the unused-rules audit Configurable rules do nothing without their own configuration, so they can never be listed in a set. Reporting them as "not in any set" hides the rules that are genuinely missing from a set. --- scripts/list-unused-rules.php | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/scripts/list-unused-rules.php b/scripts/list-unused-rules.php index 179a2c9edb4..d8281ef9417 100644 --- a/scripts/list-unused-rules.php +++ b/scripts/list-unused-rules.php @@ -3,6 +3,7 @@ declare(strict_types=1); use Rector\Bridge\SetRectorsResolver; +use Rector\Contract\Rector\ConfigurableRectorInterface; use Rector\Scripts\Finder\RectorClassFinder; use Rector\Scripts\Finder\RectorSetFilesFinder; use Symfony\Component\Console\Input\ArrayInput; @@ -45,12 +46,23 @@ $unusedRectorRules = array_diff($rectorClasses, $usedRectorRules); +// configurable rules require own configuration, without it they do nothing - they can never be part of a set +$configurableRectorRules = array_filter( + $unusedRectorRules, + static fn (string $rectorClass): bool => is_a($rectorClass, ConfigurableRectorInterface::class, true) +); + +$unusedRectorRules = array_diff($unusedRectorRules, $configurableRectorRules); + $symfonyStyle->newLine(); $symfonyStyle->listing($unusedRectorRules); $symfonyStyle->writeln( sprintf('Found %d Rector rules not in any set', count($unusedRectorRules)) ); +$symfonyStyle->writeln( + sprintf('Skipped %d configurable Rector rules', count($configurableRectorRules)) +); $symfonyStyle->newLine(); final class UsedRectorClassResolver