Skip to content

Commit 108277a

Browse files
committed
Catch Throwable from CollectedDataNode rules
1 parent 4157333 commit 108277a

File tree

7 files changed

+28
-6
lines changed

7 files changed

+28
-6
lines changed

phpstan-baseline.neon

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,10 @@
11
parameters:
22
ignoreErrors:
3+
-
4+
message: "#^Method PHPStan\\\\Analyser\\\\AnalyserResultFinalizer\\:\\:finalize\\(\\) throws checked exception Throwable but it's missing from the PHPDoc @throws tag\\.$#"
5+
count: 1
6+
path: src/Analyser/AnalyserResultFinalizer.php
7+
38
-
49
message: "#^Function is_a\\(\\) is a runtime reflection concept that might not work in PHPStan because it uses fully static reflection engine\\. Use objects retrieved from ReflectionProvider instead\\.$#"
510
count: 1

src/Analyser/AnalyserResultFinalizer.php

Lines changed: 18 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,8 +8,10 @@
88
use PHPStan\BetterReflection\Reflector\Exception\IdentifierNotFound;
99
use PHPStan\Node\CollectedDataNode;
1010
use PHPStan\Rules\Registry as RuleRegistry;
11+
use Throwable;
1112
use function array_merge;
1213
use function count;
14+
use function get_class;
1315
use function sprintf;
1416

1517
class AnalyserResultFinalizer
@@ -25,7 +27,7 @@ public function __construct(
2527
{
2628
}
2729

28-
public function finalize(AnalyserResult $analyserResult, bool $onlyFiles): FinalizerResult
30+
public function finalize(AnalyserResult $analyserResult, bool $onlyFiles, bool $debug): FinalizerResult
2931
{
3032
if (count($analyserResult->getCollectedData()) === 0) {
3133
return $this->addUnmatchedIgnoredErrors($this->mergeFilteredPhpErrors($analyserResult), [], []);
@@ -42,6 +44,7 @@ public function finalize(AnalyserResult $analyserResult, bool $onlyFiles): Final
4244
$file = 'N/A';
4345
$scope = $this->scopeFactory->create(ScopeContext::create($file));
4446
$tempCollectorErrors = [];
47+
$internalErrors = $analyserResult->getInternalErrors();
4548
foreach ($this->ruleRegistry->getRules($nodeType) as $rule) {
4649
try {
4750
$ruleErrors = $rule->processNode($node, $scope);
@@ -69,6 +72,19 @@ public function finalize(AnalyserResult $analyserResult, bool $onlyFiles): Final
6972
InternalError::STACK_TRACE_AS_STRING_METADATA_KEY => $e->getTraceAsString(),
7073
]);
7174
continue;
75+
} catch (Throwable $t) {
76+
if ($debug) {
77+
throw $t;
78+
}
79+
80+
$internalErrors[] = new InternalError(
81+
$t->getMessage(),
82+
sprintf('running CollectedDataNode rule %s', get_class($rule)),
83+
InternalError::prepareTrace($t),
84+
$t->getTraceAsString(),
85+
true,
86+
);
87+
continue;
7288
}
7389

7490
foreach ($ruleErrors as $ruleError) {
@@ -110,7 +126,7 @@ public function finalize(AnalyserResult $analyserResult, bool $onlyFiles): Final
110126
$locallyIgnoredErrors,
111127
$allLinesToIgnore,
112128
$allUnmatchedLineIgnores,
113-
$analyserResult->getInternalErrors(),
129+
$internalErrors,
114130
$analyserResult->getCollectedData(),
115131
$analyserResult->getDependencies(),
116132
$analyserResult->getExportedNodes(),

src/Command/AnalyseApplication.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -102,7 +102,7 @@ public function analyse(
102102
}
103103

104104
$resultCacheResult = $resultCacheManager->process($intermediateAnalyserResult, $resultCache, $errorOutput, $onlyFiles, true);
105-
$analyserResult = $this->analyserResultFinalizer->finalize($resultCacheResult->getAnalyserResult(), $onlyFiles)->getAnalyserResult();
105+
$analyserResult = $this->analyserResultFinalizer->finalize($resultCacheResult->getAnalyserResult(), $onlyFiles, $debug)->getAnalyserResult();
106106
$internalErrors = $analyserResult->getInternalErrors();
107107
$errors = array_merge(
108108
$analyserResult->getErrors(),

src/Command/FixerWorkerCommand.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -231,7 +231,7 @@ function (array $errors, array $locallyIgnoredErrors, array $analysedFiles) use
231231
false,
232232
true,
233233
)->getAnalyserResult();
234-
$finalizerResult = $analyserResultFinalizer->finalize($analyserResult, $isOnlyFiles);
234+
$finalizerResult = $analyserResultFinalizer->finalize($analyserResult, $isOnlyFiles, false);
235235

236236
$internalErrors = [];
237237
foreach ($finalizerResult->getAnalyserResult()->getInternalErrors() as $internalError) {

src/Testing/RuleTestCase.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -195,7 +195,7 @@ public function gatherAnalyserErrors(array $files): array
195195
true,
196196
);
197197

198-
return $finalizer->finalize($analyserResult, false)->getAnalyserResult()->getUnorderedErrors();
198+
return $finalizer->finalize($analyserResult, false, true)->getAnalyserResult()->getUnorderedErrors();
199199
}
200200

201201
protected function shouldPolluteScopeWithLoopInitialAssignments(): bool

tests/PHPStan/Analyser/AnalyserIntegrationTest.php

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1397,6 +1397,7 @@ private function runAnalyse(string $file, ?array $allAnalysedFiles = null): arra
13971397
$errors = $finalizer->finalize(
13981398
$analyser->analyse([$file], null, null, true, $allAnalysedFiles),
13991399
false,
1400+
true,
14001401
)->getErrors();
14011402
foreach ($errors as $error) {
14021403
$this->assertSame($file, $error->getFilePath());

tests/PHPStan/Analyser/AnalyserTest.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -685,7 +685,7 @@ private function runAnalyser(
685685
new LocalIgnoresProcessor(),
686686
$reportUnmatchedIgnoredErrors,
687687
);
688-
$analyserResult = $finalizer->finalize($analyserResult, $onlyFiles)->getAnalyserResult();
688+
$analyserResult = $finalizer->finalize($analyserResult, $onlyFiles, false)->getAnalyserResult();
689689

690690
$ignoredErrorHelperProcessedResult = $ignoredErrorHelperResult->process($analyserResult->getErrors(), $onlyFiles, $normalizedFilePaths, $analyserResult->hasReachedInternalErrorsCountLimit());
691691
$errors = $ignoredErrorHelperProcessedResult->getNotIgnoredErrors();

0 commit comments

Comments
 (0)