blob: 41d192f6fb19e90cbf46ae4032add35db7b774b7 [file] [log] [blame]
David Tolnayc7a5d3d2017-06-04 12:11:05 -07001extern crate proc_macro2;
Michael Layzell53fc31a2017-06-07 09:21:53 -04002extern crate syn;
David Tolnaycfa5cc02017-11-13 01:05:11 -08003extern crate syntax;
David Tolnaye9594252017-12-17 21:53:42 -08004extern crate syntax_pos;
Michael Layzell53fc31a2017-06-07 09:21:53 -04005
David Tolnaycfa5cc02017-11-13 01:05:11 -08006use self::syntax::ast;
David Tolnayeb7d79b2018-03-31 22:52:17 +02007use self::syntax::parse::{self, ParseSess};
8use self::syntax::ptr::P;
David Tolnayd1c31cc2018-08-24 14:47:15 -04009use self::syntax::source_map::FilePathMapping;
David Tolnaye6eb5902019-05-23 00:00:18 -070010use self::syntax_pos::FileName;
Michael Layzell53fc31a2017-06-07 09:21:53 -040011
12use std::panic;
13
David Tolnaycfa5cc02017-11-13 01:05:11 -080014pub fn libsyntax_expr(input: &str) -> Option<P<ast::Expr>> {
Michael Layzell53fc31a2017-06-07 09:21:53 -040015 match panic::catch_unwind(|| {
16 let sess = ParseSess::new(FilePathMapping::empty());
17 sess.span_diagnostic.set_continue_after_error(false);
David Tolnay0bb614f2018-06-14 21:41:43 -070018 let e = parse::new_parser_from_source_str(
19 &sess,
David Tolnaye9594252017-12-17 21:53:42 -080020 FileName::Custom("test_precedence".to_string()),
Michael Layzell53fc31a2017-06-07 09:21:53 -040021 input.to_string(),
David Tolnayfb84fc02018-10-02 21:01:30 -070022 )
23 .parse_expr();
David Tolnay57a28862018-07-31 21:47:10 -070024 match e {
25 Ok(expr) => Some(expr),
Michael Layzell53fc31a2017-06-07 09:21:53 -040026 Err(mut diagnostic) => {
David Tolnay57a28862018-07-31 21:47:10 -070027 diagnostic.emit();
28 None
Michael Layzell53fc31a2017-06-07 09:21:53 -040029 }
David Tolnay57a28862018-07-31 21:47:10 -070030 }
Michael Layzell53fc31a2017-06-07 09:21:53 -040031 }) {
32 Ok(Some(e)) => Some(e),
David Tolnay51382052017-12-27 13:46:21 -050033 Ok(None) => None,
Michael Layzell53fc31a2017-06-07 09:21:53 -040034 Err(_) => {
David Tolnayee97dbf2017-11-19 14:24:38 -080035 errorf!("libsyntax panicked\n");
Michael Layzell53fc31a2017-06-07 09:21:53 -040036 None
37 }
38 }
39}
40
41pub fn syn_expr(input: &str) -> Option<syn::Expr> {
David Tolnayc7a5d3d2017-06-04 12:11:05 -070042 match syn::parse_str(input) {
Michael Layzell53fc31a2017-06-07 09:21:53 -040043 Ok(e) => Some(e),
44 Err(msg) => {
45 errorf!("syn failed to parse\n{:?}\n", msg);
46 None
47 }
48 }
49}