blob: 36139c5cdb341f939ce69a92fc2d06ca57f69f4c [file] [log] [blame]
David Tolnayf60f4262017-12-28 19:17:58 -05001#[cfg(feature = "fold")]
2pub mod fold {
David Tolnayf2cfd722017-12-31 18:02:51 -05003 use punctuated::{Punctuated, Element};
David Tolnaycc0f0372017-12-28 19:11:04 -05004 use fold::Folder;
5 use proc_macro2::Span;
David Tolnayf60f4262017-12-28 19:17:58 -05006
7 pub trait FoldHelper {
8 type Item;
9 fn lift<F>(self, f: F) -> Self where F: FnMut(Self::Item) -> Self::Item;
10 }
11
12 impl<T> FoldHelper for Vec<T> {
13 type Item = T;
14 fn lift<F>(self, f: F) -> Self where F: FnMut(Self::Item) -> Self::Item {
15 self.into_iter().map(f).collect()
16 }
17 }
18
David Tolnayf2cfd722017-12-31 18:02:51 -050019 impl<T, U> FoldHelper for Punctuated<T, U> {
David Tolnayf60f4262017-12-28 19:17:58 -050020 type Item = T;
21 fn lift<F>(self, mut f: F) -> Self where F: FnMut(Self::Item) -> Self::Item {
David Tolnay660fd1f2017-12-31 01:52:57 -050022 self.into_iter()
23 .map(Element::into_tuple)
24 .map(|(t, u)| Element::new(f(t), u))
25 .collect()
David Tolnayf60f4262017-12-28 19:17:58 -050026 }
27 }
David Tolnaycc0f0372017-12-28 19:11:04 -050028
29 pub fn tokens_helper<F: Folder + ?Sized, S: Spans>(folder: &mut F, spans: &S) -> S {
30 spans.fold(folder)
31 }
32
33 pub trait Spans {
34 fn fold<F: Folder + ?Sized>(&self, folder: &mut F) -> Self;
35 }
36
37 impl Spans for Span {
38 fn fold<F: Folder + ?Sized>(&self, folder: &mut F) -> Self {
39 folder.fold_span(*self)
40 }
41 }
42
43 impl Spans for [Span; 1] {
44 fn fold<F: Folder + ?Sized>(&self, folder: &mut F) -> Self {
45 [folder.fold_span(self[0])]
46 }
47 }
48
49 impl Spans for [Span; 2] {
50 fn fold<F: Folder + ?Sized>(&self, folder: &mut F) -> Self {
51 [folder.fold_span(self[0]), folder.fold_span(self[1])]
52 }
53 }
54
55 impl Spans for [Span; 3] {
56 fn fold<F: Folder + ?Sized>(&self, folder: &mut F) -> Self {
57 [folder.fold_span(self[0]), folder.fold_span(self[1]), folder.fold_span(self[2])]
58 }
59 }
60}
61
62#[cfg(feature = "visit")]
63pub mod visit {
64 use proc_macro2::Span;
65 use visit::Visitor;
66
67 pub fn tokens_helper<'ast, V: Visitor<'ast> + ?Sized, S: Spans>(visitor: &mut V, spans: &'ast S) {
68 spans.visit(visitor);
69 }
70
71 pub trait Spans {
72 fn visit<'ast, V: Visitor<'ast> + ?Sized>(&'ast self, visitor: &mut V);
73 }
74
75 impl Spans for Span {
76 fn visit<'ast, V: Visitor<'ast> + ?Sized>(&'ast self, visitor: &mut V) {
77 visitor.visit_span(self);
78 }
79 }
80
81 impl Spans for [Span; 1] {
82 fn visit<'ast, V: Visitor<'ast> + ?Sized>(&'ast self, visitor: &mut V) {
83 visitor.visit_span(&self[0]);
84 }
85 }
86
87 impl Spans for [Span; 2] {
88 fn visit<'ast, V: Visitor<'ast> + ?Sized>(&'ast self, visitor: &mut V) {
89 visitor.visit_span(&self[0]);
90 visitor.visit_span(&self[1]);
91 }
92 }
93
94 impl Spans for [Span; 3] {
95 fn visit<'ast, V: Visitor<'ast> + ?Sized>(&'ast self, visitor: &mut V) {
96 visitor.visit_span(&self[0]);
97 visitor.visit_span(&self[1]);
98 visitor.visit_span(&self[2]);
99 }
100 }
101}
102
103#[cfg(feature = "visit_mut")]
104pub mod visit_mut {
105 use proc_macro2::Span;
106 use visit_mut::VisitorMut;
107
108 pub fn tokens_helper<V: VisitorMut + ?Sized, S: Spans>(visitor: &mut V, spans: &mut S) {
109 spans.visit_mut(visitor);
110 }
111
112 pub trait Spans {
113 fn visit_mut<V: VisitorMut + ?Sized>(&mut self, visitor: &mut V);
114 }
115
116 impl Spans for Span {
117 fn visit_mut<V: VisitorMut + ?Sized>(&mut self, visitor: &mut V) {
118 visitor.visit_span_mut(self);
119 }
120 }
121
122 impl Spans for [Span; 1] {
123 fn visit_mut<V: VisitorMut + ?Sized>(&mut self, visitor: &mut V) {
124 visitor.visit_span_mut(&mut self[0]);
125 }
126 }
127
128 impl Spans for [Span; 2] {
129 fn visit_mut<V: VisitorMut + ?Sized>(&mut self, visitor: &mut V) {
130 visitor.visit_span_mut(&mut self[0]);
131 visitor.visit_span_mut(&mut self[1]);
132 }
133 }
134
135 impl Spans for [Span; 3] {
136 fn visit_mut<V: VisitorMut + ?Sized>(&mut self, visitor: &mut V) {
137 visitor.visit_span_mut(&mut self[0]);
138 visitor.visit_span_mut(&mut self[1]);
139 visitor.visit_span_mut(&mut self[2]);
140 }
141 }
David Tolnayf60f4262017-12-28 19:17:58 -0500142}