Skip to content

Commit 9578c39

Browse files
tamirdojeda
authored andcommitted
rust: macros: reduce collections in quote! macro
Remove a handful of unnecessary intermediate vectors and token streams; mainly the top-level stream can be directly extended with the notable exception of groups. Remove an unnecessary `#[allow(dead_code)]` added in commit dbd5058 ("rust: make pin-init its own crate"). Acked-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> Reviewed-by: Alice Ryhl <aliceryhl@google.com> Acked-by: Danilo Krummrich <dakr@kernel.org> Signed-off-by: Tamir Duberstein <tamird@gmail.com> Signed-off-by: Miguel Ojeda <ojeda@kernel.org>
1 parent 6574036 commit 9578c39

1 file changed

Lines changed: 49 additions & 55 deletions

File tree

rust/macros/quote.rs

Lines changed: 49 additions & 55 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,6 @@
22

33
use proc_macro::{TokenStream, TokenTree};
44

5-
#[allow(dead_code)]
65
pub(crate) trait ToTokens {
76
fn to_tokens(&self, tokens: &mut TokenStream);
87
}
@@ -47,121 +46,116 @@ impl ToTokens for TokenStream {
4746
/// `quote` crate but provides only just enough functionality needed by the current `macros` crate.
4847
macro_rules! quote_spanned {
4948
($span:expr => $($tt:tt)*) => {{
50-
let mut tokens: ::std::vec::Vec<::proc_macro::TokenTree>;
51-
#[allow(clippy::vec_init_then_push)]
49+
let mut tokens = ::proc_macro::TokenStream::new();
5250
{
53-
tokens = ::std::vec::Vec::new();
5451
let span = $span;
5552
quote_spanned!(@proc tokens span $($tt)*);
5653
}
57-
::proc_macro::TokenStream::from_iter(tokens)
54+
tokens
5855
}};
5956
(@proc $v:ident $span:ident) => {};
6057
(@proc $v:ident $span:ident #$id:ident $($tt:tt)*) => {
61-
let mut ts = ::proc_macro::TokenStream::new();
62-
$crate::quote::ToTokens::to_tokens(&$id, &mut ts);
63-
$v.extend(ts);
58+
$crate::quote::ToTokens::to_tokens(&$id, &mut $v);
6459
quote_spanned!(@proc $v $span $($tt)*);
6560
};
6661
(@proc $v:ident $span:ident #(#$id:ident)* $($tt:tt)*) => {
6762
for token in $id {
68-
let mut ts = ::proc_macro::TokenStream::new();
69-
$crate::quote::ToTokens::to_tokens(&token, &mut ts);
70-
$v.extend(ts);
63+
$crate::quote::ToTokens::to_tokens(&token, &mut $v);
7164
}
7265
quote_spanned!(@proc $v $span $($tt)*);
7366
};
7467
(@proc $v:ident $span:ident ( $($inner:tt)* ) $($tt:tt)*) => {
7568
#[allow(unused_mut)]
76-
let mut tokens = ::std::vec::Vec::<::proc_macro::TokenTree>::new();
69+
let mut tokens = ::proc_macro::TokenStream::new();
7770
quote_spanned!(@proc tokens $span $($inner)*);
78-
$v.push(::proc_macro::TokenTree::Group(::proc_macro::Group::new(
71+
$v.extend([::proc_macro::TokenTree::Group(::proc_macro::Group::new(
7972
::proc_macro::Delimiter::Parenthesis,
80-
::proc_macro::TokenStream::from_iter(tokens)
81-
)));
73+
tokens,
74+
))]);
8275
quote_spanned!(@proc $v $span $($tt)*);
8376
};
8477
(@proc $v:ident $span:ident [ $($inner:tt)* ] $($tt:tt)*) => {
85-
let mut tokens = ::std::vec::Vec::new();
78+
let mut tokens = ::proc_macro::TokenStream::new();
8679
quote_spanned!(@proc tokens $span $($inner)*);
87-
$v.push(::proc_macro::TokenTree::Group(::proc_macro::Group::new(
80+
$v.extend([::proc_macro::TokenTree::Group(::proc_macro::Group::new(
8881
::proc_macro::Delimiter::Bracket,
89-
::proc_macro::TokenStream::from_iter(tokens)
90-
)));
82+
tokens,
83+
))]);
9184
quote_spanned!(@proc $v $span $($tt)*);
9285
};
9386
(@proc $v:ident $span:ident { $($inner:tt)* } $($tt:tt)*) => {
94-
let mut tokens = ::std::vec::Vec::new();
87+
let mut tokens = ::proc_macro::TokenStream::new();
9588
quote_spanned!(@proc tokens $span $($inner)*);
96-
$v.push(::proc_macro::TokenTree::Group(::proc_macro::Group::new(
89+
$v.extend([::proc_macro::TokenTree::Group(::proc_macro::Group::new(
9790
::proc_macro::Delimiter::Brace,
98-
::proc_macro::TokenStream::from_iter(tokens)
99-
)));
91+
tokens,
92+
))]);
10093
quote_spanned!(@proc $v $span $($tt)*);
10194
};
10295
(@proc $v:ident $span:ident :: $($tt:tt)*) => {
103-
$v.push(::proc_macro::TokenTree::Punct(
104-
::proc_macro::Punct::new(':', ::proc_macro::Spacing::Joint)
105-
));
106-
$v.push(::proc_macro::TokenTree::Punct(
107-
::proc_macro::Punct::new(':', ::proc_macro::Spacing::Alone)
108-
));
96+
$v.extend([::proc_macro::Spacing::Joint, ::proc_macro::Spacing::Alone].map(|spacing| {
97+
::proc_macro::TokenTree::Punct(::proc_macro::Punct::new(':', spacing))
98+
}));
10999
quote_spanned!(@proc $v $span $($tt)*);
110100
};
111101
(@proc $v:ident $span:ident : $($tt:tt)*) => {
112-
$v.push(::proc_macro::TokenTree::Punct(
113-
::proc_macro::Punct::new(':', ::proc_macro::Spacing::Alone)
114-
));
102+
$v.extend([::proc_macro::TokenTree::Punct(
103+
::proc_macro::Punct::new(':', ::proc_macro::Spacing::Alone),
104+
)]);
115105
quote_spanned!(@proc $v $span $($tt)*);
116106
};
117107
(@proc $v:ident $span:ident , $($tt:tt)*) => {
118-
$v.push(::proc_macro::TokenTree::Punct(
119-
::proc_macro::Punct::new(',', ::proc_macro::Spacing::Alone)
120-
));
108+
$v.extend([::proc_macro::TokenTree::Punct(
109+
::proc_macro::Punct::new(',', ::proc_macro::Spacing::Alone),
110+
)]);
121111
quote_spanned!(@proc $v $span $($tt)*);
122112
};
123113
(@proc $v:ident $span:ident @ $($tt:tt)*) => {
124-
$v.push(::proc_macro::TokenTree::Punct(
125-
::proc_macro::Punct::new('@', ::proc_macro::Spacing::Alone)
126-
));
114+
$v.extend([::proc_macro::TokenTree::Punct(
115+
::proc_macro::Punct::new('@', ::proc_macro::Spacing::Alone),
116+
)]);
127117
quote_spanned!(@proc $v $span $($tt)*);
128118
};
129119
(@proc $v:ident $span:ident ! $($tt:tt)*) => {
130-
$v.push(::proc_macro::TokenTree::Punct(
131-
::proc_macro::Punct::new('!', ::proc_macro::Spacing::Alone)
132-
));
120+
$v.extend([::proc_macro::TokenTree::Punct(
121+
::proc_macro::Punct::new('!', ::proc_macro::Spacing::Alone),
122+
)]);
133123
quote_spanned!(@proc $v $span $($tt)*);
134124
};
135125
(@proc $v:ident $span:ident ; $($tt:tt)*) => {
136-
$v.push(::proc_macro::TokenTree::Punct(
137-
::proc_macro::Punct::new(';', ::proc_macro::Spacing::Alone)
138-
));
126+
$v.extend([::proc_macro::TokenTree::Punct(
127+
::proc_macro::Punct::new(';', ::proc_macro::Spacing::Alone),
128+
)]);
139129
quote_spanned!(@proc $v $span $($tt)*);
140130
};
141131
(@proc $v:ident $span:ident + $($tt:tt)*) => {
142-
$v.push(::proc_macro::TokenTree::Punct(
143-
::proc_macro::Punct::new('+', ::proc_macro::Spacing::Alone)
144-
));
132+
$v.extend([::proc_macro::TokenTree::Punct(
133+
::proc_macro::Punct::new('+', ::proc_macro::Spacing::Alone),
134+
)]);
145135
quote_spanned!(@proc $v $span $($tt)*);
146136
};
147137
(@proc $v:ident $span:ident = $($tt:tt)*) => {
148-
$v.push(::proc_macro::TokenTree::Punct(
149-
::proc_macro::Punct::new('=', ::proc_macro::Spacing::Alone)
150-
));
138+
$v.extend([::proc_macro::TokenTree::Punct(
139+
::proc_macro::Punct::new('=', ::proc_macro::Spacing::Alone),
140+
)]);
151141
quote_spanned!(@proc $v $span $($tt)*);
152142
};
153143
(@proc $v:ident $span:ident # $($tt:tt)*) => {
154-
$v.push(::proc_macro::TokenTree::Punct(
155-
::proc_macro::Punct::new('#', ::proc_macro::Spacing::Alone)
156-
));
144+
$v.extend([::proc_macro::TokenTree::Punct(
145+
::proc_macro::Punct::new('#', ::proc_macro::Spacing::Alone),
146+
)]);
157147
quote_spanned!(@proc $v $span $($tt)*);
158148
};
159149
(@proc $v:ident $span:ident _ $($tt:tt)*) => {
160-
$v.push(::proc_macro::TokenTree::Ident(::proc_macro::Ident::new("_", $span)));
150+
$v.extend([::proc_macro::TokenTree::Ident(
151+
::proc_macro::Ident::new("_", $span),
152+
)]);
161153
quote_spanned!(@proc $v $span $($tt)*);
162154
};
163155
(@proc $v:ident $span:ident $id:ident $($tt:tt)*) => {
164-
$v.push(::proc_macro::TokenTree::Ident(::proc_macro::Ident::new(stringify!($id), $span)));
156+
$v.extend([::proc_macro::TokenTree::Ident(
157+
::proc_macro::Ident::new(stringify!($id), $span),
158+
)]);
165159
quote_spanned!(@proc $v $span $($tt)*);
166160
};
167161
}

0 commit comments

Comments
 (0)