@@ -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
@@ -604,30 +604,41 @@ fn parse_crate(
604
604
) -> Result < ast:: Crate , ErrorKind > {
605
605
let input_is_stdin = input. is_text ( ) ;
606
606
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 (
607
+ let parser = match input {
608
+ Input :: File ( file) => Ok ( parse:: new_parser_from_file ( parse_session, & file) ) ,
609
+ Input :: Text ( text) => parse:: maybe_new_parser_from_source_str (
610
610
parse_session,
611
611
syntax:: source_map:: FileName :: Custom ( "stdin" . to_owned ( ) ) ,
612
612
text,
613
- ) ,
613
+ )
614
+ . map_err ( |diags| {
615
+ diags
616
+ . into_iter ( )
617
+ . map ( |d| DiagnosticBuilder :: new_diagnostic ( & parse_session. span_diagnostic , d) )
618
+ . collect :: < Vec < _ > > ( )
619
+ } ) ,
614
620
} ;
615
621
616
- parser. cfg_mods = false ;
617
- if config. skip_children ( ) {
618
- parser. recurse_into_file_modules = false ;
619
- }
622
+ let result = match parser {
623
+ Ok ( mut parser) => {
624
+ parser. cfg_mods = false ;
625
+ if config. skip_children ( ) {
626
+ parser. recurse_into_file_modules = false ;
627
+ }
620
628
621
- let mut parser = AssertUnwindSafe ( parser) ;
622
- let result = catch_unwind ( move || parser. 0 . parse_crate_mod ( ) ) ;
629
+ let mut parser = AssertUnwindSafe ( parser) ;
630
+ catch_unwind ( move || parser. 0 . parse_crate_mod ( ) . map_err ( |d| vec ! [ d] ) )
631
+ }
632
+ Err ( db) => Ok ( Err ( db) ) ,
633
+ } ;
623
634
624
635
match result {
625
636
Ok ( Ok ( c) ) => {
626
637
if !parse_session. span_diagnostic . has_errors ( ) {
627
638
return Ok ( c) ;
628
639
}
629
640
}
630
- Ok ( Err ( mut e ) ) => e . emit ( ) ,
641
+ Ok ( Err ( mut diagnostics ) ) => diagnostics . iter_mut ( ) . for_each ( |d| d . emit ( ) ) ,
631
642
Err ( _) => {
632
643
// Note that if you see this message and want more information,
633
644
// then run the `parse_crate_mod` function above without
0 commit comments