@@ -15,7 +15,7 @@ use ast::{self, CrateConfig, NodeId};
15
15
use early_buffered_lints:: { BufferedEarlyLint , BufferedEarlyLintId } ;
16
16
use source_map:: { SourceMap , FilePathMapping } ;
17
17
use syntax_pos:: { Span , SourceFile , FileName , MultiSpan } ;
18
- use errors:: { Handler , ColorConfig , DiagnosticBuilder } ;
18
+ use errors:: { Handler , ColorConfig , Diagnostic , DiagnosticBuilder } ;
19
19
use feature_gate:: UnstableFeatures ;
20
20
use parse:: parser:: Parser ;
21
21
use ptr:: P ;
@@ -174,14 +174,25 @@ pub fn parse_stream_from_source_str(name: FileName, source: String, sess: &Parse
174
174
source_file_to_stream ( sess, sess. source_map ( ) . new_source_file ( name, source) , override_span)
175
175
}
176
176
177
- // Create a new parser from a source string
177
+ /// Create a new parser from a source string
178
178
pub fn new_parser_from_source_str ( sess : & ParseSess , name : FileName , source : String )
179
179
-> Parser {
180
180
let mut parser = source_file_to_parser ( sess, sess. source_map ( ) . new_source_file ( name, source) ) ;
181
181
parser. recurse_into_file_modules = false ;
182
182
parser
183
183
}
184
184
185
+ /// Create a new parser from a source string. Returns any buffered errors from lexing the initial
186
+ /// token stream.
187
+ pub fn maybe_new_parser_from_source_str ( sess : & ParseSess , name : FileName , source : String )
188
+ -> Result < Parser , Vec < Diagnostic > >
189
+ {
190
+ let mut parser = maybe_source_file_to_parser ( sess,
191
+ sess. source_map ( ) . new_source_file ( name, source) ) ?;
192
+ parser. recurse_into_file_modules = false ;
193
+ Ok ( parser)
194
+ }
195
+
185
196
/// Create a new parser, handling errors as appropriate
186
197
/// if the file doesn't exist
187
198
pub fn new_parser_from_file < ' a > ( sess : & ' a ParseSess , path : & Path ) -> Parser < ' a > {
@@ -214,6 +225,21 @@ fn source_file_to_parser(sess: & ParseSess, source_file: Lrc<SourceFile>) -> Par
214
225
parser
215
226
}
216
227
228
+ /// Given a source_file and config, return a parser. Returns any buffered errors from lexing the
229
+ /// initial token stream.
230
+ fn maybe_source_file_to_parser ( sess : & ParseSess , source_file : Lrc < SourceFile > )
231
+ -> Result < Parser , Vec < Diagnostic > >
232
+ {
233
+ let end_pos = source_file. end_pos ;
234
+ let mut parser = stream_to_parser ( sess, maybe_file_to_stream ( sess, source_file, None ) ?) ;
235
+
236
+ if parser. token == token:: Eof && parser. span . is_dummy ( ) {
237
+ parser. span = Span :: new ( end_pos, end_pos, parser. span . ctxt ( ) ) ;
238
+ }
239
+
240
+ Ok ( parser)
241
+ }
242
+
217
243
// must preserve old name for now, because quote! from the *existing*
218
244
// compiler expands into it
219
245
pub fn new_parser_from_tts ( sess : & ParseSess , tts : Vec < TokenTree > ) -> Parser {
@@ -248,6 +274,24 @@ pub fn source_file_to_stream(sess: &ParseSess,
248
274
panictry ! ( srdr. parse_all_token_trees( ) )
249
275
}
250
276
277
+ /// Given a source file, produce a sequence of token-trees. Returns any buffered errors from
278
+ /// parsing the token tream.
279
+ pub fn maybe_file_to_stream ( sess : & ParseSess ,
280
+ source_file : Lrc < SourceFile > ,
281
+ override_span : Option < Span > ) -> Result < TokenStream , Vec < Diagnostic > > {
282
+ let mut srdr = lexer:: StringReader :: new_or_buffered_errs ( sess, source_file, override_span) ?;
283
+ srdr. real_token ( ) ;
284
+
285
+ match srdr. parse_all_token_trees ( ) {
286
+ Ok ( stream) => Ok ( stream) ,
287
+ Err ( err) => {
288
+ let mut buffer = Vec :: with_capacity ( 1 ) ;
289
+ err. buffer ( & mut buffer) ;
290
+ Err ( buffer)
291
+ }
292
+ }
293
+ }
294
+
251
295
/// Given stream and the `ParseSess`, produce a parser
252
296
pub fn stream_to_parser ( sess : & ParseSess , stream : TokenStream ) -> Parser {
253
297
Parser :: new ( sess, stream, None , true , false )
0 commit comments