@@ -66,8 +66,11 @@ impl<'a> ParserBuilder<'a> {
66
66
let parser = match Self :: parser ( sess. inner ( ) , input) {
67
67
Ok ( p) => p,
68
68
Err ( db) => {
69
- sess. emit_diagnostics ( db) ;
70
- return Err ( ParserError :: ParserCreationError ) ;
69
+ if let Some ( diagnostics) = db {
70
+ sess. emit_diagnostics ( diagnostics) ;
71
+ return Err ( ParserError :: ParserCreationError ) ;
72
+ }
73
+ return Err ( ParserError :: ParsePanicError ) ;
71
74
}
72
75
} ;
73
76
@@ -77,14 +80,18 @@ impl<'a> ParserBuilder<'a> {
77
80
fn parser (
78
81
sess : & ' a rustc_session:: parse:: ParseSess ,
79
82
input : Input ,
80
- ) -> Result < rustc_parse:: parser:: Parser < ' a > , Vec < Diagnostic > > {
83
+ ) -> Result < rustc_parse:: parser:: Parser < ' a > , Option < Vec < Diagnostic > > > {
81
84
match input {
82
- Input :: File ( ref file) => Ok ( new_parser_from_file ( sess, file, None ) ) ,
85
+ Input :: File ( ref file) => catch_unwind ( AssertUnwindSafe ( move || {
86
+ new_parser_from_file ( sess, file, None )
87
+ } ) )
88
+ . map_err ( |_| None ) ,
83
89
Input :: Text ( text) => rustc_parse:: maybe_new_parser_from_source_str (
84
90
sess,
85
91
rustc_span:: FileName :: Custom ( "stdin" . to_owned ( ) ) ,
86
92
text,
87
- ) ,
93
+ )
94
+ . map_err ( |db| Some ( db) ) ,
88
95
}
89
96
}
90
97
}
@@ -121,7 +128,7 @@ impl<'a> Parser<'a> {
121
128
match parser. parse_mod ( & TokenKind :: Eof , ast:: Unsafe :: No ) {
122
129
Ok ( result) => Some ( result) ,
123
130
Err ( mut e) => {
124
- e . cancel ( ) ;
131
+ sess . emit_or_cancel_diagnostic ( & mut e ) ;
125
132
if sess. can_reset_errors ( ) {
126
133
sess. reset_errors ( ) ;
127
134
}
0 commit comments