@@ -8,7 +8,7 @@ use std::time::{Duration, Instant};
8
8
9
9
use syntax:: ast;
10
10
use syntax:: errors:: emitter:: { ColorConfig , EmitterWriter } ;
11
- use syntax:: errors:: Handler ;
11
+ use syntax:: errors:: { DiagnosticBuilder , Handler } ;
12
12
use syntax:: parse:: { self , ParseSess } ;
13
13
use syntax:: source_map:: { FilePathMapping , SourceMap , Span } ;
14
14
@@ -73,7 +73,12 @@ fn format_project<T: FormatHandler>(
73
73
let source_map = Rc :: new ( SourceMap :: new ( FilePathMapping :: empty ( ) ) ) ;
74
74
let mut parse_session = make_parse_sess ( source_map. clone ( ) , config) ;
75
75
let mut report = FormatReport :: new ( ) ;
76
- let krate = parse_crate ( input, & parse_session, config, & mut report) ?;
76
+ let krate = match parse_crate ( input, & parse_session, config, & mut report) {
77
+ Ok ( krate) => krate,
78
+ // Surface parse error via Session (errors are merged there from report)
79
+ Err ( ErrorKind :: ParseError ) => return Ok ( report) ,
80
+ Err ( e) => return Err ( e) ,
81
+ } ;
77
82
timer = timer. done_parsing ( ) ;
78
83
79
84
// Suppress error output if we have to do any further parsing.
@@ -604,30 +609,41 @@ fn parse_crate(
604
609
) -> Result < ast:: Crate , ErrorKind > {
605
610
let input_is_stdin = input. is_text ( ) ;
606
611
607
- let mut parser = match input {
608
- Input :: File ( file) => parse:: new_parser_from_file ( parse_session, & file) ,
609
- Input :: Text ( text) => parse:: new_parser_from_source_str (
612
+ let parser = match input {
613
+ Input :: File ( file) => Ok ( parse:: new_parser_from_file ( parse_session, & file) ) ,
614
+ Input :: Text ( text) => parse:: maybe_new_parser_from_source_str (
610
615
parse_session,
611
616
syntax:: source_map:: FileName :: Custom ( "stdin" . to_owned ( ) ) ,
612
617
text,
613
- ) ,
618
+ )
619
+ . map_err ( |diags| {
620
+ diags
621
+ . into_iter ( )
622
+ . map ( |d| DiagnosticBuilder :: new_diagnostic ( & parse_session. span_diagnostic , d) )
623
+ . collect :: < Vec < _ > > ( )
624
+ } ) ,
614
625
} ;
615
626
616
- parser. cfg_mods = false ;
617
- if config. skip_children ( ) {
618
- parser. recurse_into_file_modules = false ;
619
- }
627
+ let result = match parser {
628
+ Ok ( mut parser) => {
629
+ parser. cfg_mods = false ;
630
+ if config. skip_children ( ) {
631
+ parser. recurse_into_file_modules = false ;
632
+ }
620
633
621
- let mut parser = AssertUnwindSafe ( parser) ;
622
- let result = catch_unwind ( move || parser. 0 . parse_crate_mod ( ) ) ;
634
+ let mut parser = AssertUnwindSafe ( parser) ;
635
+ catch_unwind ( move || parser. 0 . parse_crate_mod ( ) . map_err ( |d| vec ! [ d] ) )
636
+ }
637
+ Err ( db) => Ok ( Err ( db) ) ,
638
+ } ;
623
639
624
640
match result {
625
641
Ok ( Ok ( c) ) => {
626
642
if !parse_session. span_diagnostic . has_errors ( ) {
627
643
return Ok ( c) ;
628
644
}
629
645
}
630
- Ok ( Err ( mut e ) ) => e . emit ( ) ,
646
+ Ok ( Err ( mut diagnostics ) ) => diagnostics . iter_mut ( ) . for_each ( |d| d . emit ( ) ) ,
631
647
Err ( _) => {
632
648
// Note that if you see this message and want more information,
633
649
// then run the `parse_crate_mod` function above without
0 commit comments