@@ -48,12 +48,10 @@ use std::fs;
4848use std:: io:: { self , Write } ;
4949use std:: path:: { Path , PathBuf } ;
5050use syntax:: ast:: { self , NodeIdAssigner } ;
51- use syntax:: attr;
52- use syntax:: attr:: AttrMetaMethods ;
51+ use syntax:: attr:: { self , AttrMetaMethods } ;
5352use syntax:: diagnostics;
5453use syntax:: fold:: Folder ;
55- use syntax:: parse;
56- use syntax:: parse:: token;
54+ use syntax:: parse:: { self , PResult , token} ;
5755use syntax:: util:: node_count:: NodeCounter ;
5856use syntax:: visit;
5957use syntax;
@@ -86,7 +84,13 @@ pub fn compile_input(sess: &Session,
8684 // possible to keep the peak memory usage low
8785 let ( outputs, trans) = {
8886 let ( outputs, expanded_crate, id) = {
89- let krate = phase_1_parse_input ( sess, cfg, input) ;
87+ let krate = match phase_1_parse_input ( sess, cfg, input) {
88+ Ok ( krate) => krate,
89+ Err ( mut parse_error) => {
90+ parse_error. emit ( ) ;
91+ return Err ( 1 ) ;
92+ }
93+ } ;
9094
9195 controller_entry_point ! ( after_parse,
9296 sess,
@@ -415,17 +419,20 @@ impl<'a, 'ast, 'tcx> CompileState<'a, 'ast, 'tcx> {
415419 }
416420}
417421
418- pub fn phase_1_parse_input ( sess : & Session , cfg : ast:: CrateConfig , input : & Input ) -> ast:: Crate {
422+ pub fn phase_1_parse_input < ' a > ( sess : & ' a Session ,
423+ cfg : ast:: CrateConfig ,
424+ input : & Input )
425+ -> PResult < ' a , ast:: Crate > {
419426 // These may be left in an incoherent state after a previous compile.
420427 // `clear_tables` and `get_ident_interner().clear()` can be used to free
421428 // memory, but they do not restore the initial state.
422429 syntax:: ext:: mtwt:: reset_tables ( ) ;
423430 token:: reset_ident_interner ( ) ;
424431
425- let krate = time ( sess. time_passes ( ) , "parsing" , || {
432+ let krate = try! ( time ( sess. time_passes ( ) , "parsing" , || {
426433 match * input {
427434 Input :: File ( ref file) => {
428- parse:: parse_crate_from_file ( & ( * file) , cfg. clone ( ) , & sess. parse_sess )
435+ parse:: parse_crate_from_file ( file, cfg. clone ( ) , & sess. parse_sess )
429436 }
430437 Input :: Str ( ref src) => {
431438 parse:: parse_crate_from_source_str ( anon_src ( ) . to_string ( ) ,
@@ -434,7 +441,7 @@ pub fn phase_1_parse_input(sess: &Session, cfg: ast::CrateConfig, input: &Input)
434441 & sess. parse_sess )
435442 }
436443 }
437- } ) ;
444+ } ) ) ;
438445
439446 if sess. opts . debugging_opts . ast_json_noexpand {
440447 println ! ( "{}" , json:: as_json( & krate) ) ;
@@ -449,7 +456,7 @@ pub fn phase_1_parse_input(sess: &Session, cfg: ast::CrateConfig, input: &Input)
449456 syntax:: show_span:: run ( sess. diagnostic ( ) , s, & krate) ;
450457 }
451458
452- krate
459+ Ok ( krate)
453460}
454461
455462fn count_nodes ( krate : & ast:: Crate ) -> usize {
0 commit comments