mod.rs 1.9 KB

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