Skip to content

Commit 38a2734

Browse files
committed
Move handling of unmatched ignored errors from FileAnalyser to AnalyserResultFinalizer
1 parent 52036a5 commit 38a2734

File tree

6 files changed

+72
-39
lines changed

6 files changed

+72
-39
lines changed

conf/config.neon

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -478,12 +478,13 @@ services:
478478

479479
-
480480
class: PHPStan\Analyser\AnalyserResultFinalizer
481+
arguments:
482+
reportUnmatchedIgnoredErrors: %reportUnmatchedIgnoredErrors%
481483

482484
-
483485
class: PHPStan\Analyser\FileAnalyser
484486
arguments:
485487
parser: @defaultAnalysisParser
486-
reportUnmatchedIgnoredErrors: %reportUnmatchedIgnoredErrors%
487488

488489
-
489490
class: PHPStan\Analyser\LocalIgnoresProcessor

src/Analyser/AnalyserResultFinalizer.php

Lines changed: 55 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -18,19 +18,20 @@ public function __construct(
1818
private RuleRegistry $ruleRegistry,
1919
private RuleErrorTransformer $ruleErrorTransformer,
2020
private ScopeFactory $scopeFactory,
21+
private bool $reportUnmatchedIgnoredErrors,
2122
)
2223
{
2324
}
2425

2526
public function finalize(AnalyserResult $analyserResult, bool $onlyFiles): AnalyserResult
2627
{
2728
if (count($analyserResult->getCollectedData()) === 0) {
28-
return $analyserResult;
29+
return $this->addUnmatchedIgnoredErrors($analyserResult);
2930
}
3031

3132
$hasInternalErrors = count($analyserResult->getInternalErrors()) > 0 || $analyserResult->hasReachedInternalErrorsCountLimit();
3233
if ($hasInternalErrors) {
33-
return $analyserResult;
34+
return $this->addUnmatchedIgnoredErrors($analyserResult);
3435
}
3536

3637
$nodeType = CollectedDataNode::class;
@@ -58,6 +59,58 @@ public function finalize(AnalyserResult $analyserResult, bool $onlyFiles): Analy
5859
}
5960
}
6061

62+
return $this->addUnmatchedIgnoredErrors(new AnalyserResult(
63+
$errors,
64+
$analyserResult->getLocallyIgnoredErrors(),
65+
$analyserResult->getLinesToIgnore(),
66+
$analyserResult->getUnmatchedLineIgnores(),
67+
$analyserResult->getInternalErrors(),
68+
$analyserResult->getCollectedData(),
69+
$analyserResult->getDependencies(),
70+
$analyserResult->getExportedNodes(),
71+
$analyserResult->hasReachedInternalErrorsCountLimit(),
72+
$analyserResult->getPeakMemoryUsageBytes(),
73+
));
74+
}
75+
76+
private function addUnmatchedIgnoredErrors(AnalyserResult $analyserResult): AnalyserResult
77+
{
78+
if (!$this->reportUnmatchedIgnoredErrors) {
79+
return $analyserResult;
80+
}
81+
82+
$errors = $analyserResult->getUnorderedErrors();
83+
foreach ($analyserResult->getUnmatchedLineIgnores() as $file => $data) {
84+
foreach ($data as $ignoredFile => $lines) {
85+
if ($ignoredFile !== $file) {
86+
continue;
87+
}
88+
89+
foreach ($lines as $line => $identifiers) {
90+
if ($identifiers === null) {
91+
$errors[] = (new Error(
92+
sprintf('No error to ignore is reported on line %d.', $line),
93+
$file,
94+
$line,
95+
false,
96+
$file,
97+
))->withIdentifier('ignore.unmatchedLine');
98+
continue;
99+
}
100+
101+
foreach ($identifiers as $identifier) {
102+
$errors[] = (new Error(
103+
sprintf('No error with identifier %s is reported on line %d.', $identifier, $line),
104+
$file,
105+
$line,
106+
false,
107+
$file,
108+
))->withIdentifier('ignore.unmatchedIdentifier');
109+
}
110+
}
111+
}
112+
}
113+
61114
return new AnalyserResult(
62115
$errors,
63116
$analyserResult->getLocallyIgnoredErrors(),

src/Analyser/FileAnalyser.php

Lines changed: 0 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,6 @@ public function __construct(
4242
private DependencyResolver $dependencyResolver,
4343
private RuleErrorTransformer $ruleErrorTransformer,
4444
private LocalIgnoresProcessor $localIgnoresProcessor,
45-
private bool $reportUnmatchedIgnoredErrors,
4645
)
4746
{
4847
}
@@ -189,37 +188,6 @@ public function analyseFile(
189188
}
190189
$linesToIgnore = $localIgnoresProcessorResult->getLinesToIgnore();
191190
$unmatchedLineIgnores = $localIgnoresProcessorResult->getUnmatchedLineIgnores();
192-
193-
if ($this->reportUnmatchedIgnoredErrors) {
194-
foreach ($unmatchedLineIgnores as $ignoredFile => $lines) {
195-
if ($ignoredFile !== $file) {
196-
continue;
197-
}
198-
199-
foreach ($lines as $line => $identifiers) {
200-
if ($identifiers === null) {
201-
$fileErrors[] = (new Error(
202-
sprintf('No error to ignore is reported on line %d.', $line),
203-
$file,
204-
$line,
205-
false,
206-
$file,
207-
))->withIdentifier('ignore.unmatchedLine');
208-
continue;
209-
}
210-
211-
foreach ($identifiers as $identifier) {
212-
$fileErrors[] = (new Error(
213-
sprintf('No error with identifier %s is reported on line %d.', $identifier, $line),
214-
$file,
215-
$line,
216-
false,
217-
$file,
218-
))->withIdentifier('ignore.unmatchedIdentifier');
219-
}
220-
}
221-
}
222-
}
223191
} catch (\PhpParser\Error $e) {
224192
$fileErrors[] = (new Error($e->getMessage(), $file, $e->getStartLine() !== -1 ? $e->getStartLine() : null, $e))->withIdentifier('phpstan.parse');
225193
} catch (ParserErrorsException $e) {

src/Analyser/ResultCache/ResultCacheManager.php

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -867,6 +867,7 @@ private function getMeta(array $allAnalysedFiles, ?array $projectConfigArray): a
867867
unset($projectConfigArray['parameters']['editorUrlTitle']);
868868
unset($projectConfigArray['parameters']['errorFormat']);
869869
unset($projectConfigArray['parameters']['ignoreErrors']);
870+
unset($projectConfigArray['parameters']['reportUnmatchedIgnoredErrors']);
870871
unset($projectConfigArray['parameters']['tipsOfTheDay']);
871872
unset($projectConfigArray['parameters']['parallel']);
872873
unset($projectConfigArray['parameters']['internalErrorsCountLimit']);

src/Testing/RuleTestCase.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -112,7 +112,6 @@ private function getAnalyser(): Analyser
112112
self::getContainer()->getByType(DependencyResolver::class),
113113
new RuleErrorTransformer(),
114114
new LocalIgnoresProcessor(),
115-
true,
116115
);
117116
$this->analyser = new Analyser(
118117
$fileAnalyser,
@@ -184,6 +183,7 @@ public function gatherAnalyserErrors(array $files): array
184183
]),
185184
new RuleErrorTransformer(),
186185
$this->createScopeFactory($this->createReflectionProvider(), $this->getTypeSpecifier()),
186+
true,
187187
);
188188

189189
return $finalizer->finalize($analyserResult, false)->getUnorderedErrors();

tests/PHPStan/Analyser/AnalyserTest.php

Lines changed: 13 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -628,7 +628,7 @@ private function runAnalyser(
628628
bool $enableIgnoreErrorsWithinPhpDocs = true,
629629
): array
630630
{
631-
$analyser = $this->createAnalyser($reportUnmatchedIgnoredErrors, $enableIgnoreErrorsWithinPhpDocs);
631+
$analyser = $this->createAnalyser($enableIgnoreErrorsWithinPhpDocs);
632632

633633
if (is_string($filePaths)) {
634634
$filePaths = [$filePaths];
@@ -648,6 +648,17 @@ private function runAnalyser(
648648

649649
$analyserResult = $analyser->analyse($normalizedFilePaths);
650650

651+
$finalizer = new AnalyserResultFinalizer(
652+
new DirectRuleRegistry([]),
653+
new RuleErrorTransformer(),
654+
$this->createScopeFactory(
655+
$this->createReflectionProvider(),
656+
self::getContainer()->getService('typeSpecifier'),
657+
),
658+
$reportUnmatchedIgnoredErrors,
659+
);
660+
$analyserResult = $finalizer->finalize($analyserResult, $onlyFiles);
661+
651662
$ignoredErrorHelperProcessedResult = $ignoredErrorHelperResult->process($analyserResult->getErrors(), $onlyFiles, $normalizedFilePaths, $analyserResult->hasReachedInternalErrorsCountLimit());
652663
$errors = $ignoredErrorHelperProcessedResult->getNotIgnoredErrors();
653664
$errors = array_merge($errors, $ignoredErrorHelperProcessedResult->getOtherIgnoreMessages());
@@ -661,7 +672,7 @@ private function runAnalyser(
661672
);
662673
}
663674

664-
private function createAnalyser(bool $reportUnmatchedIgnoredErrors, bool $enableIgnoreErrorsWithinPhpDocs): Analyser
675+
private function createAnalyser(bool $enableIgnoreErrorsWithinPhpDocs): Analyser
665676
{
666677
$ruleRegistry = new DirectRuleRegistry([
667678
new AlwaysFailRule(),
@@ -716,7 +727,6 @@ private function createAnalyser(bool $reportUnmatchedIgnoredErrors, bool $enable
716727
new DependencyResolver($fileHelper, $reflectionProvider, new ExportedNodeResolver($fileTypeMapper, new ExprPrinter(new Printer())), $fileTypeMapper),
717728
new RuleErrorTransformer(),
718729
new LocalIgnoresProcessor(),
719-
$reportUnmatchedIgnoredErrors,
720730
);
721731

722732
return new Analyser(

0 commit comments

Comments
 (0)