1 extern crate proc_macro2;
2 
3 #[path = "../debug/mod.rs"]
4 pub mod debug;
5 
6 use syn;
7 use syn::parse::{Parse, Result};
8 
9 #[macro_export]
10 macro_rules! errorf {
11     ($($tt:tt)*) => {{
12         use ::std::io::Write;
13         let stderr = ::std::io::stderr();
14         write!(stderr.lock(), $($tt)*).unwrap();
15     }};
16 }
17 
18 #[macro_export]
19 macro_rules! punctuated {
20     ($($e:expr,)+) => {{
21         let mut seq = ::syn::punctuated::Punctuated::new();
22         $(
23             seq.push($e);
24         )+
25         seq
26     }};
27 
28     ($($e:expr),+) => {
29         punctuated!($($e,)+)
30     };
31 }
32 
33 #[macro_export]
34 macro_rules! snapshot {
35     ($($args:tt)*) => {
36         snapshot_impl!(() $($args)*)
37     };
38 }
39 
40 #[macro_export]
41 macro_rules! snapshot_impl {
42     (($expr:ident) as $t:ty, @$snapshot:literal) => {
43         let $expr = ::macros::Tokens::parse::<$t>($expr).unwrap();
44         let debug = crate::macros::debug::Lite(&$expr);
45         insta::assert_debug_snapshot_matches!(debug, @$snapshot);
46     };
47     (($($expr:tt)*) as $t:ty, @$snapshot:literal) => {{
48         let syntax_tree = ::macros::Tokens::parse::<$t>($($expr)*).unwrap();
49         let debug = crate::macros::debug::Lite(&syntax_tree);
50         insta::assert_debug_snapshot_matches!(debug, @$snapshot);
51         syntax_tree
52     }};
53     (($($expr:tt)*) , @$snapshot:literal) => {{
54         let syntax_tree = $($expr)*;
55         let debug = crate::macros::debug::Lite(&syntax_tree);
56         insta::assert_debug_snapshot_matches!(debug, @$snapshot);
57         syntax_tree
58     }};
59     (($($expr:tt)*) $next:tt $($rest:tt)*) => {
60         snapshot_impl!(($($expr)* $next) $($rest)*)
61     };
62 }
63 
64 pub trait Tokens {
parse<T: Parse>(self) -> Result<T>65     fn parse<T: Parse>(self) -> Result<T>;
66 }
67 
68 impl<'a> Tokens for &'a str {
parse<T: Parse>(self) -> Result<T>69     fn parse<T: Parse>(self) -> Result<T> {
70         syn::parse_str(self)
71     }
72 }
73 
74 impl Tokens for proc_macro2::TokenStream {
parse<T: Parse>(self) -> Result<T>75     fn parse<T: Parse>(self) -> Result<T> {
76         syn::parse2(self)
77     }
78 }
79