1 extern crate rustc_ast; 2 extern crate rustc_driver; 3 extern crate rustc_expand; 4 extern crate rustc_parse as parse; 5 extern crate rustc_session; 6 extern crate rustc_span; 7 8 use rustc_ast::ast; 9 use rustc_ast::ptr::P; 10 use rustc_session::parse::ParseSess; 11 use rustc_span::source_map::FilePathMapping; 12 use rustc_span::FileName; 13 use std::panic; 14 librustc_exprnull15pub fn librustc_expr(input: &str) -> Option<P<ast::Expr>> { 16 match panic::catch_unwind(|| { 17 let locale_resources = rustc_driver::DEFAULT_LOCALE_RESOURCES.to_vec(); 18 let file_path_mapping = FilePathMapping::empty(); 19 let sess = ParseSess::new(locale_resources, file_path_mapping); 20 let e = parse::new_parser_from_source_str( 21 &sess, 22 FileName::Custom("test_precedence".to_string()), 23 input.to_string(), 24 ) 25 .parse_expr(); 26 match e { 27 Ok(expr) => Some(expr), 28 Err(mut diagnostic) => { 29 diagnostic.emit(); 30 None 31 } 32 } 33 }) { 34 Ok(Some(e)) => Some(e), 35 Ok(None) => None, 36 Err(_) => { 37 errorf!("librustc panicked\n"); 38 None 39 } 40 } 41 } 42 syn_exprnull43pub fn syn_expr(input: &str) -> Option<syn::Expr> { 44 match syn::parse_str(input) { 45 Ok(e) => Some(e), 46 Err(msg) => { 47 errorf!("syn failed to parse\n{:?}\n", msg); 48 None 49 } 50 } 51 } 52