blob: e6425b783bc7cc941eec457cec07f752c68bb690 [file] [log] [blame]
David Tolnaycfa5cc02017-11-13 01:05:11 -08001extern crate syntax;
David Tolnaye9594252017-12-17 21:53:42 -08002extern crate syntax_pos;
Michael Layzell53fc31a2017-06-07 09:21:53 -04003
Chih-Hung Hsieh467ea212019-10-31 17:36:47 -07004use syntax::ast;
5use syntax::parse;
6use syntax::ptr::P;
7use syntax::sess::ParseSess;
8use syntax::source_map::FilePathMapping;
9use syntax_pos::FileName;
Michael Layzell53fc31a2017-06-07 09:21:53 -040010
11use std::panic;
12
David Tolnaycfa5cc02017-11-13 01:05:11 -080013pub fn libsyntax_expr(input: &str) -> Option<P<ast::Expr>> {
Michael Layzell53fc31a2017-06-07 09:21:53 -040014 match panic::catch_unwind(|| {
15 let sess = ParseSess::new(FilePathMapping::empty());
16 sess.span_diagnostic.set_continue_after_error(false);
David Tolnay0bb614f2018-06-14 21:41:43 -070017 let e = parse::new_parser_from_source_str(
18 &sess,
David Tolnaye9594252017-12-17 21:53:42 -080019 FileName::Custom("test_precedence".to_string()),
Michael Layzell53fc31a2017-06-07 09:21:53 -040020 input.to_string(),
David Tolnayfb84fc02018-10-02 21:01:30 -070021 )
22 .parse_expr();
David Tolnay57a28862018-07-31 21:47:10 -070023 match e {
24 Ok(expr) => Some(expr),
Michael Layzell53fc31a2017-06-07 09:21:53 -040025 Err(mut diagnostic) => {
David Tolnay57a28862018-07-31 21:47:10 -070026 diagnostic.emit();
27 None
Michael Layzell53fc31a2017-06-07 09:21:53 -040028 }
David Tolnay57a28862018-07-31 21:47:10 -070029 }
Michael Layzell53fc31a2017-06-07 09:21:53 -040030 }) {
31 Ok(Some(e)) => Some(e),
David Tolnay51382052017-12-27 13:46:21 -050032 Ok(None) => None,
Michael Layzell53fc31a2017-06-07 09:21:53 -040033 Err(_) => {
David Tolnayee97dbf2017-11-19 14:24:38 -080034 errorf!("libsyntax panicked\n");
Michael Layzell53fc31a2017-06-07 09:21:53 -040035 None
36 }
37 }
38}
39
40pub fn syn_expr(input: &str) -> Option<syn::Expr> {
David Tolnayc7a5d3d2017-06-04 12:11:05 -070041 match syn::parse_str(input) {
Michael Layzell53fc31a2017-06-07 09:21:53 -040042 Ok(e) => Some(e),
43 Err(msg) => {
44 errorf!("syn failed to parse\n{:?}\n", msg);
45 None
46 }
47 }
48}