Skip to content

Commit cc698dc

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

File tree

1 file changed

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

1 file changed

+53
-24
lines changed

library/proc_macro/src/bridge/mod.rs

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

412+
macro_rules! mark_compound {
413+
(struct $name:ident <$($T: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+
$name {
418+
$($field: Mark::mark(unmarked.$field)),*
419+
}
420+
}
421+
}
422+
423+
impl<$($T: Unmark),+> Unmark for $name <$($T),+> {
424+
type Unmarked = $name <$($T::Unmarked),+>;
425+
fn unmark(self) -> Self::Unmarked {
426+
$name {
427+
$($field: Unmark::unmark(self.$field)),*
428+
}
429+
}
430+
}
431+
};
432+
(enum $name:ident <$($T:ident),+> { $($variant:ident $(($field:ident))?),* $(,)? }) => {
433+
impl<$($T: Mark),+> Mark for $name <$($T),+> {
434+
type Unmarked = $name <$($T::Unmarked),+>;
435+
fn mark(unmarked: Self::Unmarked) -> Self {
436+
match unmarked {
437+
$($name::$variant $(($field))? => {
438+
$name::$variant $((Mark::mark($field)))?
439+
})*
440+
}
441+
}
442+
}
443+
444+
impl<$($T: Unmark),+> Unmark for $name <$($T),+> {
445+
type Unmarked = $name <$($T::Unmarked),+>;
446+
fn unmark(self) -> Self::Unmarked {
447+
match self {
448+
$($name::$variant $(($field))? => {
449+
$name::$variant $((Unmark::unmark($field)))?
450+
})*
451+
}
452+
}
453+
}
454+
}
455+
}
456+
457+
macro_rules! compound_traits {
458+
($($t:tt)*) => {
459+
rpc_encode_decode!($($t)*);
460+
mark_compound!($($t)*);
461+
};
462+
}
463+
412464
#[derive(Clone)]
413465
pub enum TokenTree<G, P, I, L> {
414466
Group(G),
@@ -417,30 +469,7 @@ pub enum TokenTree<G, P, I, L> {
417469
Literal(L),
418470
}
419471

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!(
472+
compound_traits!(
444473
enum TokenTree<G, P, I, L> {
445474
Group(tt),
446475
Punct(tt),

0 commit comments

Comments
 (0)