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