1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89
mod tokens; pub use tokens::Tokens; mod to_tokens; pub use to_tokens::{ToTokens, ByteStr}; #[macro_export] macro_rules! quote { ($($tt:tt)+) => { { #[allow(unused_imports)] use $crate::ToTokens; let mut _s = $crate::Tokens::new(); quote_each_token!(_s $($tt)*); _s } }; } #[macro_export] #[doc(hidden)] macro_rules! quote_each_token { ($tokens:ident) => {}; ($tokens:ident # ! $($rest:tt)*) => { $tokens.append("#"); $tokens.append("!"); quote_each_token!($tokens $($rest)*); }; ($tokens:ident # ( $first:ident ) * $($rest:tt)*) => { for _v in &$first { _v.to_tokens(&mut $tokens); } quote_each_token!($tokens $($rest)*); }; ($tokens:ident # ( $first:ident $sep:tt ) * $($rest:tt)*) => { for _v in &$first { _v.to_tokens(&mut $tokens); $tokens.append(stringify!($sep)); } quote_each_token!($tokens $($rest)*); }; ($tokens:ident # ( $first:ident ) $sep:tt * $($rest:tt)*) => { $tokens.append_separated($first, stringify!($sep)); quote_each_token!($tokens $($rest)*); }; ($tokens:ident # [ $($inner:tt)* ] $($rest:tt)*) => { $tokens.append("#"); $tokens.append("["); quote_each_token!($tokens $($inner)*); $tokens.append("]"); quote_each_token!($tokens $($rest)*); }; ($tokens:ident # $first:ident $($rest:tt)*) => { $first.to_tokens(&mut $tokens); quote_each_token!($tokens $($rest)*); }; ($tokens:ident ( $($first:tt)* ) $($rest:tt)*) => { $tokens.append("("); quote_each_token!($tokens $($first)*); $tokens.append(")"); quote_each_token!($tokens $($rest)*); }; ($tokens:ident [ $($first:tt)* ] $($rest:tt)*) => { $tokens.append("["); quote_each_token!($tokens $($first)*); $tokens.append("]"); quote_each_token!($tokens $($rest)*); }; ($tokens:ident { $($first:tt)* } $($rest:tt)*) => { $tokens.append("{"); quote_each_token!($tokens $($first)*); $tokens.append("}"); quote_each_token!($tokens $($rest)*); }; ($tokens:ident $first:tt $($rest:tt)*) => { $tokens.append(stringify!($first)); quote_each_token!($tokens $($rest)*); }; }