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