@@ -26,8 +26,9 @@ use swc_core::common::source_map::SourceMapGenConfig;
26
26
use swc_core:: common:: { chain, sync:: Lrc , FileName , Globals , Mark , SourceMap } ;
27
27
use swc_core:: ecma:: ast:: { Module , ModuleItem , Program } ;
28
28
use swc_core:: ecma:: codegen:: text_writer:: JsWriter ;
29
+ use swc_core:: ecma:: parser:: error:: Error ;
29
30
use swc_core:: ecma:: parser:: lexer:: Lexer ;
30
- use swc_core:: ecma:: parser:: { EsConfig , PResult , Parser , StringInput , Syntax , TsConfig } ;
31
+ use swc_core:: ecma:: parser:: { EsConfig , Parser , StringInput , Syntax , TsConfig } ;
31
32
use swc_core:: ecma:: preset_env:: { preset_env, Mode :: Entry , Targets , Version , Versions } ;
32
33
use swc_core:: ecma:: transforms:: base:: fixer:: paren_remover;
33
34
use swc_core:: ecma:: transforms:: base:: helpers;
@@ -158,10 +159,12 @@ pub fn transform(
158
159
) ;
159
160
160
161
match module {
161
- Err ( err ) => {
162
+ Err ( errs ) => {
162
163
let error_buffer = ErrorBuffer :: default ( ) ;
163
164
let handler = Handler :: with_emitter ( true , false , Box :: new ( error_buffer. clone ( ) ) ) ;
164
- err. into_diagnostic ( & handler) . emit ( ) ;
165
+ for err in errs {
166
+ err. into_diagnostic ( & handler) . emit ( ) ;
167
+ }
165
168
166
169
result. diagnostics = Some ( error_buffer_to_diagnostics ( & error_buffer, & source_map) ) ;
167
170
Ok ( result)
@@ -514,13 +517,15 @@ pub fn transform(
514
517
}
515
518
}
516
519
520
+ pub type ParseResult < T > = Result < T , Vec < Error > > ;
521
+
517
522
fn parse (
518
523
code : & str ,
519
524
project_root : & str ,
520
525
filename : & str ,
521
526
source_map : & Lrc < SourceMap > ,
522
527
config : & Config ,
523
- ) -> PResult < ( Program , SingleThreadedComments ) > {
528
+ ) -> ParseResult < ( Program , SingleThreadedComments ) > {
524
529
// Attempt to convert the path to be relative to the project root.
525
530
// If outside the project root, use an absolute path so that if the project root moves the path still works.
526
531
let filename: PathBuf = if let Ok ( relative) = Path :: new ( filename) . strip_prefix ( project_root) {
@@ -543,6 +548,7 @@ fn parse(
543
548
export_default_from : true ,
544
549
decorators : config. decorators ,
545
550
import_attributes : true ,
551
+ allow_return_outside_function : true ,
546
552
..Default :: default ( )
547
553
} )
548
554
} ;
@@ -555,10 +561,22 @@ fn parse(
555
561
) ;
556
562
557
563
let mut parser = Parser :: new_from ( lexer) ;
558
- match parser. parse_program ( ) {
559
- Err ( err) => Err ( err) ,
560
- Ok ( module) => Ok ( ( module, comments) ) ,
564
+ let result = parser. parse_program ( ) ;
565
+
566
+ let module = match result {
567
+ Err ( err) => {
568
+ // A fatal error
569
+ return Err ( vec ! [ err] ) ;
570
+ }
571
+ Ok ( module) => module,
572
+ } ;
573
+ // Recoverable errors
574
+ let errors = parser. take_errors ( ) ;
575
+ if !errors. is_empty ( ) {
576
+ return Err ( errors) ;
561
577
}
578
+
579
+ Ok ( ( module, comments) )
562
580
}
563
581
564
582
fn emit (
0 commit comments