extern crate syn_impersonated as syn; extern crate quote_impersonated as quote; extern crate proc_macro2_impersonated as proc_macro2; #[path = "../debug/mod.rs"] pub mod debug; use syn::parse::{Parse, Result}; #[macro_export] macro_rules! errorf { ($($tt:tt)*) => {{ use ::std::io::Write; let stderr = ::std::io::stderr(); write!(stderr.lock(), $($tt)*).unwrap(); }}; } #[macro_export] macro_rules! punctuated { ($($e:expr,)+) => {{ let mut seq = ::syn::punctuated::Punctuated::new(); $( seq.push($e); )+ seq }}; ($($e:expr),+) => { punctuated!($($e,)+) }; } #[macro_export] macro_rules! snapshot { ($($args:tt)*) => { snapshot_impl!(() $($args)*) }; } #[macro_export] macro_rules! snapshot_impl { (($expr:ident) as $t:ty, @$snapshot:literal) => { let $expr = crate::macros::Tokens::parse::<$t>($expr).unwrap(); let debug = crate::macros::debug::Lite(&$expr); insta::assert_debug_snapshot!(debug, @$snapshot); }; (($($expr:tt)*) as $t:ty, @$snapshot:literal) => {{ let syntax_tree = crate::macros::Tokens::parse::<$t>($($expr)*).unwrap(); let debug = crate::macros::debug::Lite(&syntax_tree); insta::assert_debug_snapshot!(debug, @$snapshot); syntax_tree }}; (($($expr:tt)*) , @$snapshot:literal) => {{ let syntax_tree = $($expr)*; let debug = crate::macros::debug::Lite(&syntax_tree); insta::assert_debug_snapshot!(debug, @$snapshot); syntax_tree }}; (($($expr:tt)*) $next:tt $($rest:tt)*) => { snapshot_impl!(($($expr)* $next) $($rest)*) }; } pub trait Tokens { fn parse(self) -> Result; } impl<'a> Tokens for &'a str { fn parse(self) -> Result { syn::parse_str(self) } } impl Tokens for proc_macro2::TokenStream { fn parse(self) -> Result { syn::parse2(self) } }