@@ -19,7 +19,7 @@ use rustc_ast::tokenstream::TokenStream;
19
19
use rustc_ast:: { AttrItem , Attribute , MetaItem } ;
20
20
use rustc_ast_pretty:: pprust;
21
21
use rustc_data_structures:: sync:: Lrc ;
22
- use rustc_errors:: { Diagnostic , PResult } ;
22
+ use rustc_errors:: { DiagnosticBuilder , FatalError , PResult } ;
23
23
use rustc_session:: parse:: ParseSess ;
24
24
use rustc_span:: { FileName , SourceFile , Span } ;
25
25
@@ -45,14 +45,13 @@ rustc_fluent_macro::fluent_messages! { "../messages.ftl" }
45
45
/// A variant of 'panictry!' that works on a `Vec<Diagnostic>` instead of a single
46
46
/// `DiagnosticBuilder`.
47
47
macro_rules! panictry_buffer {
48
- ( $handler: expr, $e: expr) => { {
49
- use rustc_errors:: FatalError ;
48
+ ( $e: expr) => { {
50
49
use std:: result:: Result :: { Err , Ok } ;
51
50
match $e {
52
51
Ok ( e) => e,
53
52
Err ( errs) => {
54
53
for e in errs {
55
- $handler . emit_diagnostic ( e ) ;
54
+ e . emit ( ) ;
56
55
}
57
56
FatalError . raise( )
58
57
}
@@ -100,16 +99,17 @@ pub fn parse_stream_from_source_str(
100
99
101
100
/// Creates a new parser from a source string.
102
101
pub 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) )
104
103
}
105
104
106
105
/// 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.
108
108
pub fn maybe_new_parser_from_source_str (
109
109
sess : & ParseSess ,
110
110
name : FileName ,
111
111
source : String ,
112
- ) -> Result < Parser < ' _ > , Vec < Diagnostic > > {
112
+ ) -> Result < Parser < ' _ > , Vec < DiagnosticBuilder < ' _ > > > {
113
113
maybe_source_file_to_parser ( sess, sess. source_map ( ) . new_source_file ( name, source) )
114
114
}
115
115
@@ -125,15 +125,15 @@ pub fn new_parser_from_file<'a>(sess: &'a ParseSess, path: &Path, sp: Option<Spa
125
125
err. emit ( ) ;
126
126
} ) ;
127
127
128
- panictry_buffer ! ( & sess . dcx , maybe_source_file_to_parser( sess, source_file) )
128
+ panictry_buffer ! ( maybe_source_file_to_parser( sess, source_file) )
129
129
}
130
130
131
131
/// Given a session and a `source_file`, return a parser. Returns any buffered errors from lexing
132
132
/// the initial token stream.
133
133
fn maybe_source_file_to_parser (
134
134
sess : & ParseSess ,
135
135
source_file : Lrc < SourceFile > ,
136
- ) -> Result < Parser < ' _ > , Vec < Diagnostic > > {
136
+ ) -> Result < Parser < ' _ > , Vec < DiagnosticBuilder < ' _ > > > {
137
137
let end_pos = source_file. end_position ( ) ;
138
138
let stream = maybe_file_to_stream ( sess, source_file, None ) ?;
139
139
let mut parser = stream_to_parser ( sess, stream, None ) ;
@@ -152,16 +152,16 @@ pub fn source_file_to_stream(
152
152
source_file : Lrc < SourceFile > ,
153
153
override_span : Option < Span > ,
154
154
) -> 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) )
156
156
}
157
157
158
158
/// Given a source file, produces a sequence of token trees. Returns any buffered errors from
159
159
/// parsing the token stream.
160
- fn maybe_file_to_stream (
161
- sess : & ParseSess ,
160
+ fn maybe_file_to_stream < ' sess > (
161
+ sess : & ' sess ParseSess ,
162
162
source_file : Lrc < SourceFile > ,
163
163
override_span : Option < Span > ,
164
- ) -> Result < TokenStream , Vec < Diagnostic > > {
164
+ ) -> Result < TokenStream , Vec < DiagnosticBuilder < ' sess > > > {
165
165
let src = source_file. src . as_ref ( ) . unwrap_or_else ( || {
166
166
sess. dcx . bug ( format ! (
167
167
"cannot lex `source_file` without source: {}" ,
0 commit comments