#[cfg(feature = "fold")] pub mod fold { use crate::fold::Fold; use crate::punctuated::{Pair, Punctuated}; use proc_macro2::Span; pub trait FoldHelper { type Item; fn lift(self, f: F) -> Self where F: FnMut(Self::Item) -> Self::Item; } impl FoldHelper for Vec { type Item = T; fn lift(self, f: F) -> Self where F: FnMut(Self::Item) -> Self::Item, { self.into_iter().map(f).collect() } } impl FoldHelper for Punctuated { type Item = T; fn lift(self, mut f: F) -> Self where F: FnMut(Self::Item) -> Self::Item, { self.into_pairs() .map(Pair::into_tuple) .map(|(t, u)| Pair::new(f(t), u)) .collect() } } pub fn tokens_helper(folder: &mut F, spans: &S) -> S { spans.fold(folder) } pub trait Spans { fn fold(&self, folder: &mut F) -> Self; } impl Spans for Span { fn fold(&self, folder: &mut F) -> Self { folder.fold_span(*self) } } impl Spans for [Span; 1] { fn fold(&self, folder: &mut F) -> Self { [folder.fold_span(self[0])] } } impl Spans for [Span; 2] { fn fold(&self, folder: &mut F) -> Self { [folder.fold_span(self[0]), folder.fold_span(self[1])] } } impl Spans for [Span; 3] { fn fold(&self, folder: &mut F) -> Self { [ folder.fold_span(self[0]), folder.fold_span(self[1]), folder.fold_span(self[2]), ] } } } #[cfg(feature = "visit")] pub mod visit { use crate::visit::Visit; use proc_macro2::Span; pub fn tokens_helper<'ast, V: Visit<'ast> + ?Sized, S: Spans>(visitor: &mut V, spans: &S) { spans.visit(visitor); } pub trait Spans { fn visit<'ast, V: Visit<'ast> + ?Sized>(&self, visitor: &mut V); } impl Spans for Span { fn visit<'ast, V: Visit<'ast> + ?Sized>(&self, visitor: &mut V) { visitor.visit_span(self); } } impl Spans for [Span; 1] { fn visit<'ast, V: Visit<'ast> + ?Sized>(&self, visitor: &mut V) { visitor.visit_span(&self[0]); } } impl Spans for [Span; 2] { fn visit<'ast, V: Visit<'ast> + ?Sized>(&self, visitor: &mut V) { visitor.visit_span(&self[0]); visitor.visit_span(&self[1]); } } impl Spans for [Span; 3] { fn visit<'ast, V: Visit<'ast> + ?Sized>(&self, visitor: &mut V) { visitor.visit_span(&self[0]); visitor.visit_span(&self[1]); visitor.visit_span(&self[2]); } } } #[cfg(feature = "visit-mut")] pub mod visit_mut { use crate::visit_mut::VisitMut; use proc_macro2::Span; pub fn tokens_helper(visitor: &mut V, spans: &mut S) { spans.visit_mut(visitor); } pub trait Spans { fn visit_mut(&mut self, visitor: &mut V); } impl Spans for Span { fn visit_mut(&mut self, visitor: &mut V) { visitor.visit_span_mut(self); } } impl Spans for [Span; 1] { fn visit_mut(&mut self, visitor: &mut V) { visitor.visit_span_mut(&mut self[0]); } } impl Spans for [Span; 2] { fn visit_mut(&mut self, visitor: &mut V) { visitor.visit_span_mut(&mut self[0]); visitor.visit_span_mut(&mut self[1]); } } impl Spans for [Span; 3] { fn visit_mut(&mut self, visitor: &mut V) { visitor.visit_span_mut(&mut self[0]); visitor.visit_span_mut(&mut self[1]); visitor.visit_span_mut(&mut self[2]); } } }