@@ -19,7 +19,7 @@ use rustc_ast::tokenstream::TokenStream;
1919use rustc_ast:: { AttrItem , Attribute , MetaItem } ;
2020use rustc_ast_pretty:: pprust;
2121use rustc_data_structures:: sync:: Lrc ;
22- use rustc_errors:: { Diagnostic , PResult } ;
22+ use rustc_errors:: { DiagnosticBuilder , FatalError , PResult } ;
2323use rustc_session:: parse:: ParseSess ;
2424use rustc_span:: { FileName , SourceFile , Span } ;
2525
@@ -45,14 +45,13 @@ rustc_fluent_macro::fluent_messages! { "../messages.ftl" }
4545/// A variant of 'panictry!' that works on a `Vec<Diagnostic>` instead of a single
4646/// `DiagnosticBuilder`.
4747macro_rules! panictry_buffer {
48- ( $handler: expr, $e: expr) => { {
49- use rustc_errors:: FatalError ;
48+ ( $e: expr) => { {
5049 use std:: result:: Result :: { Err , Ok } ;
5150 match $e {
5251 Ok ( e) => e,
5352 Err ( errs) => {
5453 for e in errs {
55- $handler . emit_diagnostic ( e ) ;
54+ e . emit ( ) ;
5655 }
5756 FatalError . raise( )
5857 }
@@ -100,16 +99,17 @@ pub fn parse_stream_from_source_str(
10099
101100/// Creates a new parser from a source string.
102101pub fn new_parser_from_source_str ( sess : & ParseSess , name : FileName , source : String ) -> Parser < ' _ > {
103- panictry_buffer ! ( & sess . dcx , maybe_new_parser_from_source_str( sess, name, source) )
102+ panictry_buffer ! ( maybe_new_parser_from_source_str( sess, name, source) )
104103}
105104
106105/// Creates a new parser from a source string. Returns any buffered errors from lexing the initial
107- /// token stream.
106+ /// token stream; these must be consumed via `emit`, `cancel`, etc., otherwise a panic will occur
107+ /// when they are dropped.
108108pub fn maybe_new_parser_from_source_str (
109109 sess : & ParseSess ,
110110 name : FileName ,
111111 source : String ,
112- ) -> Result < Parser < ' _ > , Vec < Diagnostic > > {
112+ ) -> Result < Parser < ' _ > , Vec < DiagnosticBuilder < ' _ > > > {
113113 maybe_source_file_to_parser ( sess, sess. source_map ( ) . new_source_file ( name, source) )
114114}
115115
@@ -125,15 +125,15 @@ pub fn new_parser_from_file<'a>(sess: &'a ParseSess, path: &Path, sp: Option<Spa
125125 err. emit ( ) ;
126126 } ) ;
127127
128- panictry_buffer ! ( & sess . dcx , maybe_source_file_to_parser( sess, source_file) )
128+ panictry_buffer ! ( maybe_source_file_to_parser( sess, source_file) )
129129}
130130
131131/// Given a session and a `source_file`, return a parser. Returns any buffered errors from lexing
132132/// the initial token stream.
133133fn maybe_source_file_to_parser (
134134 sess : & ParseSess ,
135135 source_file : Lrc < SourceFile > ,
136- ) -> Result < Parser < ' _ > , Vec < Diagnostic > > {
136+ ) -> Result < Parser < ' _ > , Vec < DiagnosticBuilder < ' _ > > > {
137137 let end_pos = source_file. end_position ( ) ;
138138 let stream = maybe_file_to_stream ( sess, source_file, None ) ?;
139139 let mut parser = stream_to_parser ( sess, stream, None ) ;
@@ -152,16 +152,16 @@ pub fn source_file_to_stream(
152152 source_file : Lrc < SourceFile > ,
153153 override_span : Option < Span > ,
154154) -> TokenStream {
155- panictry_buffer ! ( & sess . dcx , maybe_file_to_stream( sess, source_file, override_span) )
155+ panictry_buffer ! ( maybe_file_to_stream( sess, source_file, override_span) )
156156}
157157
158158/// Given a source file, produces a sequence of token trees. Returns any buffered errors from
159159/// parsing the token stream.
160- fn maybe_file_to_stream (
161- sess : & ParseSess ,
160+ fn maybe_file_to_stream < ' sess > (
161+ sess : & ' sess ParseSess ,
162162 source_file : Lrc < SourceFile > ,
163163 override_span : Option < Span > ,
164- ) -> Result < TokenStream , Vec < Diagnostic > > {
164+ ) -> Result < TokenStream , Vec < DiagnosticBuilder < ' sess > > > {
165165 let src = source_file. src . as_ref ( ) . unwrap_or_else ( || {
166166 sess. dcx . bug ( format ! (
167167 "cannot lex `source_file` without source: {}" ,
0 commit comments