1extern crate rustc_ast;
2extern crate rustc_driver;
3extern crate rustc_expand;
4extern crate rustc_parse as parse;
5extern crate rustc_session;
6extern crate rustc_span;
7
8use rustc_ast::ast;
9use rustc_ast::ptr::P;
10use rustc_session::parse::ParseSess;
11use rustc_span::source_map::FilePathMapping;
12use rustc_span::FileName;
13use std::panic;
14
15pub 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
43pub 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