Skip to content

Commit 2b17219

Browse files
committed
proc_macro: use macros to simplify aggregate Mark/Unmark definitions
1 parent 1793ee0 commit 2b17219

File tree

1 file changed

+34
-24
lines changed
  • library/proc_macro/src/bridge

1 file changed

+34
-24
lines changed

library/proc_macro/src/bridge/mod.rs

Lines changed: 34 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -409,6 +409,39 @@ rpc_encode_decode!(
409409
}
410410
);
411411

412+
macro_rules! mark_compound {
413+
(enum $name:ident <$($T:ident),+> { $($variant:ident $(($field:ident))?),* $(,)? }) => {
414+
impl<$($T: Mark),+> Mark for $name <$($T),+> {
415+
type Unmarked = $name <$($T::Unmarked),+>;
416+
fn mark(unmarked: Self::Unmarked) -> Self {
417+
match unmarked {
418+
$($name::$variant $(($field))? => {
419+
$name::$variant $((Mark::mark($field)))?
420+
})*
421+
}
422+
}
423+
}
424+
425+
impl<$($T: Unmark),+> Unmark for $name <$($T),+> {
426+
type Unmarked = $name <$($T::Unmarked),+>;
427+
fn unmark(self) -> Self::Unmarked {
428+
match self {
429+
$($name::$variant $(($field))? => {
430+
$name::$variant $((Unmark::unmark($field)))?
431+
})*
432+
}
433+
}
434+
}
435+
}
436+
}
437+
438+
macro_rules! compound_traits {
439+
($($t:tt)*) => {
440+
rpc_encode_decode!($($t)*);
441+
mark_compound!($($t)*);
442+
};
443+
}
444+
412445
#[derive(Clone)]
413446
pub enum TokenTree<G, P, I, L> {
414447
Group(G),
@@ -417,30 +450,7 @@ pub enum TokenTree<G, P, I, L> {
417450
Literal(L),
418451
}
419452

420-
impl<G: Mark, P: Mark, I: Mark, L: Mark> Mark for TokenTree<G, P, I, L> {
421-
type Unmarked = TokenTree<G::Unmarked, P::Unmarked, I::Unmarked, L::Unmarked>;
422-
fn mark(unmarked: Self::Unmarked) -> Self {
423-
match unmarked {
424-
TokenTree::Group(tt) => TokenTree::Group(G::mark(tt)),
425-
TokenTree::Punct(tt) => TokenTree::Punct(P::mark(tt)),
426-
TokenTree::Ident(tt) => TokenTree::Ident(I::mark(tt)),
427-
TokenTree::Literal(tt) => TokenTree::Literal(L::mark(tt)),
428-
}
429-
}
430-
}
431-
impl<G: Unmark, P: Unmark, I: Unmark, L: Unmark> Unmark for TokenTree<G, P, I, L> {
432-
type Unmarked = TokenTree<G::Unmarked, P::Unmarked, I::Unmarked, L::Unmarked>;
433-
fn unmark(self) -> Self::Unmarked {
434-
match self {
435-
TokenTree::Group(tt) => TokenTree::Group(tt.unmark()),
436-
TokenTree::Punct(tt) => TokenTree::Punct(tt.unmark()),
437-
TokenTree::Ident(tt) => TokenTree::Ident(tt.unmark()),
438-
TokenTree::Literal(tt) => TokenTree::Literal(tt.unmark()),
439-
}
440-
}
441-
}
442-
443-
rpc_encode_decode!(
453+
compound_traits!(
444454
enum TokenTree<G, P, I, L> {
445455
Group(tt),
446456
Punct(tt),

0 commit comments

Comments
 (0)