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_exprnull15 pub 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_exprnull43 pub 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