diff options
| author | Nika Layzell <nika@thelayzells.com> | 2021-06-29 16:36:10 -0400 |
|---|---|---|
| committer | Nika Layzell <nika@thelayzells.com> | 2022-06-16 23:16:30 -0400 |
| commit | 2b172194686f0769e70d95cf6d8f571bc29a023e (patch) | |
| tree | 6191614ffd7dcee52308637375f1c87c63d9d260 | |
| parent | 1793ee06589193a33f7f3d6670928dcb5a0f4742 (diff) | |
| download | rust-2b172194686f0769e70d95cf6d8f571bc29a023e.tar.gz rust-2b172194686f0769e70d95cf6d8f571bc29a023e.zip | |
proc_macro: use macros to simplify aggregate Mark/Unmark definitions
| -rw-r--r-- | library/proc_macro/src/bridge/mod.rs | 58 |
1 files changed, 34 insertions, 24 deletions
diff --git a/library/proc_macro/src/bridge/mod.rs b/library/proc_macro/src/bridge/mod.rs index aca43945491..22b4b047396 100644 --- a/library/proc_macro/src/bridge/mod.rs +++ b/library/proc_macro/src/bridge/mod.rs @@ -409,6 +409,39 @@ rpc_encode_decode!( } ); +macro_rules! mark_compound { + (enum $name:ident <$($T:ident),+> { $($variant:ident $(($field:ident))?),* $(,)? }) => { + impl<$($T: Mark),+> Mark for $name <$($T),+> { + type Unmarked = $name <$($T::Unmarked),+>; + fn mark(unmarked: Self::Unmarked) -> Self { + match unmarked { + $($name::$variant $(($field))? => { + $name::$variant $((Mark::mark($field)))? + })* + } + } + } + + impl<$($T: Unmark),+> Unmark for $name <$($T),+> { + type Unmarked = $name <$($T::Unmarked),+>; + fn unmark(self) -> Self::Unmarked { + match self { + $($name::$variant $(($field))? => { + $name::$variant $((Unmark::unmark($field)))? + })* + } + } + } + } +} + +macro_rules! compound_traits { + ($($t:tt)*) => { + rpc_encode_decode!($($t)*); + mark_compound!($($t)*); + }; +} + #[derive(Clone)] pub enum TokenTree<G, P, I, L> { Group(G), @@ -417,30 +450,7 @@ pub enum TokenTree<G, P, I, L> { Literal(L), } -impl<G: Mark, P: Mark, I: Mark, L: Mark> Mark for TokenTree<G, P, I, L> { - type Unmarked = TokenTree<G::Unmarked, P::Unmarked, I::Unmarked, L::Unmarked>; - fn mark(unmarked: Self::Unmarked) -> Self { - match unmarked { - TokenTree::Group(tt) => TokenTree::Group(G::mark(tt)), - TokenTree::Punct(tt) => TokenTree::Punct(P::mark(tt)), - TokenTree::Ident(tt) => TokenTree::Ident(I::mark(tt)), - TokenTree::Literal(tt) => TokenTree::Literal(L::mark(tt)), - } - } -} -impl<G: Unmark, P: Unmark, I: Unmark, L: Unmark> Unmark for TokenTree<G, P, I, L> { - type Unmarked = TokenTree<G::Unmarked, P::Unmarked, I::Unmarked, L::Unmarked>; - fn unmark(self) -> Self::Unmarked { - match self { - TokenTree::Group(tt) => TokenTree::Group(tt.unmark()), - TokenTree::Punct(tt) => TokenTree::Punct(tt.unmark()), - TokenTree::Ident(tt) => TokenTree::Ident(tt.unmark()), - TokenTree::Literal(tt) => TokenTree::Literal(tt.unmark()), - } - } -} - -rpc_encode_decode!( +compound_traits!( enum TokenTree<G, P, I, L> { Group(tt), Punct(tt), |
