@@ -15,7 +15,7 @@ use ast::{self, CrateConfig, NodeId};
1515use early_buffered_lints:: { BufferedEarlyLint , BufferedEarlyLintId } ;
1616use source_map:: { SourceMap , FilePathMapping } ;
1717use syntax_pos:: { Span , SourceFile , FileName , MultiSpan } ;
18- use errors:: { Handler , ColorConfig , DiagnosticBuilder } ;
18+ use errors:: { Handler , ColorConfig , Diagnostic , DiagnosticBuilder } ;
1919use feature_gate:: UnstableFeatures ;
2020use parse:: parser:: Parser ;
2121use ptr:: P ;
@@ -174,14 +174,25 @@ pub fn parse_stream_from_source_str(name: FileName, source: String, sess: &Parse
174174 source_file_to_stream ( sess, sess. source_map ( ) . new_source_file ( name, source) , override_span)
175175}
176176
177- // Create a new parser from a source string
177+ /// Create a new parser from a source string
178178pub fn new_parser_from_source_str ( sess : & ParseSess , name : FileName , source : String )
179179 -> Parser {
180180 let mut parser = source_file_to_parser ( sess, sess. source_map ( ) . new_source_file ( name, source) ) ;
181181 parser. recurse_into_file_modules = false ;
182182 parser
183183}
184184
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+
185196/// Create a new parser, handling errors as appropriate
186197/// if the file doesn't exist
187198pub 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
214225 parser
215226}
216227
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+
217243// must preserve old name for now, because quote! from the *existing*
218244// compiler expands into it
219245pub fn new_parser_from_tts ( sess : & ParseSess , tts : Vec < TokenTree > ) -> Parser {
@@ -248,6 +274,24 @@ pub fn source_file_to_stream(sess: &ParseSess,
248274 panictry ! ( srdr. parse_all_token_trees( ) )
249275}
250276
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+
251295/// Given stream and the `ParseSess`, produce a parser
252296pub fn stream_to_parser ( sess : & ParseSess , stream : TokenStream ) -> Parser {
253297 Parser :: new ( sess, stream, None , true , false )
0 commit comments