]> git.lizzy.rs Git - rust.git/blobdiff - src/syntux/parser.rs
fix: resolve some parser related bugs
[rust.git] / src / syntux / parser.rs
index 78de08b993ecd75e05f82968ffcc63529c59badb..3a72fb6be881c958a431c4b538939c5f08a47a07 100644 (file)
@@ -65,8 +65,11 @@ pub(crate) fn build(self) -> Result<Parser<'a>, ParserError> {
         let parser = match Self::parser(sess.inner(), input) {
             Ok(p) => p,
             Err(db) => {
-                sess.emit_diagnostics(db);
-                return Err(ParserError::ParserCreationError);
+                if let Some(diagnostics) = db {
+                    sess.emit_diagnostics(diagnostics);
+                    return Err(ParserError::ParserCreationError);
+                }
+                return Err(ParserError::ParsePanicError);
             }
         };
 
@@ -76,14 +79,18 @@ pub(crate) fn build(self) -> Result<Parser<'a>, ParserError> {
     fn parser(
         sess: &'a rustc_session::parse::ParseSess,
         input: Input,
-    ) -> Result<rustc_parse::parser::Parser<'a>, Vec<Diagnostic>> {
+    ) -> Result<rustc_parse::parser::Parser<'a>, Option<Vec<Diagnostic>>> {
         match input {
-            Input::File(ref file) => Ok(new_parser_from_file(sess, file, None)),
+            Input::File(ref file) => catch_unwind(AssertUnwindSafe(move || {
+                new_parser_from_file(sess, file, None)
+            }))
+            .map_err(|_| None),
             Input::Text(text) => rustc_parse::maybe_new_parser_from_source_str(
                 sess,
                 rustc_span::FileName::Custom("stdin".to_owned()),
                 text,
-            ),
+            )
+            .map_err(|db| Some(db)),
         }
     }
 }
@@ -120,8 +127,10 @@ pub(crate) fn parse_file_as_module(
             match parser.parse_mod(&TokenKind::Eof, ast::Unsafe::No) {
                 Ok(result) => Some(result),
                 Err(mut e) => {
-                    e.cancel();
-                    sess.reset_errors();
+                    sess.emit_or_cancel_diagnostic(&mut e);
+                    if sess.can_reset_errors() {
+                        sess.reset_errors();
+                    }
                     None
                 }
             }