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