Skip to content

Commit e31325b

Browse files
Don't break processing if a single file fails. (#24)
1 parent e9ec3d3 commit e31325b

6 files changed

Lines changed: 82 additions & 4 deletions

File tree

src/Application.php

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,13 +9,15 @@
99
use Phauthentic\CognitiveCodeAnalysis\Business\Cognitive\Baseline;
1010
use Phauthentic\CognitiveCodeAnalysis\Business\Cognitive\CognitiveMetricsCollector;
1111
use Phauthentic\CognitiveCodeAnalysis\Business\Cognitive\Events\FileProcessed;
12+
use Phauthentic\CognitiveCodeAnalysis\Business\Cognitive\Events\ParserFailed;
1213
use Phauthentic\CognitiveCodeAnalysis\Business\Cognitive\Events\SourceFilesFound;
1314
use Phauthentic\CognitiveCodeAnalysis\Business\Cognitive\Parser;
1415
use Phauthentic\CognitiveCodeAnalysis\Business\Cognitive\ScoreCalculator;
1516
use Phauthentic\CognitiveCodeAnalysis\Business\DirectoryScanner;
1617
use Phauthentic\CognitiveCodeAnalysis\Business\MetricsFacade;
1718
use Phauthentic\CognitiveCodeAnalysis\Command\ChurnCommand;
1819
use Phauthentic\CognitiveCodeAnalysis\Command\CognitiveMetricsCommand;
20+
use Phauthentic\CognitiveCodeAnalysis\Command\EventHandler\ParserErrorHandler;
1921
use Phauthentic\CognitiveCodeAnalysis\Command\EventHandler\ProgressBarHandler;
2022
use Phauthentic\CognitiveCodeAnalysis\Command\EventHandler\VerboseHandler;
2123
use Phauthentic\CognitiveCodeAnalysis\Command\Handler\ChurnReportHandler;
@@ -177,6 +179,9 @@ private function configureEventBus(): void
177179
$progressbar,
178180
$verbose
179181
],
182+
ParserFailed::class => [
183+
new ParserErrorHandler($this->get(OutputInterface::class))
184+
],
180185
]);
181186

182187
$messageBus = new MessageBus([

src/Business/Cognitive/CognitiveMetricsCollector.php

Lines changed: 14 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
namespace Phauthentic\CognitiveCodeAnalysis\Business\Cognitive;
66

77
use Phauthentic\CognitiveCodeAnalysis\Business\Cognitive\Events\FileProcessed;
8+
use Phauthentic\CognitiveCodeAnalysis\Business\Cognitive\Events\ParserFailed;
89
use Phauthentic\CognitiveCodeAnalysis\Business\Cognitive\Events\SourceFilesFound;
910
use Phauthentic\CognitiveCodeAnalysis\Business\DirectoryScanner;
1011
use Phauthentic\CognitiveCodeAnalysis\CognitiveAnalysisException;
@@ -13,6 +14,7 @@
1314
use SplFileInfo;
1415
use Symfony\Component\Messenger\Exception\ExceptionInterface;
1516
use Symfony\Component\Messenger\MessageBusInterface;
17+
use Throwable;
1618

1719
/**
1820
* CognitiveMetricsCollector class that collects cognitive metrics from source files
@@ -69,16 +71,24 @@ private function getCodeFromFile(SplFileInfo $file): string
6971
*
7072
* @param iterable<SplFileInfo> $files
7173
* @return CognitiveMetricsCollection
72-
* @throws CognitiveAnalysisException|ExceptionInterface
74+
* @throws ExceptionInterface
7375
*/
7476
private function findMetrics(iterable $files): CognitiveMetricsCollection
7577
{
7678
$metricsCollection = new CognitiveMetricsCollection();
7779

7880
foreach ($files as $file) {
79-
$metrics = $this->parser->parse(
80-
$this->getCodeFromFile($file)
81-
);
81+
try {
82+
$metrics = $this->parser->parse(
83+
$this->getCodeFromFile($file)
84+
);
85+
} catch (Throwable $exception) {
86+
$this->messageBus->dispatch(new ParserFailed(
87+
$file,
88+
$exception
89+
));
90+
continue;
91+
}
8292

8393
$metricsCollection = $this->processMethodMetrics(
8494
$metrics,

src/Business/Cognitive/Events/FileProcessed.php

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
<?php
22

3+
declare(strict_types=1);
4+
35
namespace Phauthentic\CognitiveCodeAnalysis\Business\Cognitive\Events;
46

57
use SplFileInfo;
Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
<?php
2+
3+
declare(strict_types=1);
4+
5+
namespace Phauthentic\CognitiveCodeAnalysis\Business\Cognitive\Events;
6+
7+
use SplFileInfo;
8+
use Throwable;
9+
10+
/**
11+
*
12+
*/
13+
class ParserFailed
14+
{
15+
public function __construct(
16+
public readonly SplFileInfo $file,
17+
public readonly Throwable $throwable
18+
) {
19+
}
20+
}

src/Business/Cognitive/Events/SourceFilesFound.php

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
<?php
22

3+
declare(strict_types=1);
4+
35
namespace Phauthentic\CognitiveCodeAnalysis\Business\Cognitive\Events;
46

57
use SplFileInfo;
Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
<?php
2+
3+
declare(strict_types=1);
4+
5+
namespace Phauthentic\CognitiveCodeAnalysis\Command\EventHandler;
6+
7+
use Phauthentic\CognitiveCodeAnalysis\Business\Cognitive\Events\ParserFailed;
8+
use Symfony\Component\Console\Output\OutputInterface;
9+
10+
class ParserErrorHandler
11+
{
12+
public function __construct(
13+
private readonly OutputInterface $output,
14+
) {
15+
}
16+
17+
public function __invoke(ParserFailed $event): void
18+
{
19+
$this->output->writeln(
20+
sprintf(
21+
'<error>Parser failed for file %s: %s</error>',
22+
$event->file->getRealPath(),
23+
$event->throwable->getMessage()
24+
)
25+
);
26+
$this->output->writeln(
27+
sprintf(
28+
'<comment>Stack trace:</comment> %s',
29+
$event->throwable->getTraceAsString()
30+
)
31+
);
32+
$this->output->writeln(
33+
sprintf(
34+
'<info>Please create an issue on Github and provide the code that could not pe parsed.</info> %s',
35+
$event->throwable->getTraceAsString()
36+
)
37+
);
38+
}
39+
}

0 commit comments

Comments
 (0)