1- import { getProcessLogger as getLogger , Logger } from '~src/utils/logger'
2-
3- import { IsolatedAnalyzerOutput , EarlyFinalization } from '~src/output/IsolatedAnalyzerOutput' ;
1+ import { NoSourceError } from '~src/errors/NoSourceError' ;
2+ import { ParserError } from '~src/errors/ParserError' ;
3+ import { EarlyFinalization , IsolatedAnalyzerOutput } from '~src/output/IsolatedAnalyzerOutput' ;
4+ import { getProcessLogger as getLogger , Logger } from '~src/utils/logger' ;
5+ import { makeNoSourceOutput } from '~src/output/makeNoSourceOutput' ;
6+ import { makeParseErrorOutput } from '~src/output/makeParseErrorOutput' ;
47
58export abstract class IsolatedAnalyzerImpl implements Analyzer {
69 protected readonly logger : Logger
@@ -23,9 +26,31 @@ export abstract class IsolatedAnalyzerImpl implements Analyzer {
2326 * @memberof BaseAnalyzer
2427 */
2528 public async run ( input : Input ) : Promise < Output > {
29+ return this . run_ ( input )
30+ . catch ( ( err : Error ) => {
31+
32+ // Here we handle errors that blew up the analyzer but we don't want to
33+ // report as blown up. This converts these errors to the commentary.
34+ if ( err instanceof NoSourceError ) {
35+ return makeNoSourceOutput ( err )
36+ } else if ( err instanceof ParserError ) {
37+ return makeParseErrorOutput ( err )
38+ }
39+
40+ // Unhandled issue
41+ return Promise . reject ( err )
42+ } )
43+ }
44+
45+ private async run_ ( input : Input ) : Promise < Output > {
2646 const output = new IsolatedAnalyzerOutput ( )
47+
48+ // Block and execute
2749 await this . execute ( input , output )
2850 . catch ( ( err ) : void | never => {
51+
52+ // The isolated analyzer output can use exceptions as control flow.
53+ // This block here explicitely accepts this.
2954 if ( err instanceof EarlyFinalization ) {
3055 this . logger . log ( `=> early finialization (${ output . status } )` )
3156 } else {
0 commit comments