Skip to content

Commit bd7bb2a

Browse files
committed
[dx] warn early about deprecated skipped rules, as not neccessary to skip anymore
1 parent bdf9c43 commit bd7bb2a

File tree

5 files changed

+64
-14
lines changed

5 files changed

+64
-14
lines changed

rector.php

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22

33
declare(strict_types=1);
44

5+
use Rector\CodingStyle\Rector\FunctionLike\FunctionLikeToFirstClassCallableRector;
56
use Rector\CodingStyle\Rector\String_\UseClassKeywordForClassNameResolutionRector;
67
use Rector\Config\RectorConfig;
78
use Rector\DeadCode\Rector\ConstFetch\RemovePhpVersionIdCheckRector;
@@ -41,6 +42,9 @@
4142
->withImportNames(removeUnusedImports: true)
4243
->withRules([RemoveRefactorDuplicatedNodeInstanceCheckRector::class, AddSeeTestAnnotationRector::class])
4344
->withSkip([
45+
// testing skip of deprecated class
46+
FunctionLikeToFirstClassCallableRector::class,
47+
4448
StringClassNameToClassConstantRector::class,
4549
// tests
4650
'*/Fixture*',

src/Console/Command/ListRulesCommand.php

Lines changed: 8 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -51,7 +51,7 @@ protected function execute(InputInterface $input, OutputInterface $output): int
5151
{
5252
$rectorClasses = $this->resolveRectorClasses();
5353

54-
$skippedClasses = $this->getSkippedCheckers();
54+
$skippedClasses = $this->getSkippedRectorClasses();
5555

5656
$outputFormat = $input->getOption(Option::OUTPUT_FORMAT);
5757
if ($outputFormat === 'json') {
@@ -95,20 +95,21 @@ private function resolveRectorClasses(): array
9595
}
9696

9797
/**
98-
* @return string[]
98+
* @return array<class-string>
9999
*/
100-
private function getSkippedCheckers(): array
100+
private function getSkippedRectorClasses(): array
101101
{
102-
$skippedCheckers = [];
103-
foreach ($this->skippedClassResolver->resolve() as $checkerClass => $fileList) {
102+
$skippedRectorClasses = [];
103+
104+
foreach ($this->skippedClassResolver->resolve() as $rectorClass => $fileList) {
104105
// ignore specific skips
105106
if ($fileList !== null) {
106107
continue;
107108
}
108109

109-
$skippedCheckers[] = $checkerClass;
110+
$skippedRectorClasses[] = $rectorClass;
110111
}
111112

112-
return $skippedCheckers;
113+
return $skippedRectorClasses;
113114
}
114115
}

src/Console/Command/ProcessCommand.php

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@
1919
use Rector\Exception\ShouldNotHappenException;
2020
use Rector\Reporting\DeprecatedRulesReporter;
2121
use Rector\Reporting\MissConfigurationReporter;
22+
use Rector\Skipper\SkipCriteriaResolver\SkippedClassResolver;
2223
use Rector\StaticReflection\DynamicSourceLocatorDecorator;
2324
use Rector\Util\MemoryLimiter;
2425
use Rector\ValueObject\Configuration;
@@ -45,6 +46,7 @@ public function __construct(
4546
private readonly DeprecatedRulesReporter $deprecatedRulesReporter,
4647
private readonly MissConfigurationReporter $missConfigurationReporter,
4748
private readonly ConfigurationRuleFilter $configurationRuleFilter,
49+
private readonly SkippedClassResolver $skippedClassResolver,
4850
) {
4951
parent::__construct();
5052
}
@@ -105,6 +107,15 @@ protected function execute(InputInterface $input, OutputInterface $output): int
105107
$this->reportLevelOverflow($levelOverflow);
106108
}
107109

110+
// 0. warn about skipped rules that are deprecated
111+
if ($this->skippedClassResolver->resolveDeprecatedSkippedClasses() !== []) {
112+
$this->symfonyStyle->warning(sprintf(
113+
'These rules are skipped, but are deprecated. Most likely you do not need to skip them anymore as not part of any set and remove them: %s* %s',
114+
"\n\n",
115+
implode(' * ', $this->skippedClassResolver->resolveDeprecatedSkippedClasses()) . "\n"
116+
));
117+
}
118+
108119
// 1. warn about rules registered in both withRules() and sets to avoid bloated rector.php configs
109120
$setAndRulesDuplicatedRegistrations = $configuration->getBothSetAndRulesDuplicatedRegistrations();
110121
if ($setAndRulesDuplicatedRegistrations !== []) {

src/Skipper/SkipCriteriaResolver/SkippedClassResolver.php

Lines changed: 23 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -4,16 +4,32 @@
44

55
namespace Rector\Skipper\SkipCriteriaResolver;
66

7+
use Rector\Configuration\Deprecation\Contract\DeprecatedInterface;
78
use Rector\Configuration\Option;
89
use Rector\Configuration\Parameter\SimpleParameterProvider;
910
use Rector\Testing\PHPUnit\StaticPHPUnitEnvironment;
1011

12+
/**
13+
* @see \Rector\Tests\Skipper\Skipper\SkippedClassResolverTest
14+
*/
1115
final class SkippedClassResolver
1216
{
1317
/**
1418
* @var null|array<string, string[]|null>
1519
*/
16-
private null|array $skippedClasses = null;
20+
private null|array $skippedClassesToFiles = null;
21+
22+
/**
23+
* @return array<DeprecatedInterface>
24+
*/
25+
public function resolveDeprecatedSkippedClasses(): array
26+
{
27+
$skippedClassNames = array_keys($this->resolve());
28+
29+
return array_filter($skippedClassNames, function (string $class): bool {
30+
return is_a($class, DeprecatedInterface::class, true);
31+
});
32+
}
1733

1834
/**
1935
* @return array<string, string[]|null>
@@ -22,16 +38,16 @@ public function resolve(): array
2238
{
2339
// disable cache in tests
2440
if (StaticPHPUnitEnvironment::isPHPUnitRun()) {
25-
$this->skippedClasses = null;
41+
$this->skippedClassesToFiles = null;
2642
}
2743

2844
// already cached, even only empty array
29-
if ($this->skippedClasses !== null) {
30-
return $this->skippedClasses;
45+
if ($this->skippedClassesToFiles !== null) {
46+
return $this->skippedClassesToFiles;
3147
}
3248

3349
$skip = SimpleParameterProvider::provideArrayParameter(Option::SKIP);
34-
$this->skippedClasses = [];
50+
$this->skippedClassesToFiles = [];
3551

3652
foreach ($skip as $key => $value) {
3753
// e.g. [SomeClass::class] → shift values to [SomeClass::class => null]
@@ -49,9 +65,9 @@ public function resolve(): array
4965
continue;
5066
}
5167

52-
$this->skippedClasses[$key] = $value;
68+
$this->skippedClassesToFiles[$key] = $value;
5369
}
5470

55-
return $this->skippedClasses;
71+
return $this->skippedClassesToFiles;
5672
}
5773
}
Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
<?php
2+
3+
declare(strict_types=1);
4+
5+
namespace Rector\Tests\Skipper\Skipper;
6+
7+
use Rector\Skipper\SkipCriteriaResolver\SkippedClassResolver;
8+
use Rector\Testing\PHPUnit\AbstractLazyTestCase;
9+
10+
final class SkippedClassResolverTest extends AbstractLazyTestCase
11+
{
12+
public function test(): void
13+
{
14+
$skippedClassResolver = $this->make(SkippedClassResolver::class);
15+
16+
$this->assertSame([], $skippedClassResolver->resolveDeprecatedSkippedClasses());
17+
}
18+
}

0 commit comments

Comments
 (0)