On Fri, Feb 28, 2025 at 4:26 PM Tamir Duberstein <tam...@gmail.com> wrote: > > On Fri, Feb 28, 2025 at 7:42 AM Alice Ryhl <alicer...@google.com> wrote: > > > > This gives the quote! macro support for the following additional tokens: > > > > * The = token. > > * The _ token. > > * Using #my_var with variables of type Ident. > > > > Additionally, some type annotations are added to allow cases where > > groups are empty. For example, quote! does support () in the input, but > > only when it is *not* empty. When it is empty, the compiler cannot infer > > the item type of `tokens`. > > > > These additional quote! features are used by a new proc macro that > > generates code looking like this: > > > > const _: () = { > > if true { > > ::kernel::bindings::#name > > } else { > > #name > > }; > > }; > > > > where #name has type Ident. > > > > Signed-off-by: Alice Ryhl <alicer...@google.com> > > --- > > rust/macros/quote.rs | 21 +++++++++++++++++++-- > > 1 file changed, 19 insertions(+), 2 deletions(-) > > > > diff --git a/rust/macros/quote.rs b/rust/macros/quote.rs > > index 33a199e4f176..c18960a91082 100644 > > --- a/rust/macros/quote.rs > > +++ b/rust/macros/quote.rs > > @@ -20,6 +20,12 @@ fn to_tokens(&self, tokens: &mut TokenStream) { > > } > > } > > > > +impl ToTokens for proc_macro::Ident { > > + fn to_tokens(&self, tokens: &mut TokenStream) { > > + tokens.extend([TokenTree::from(self.clone())]); > > + } > > +} > > + > > impl ToTokens for TokenTree { > > fn to_tokens(&self, tokens: &mut TokenStream) { > > tokens.extend([self.clone()]); > > @@ -40,7 +46,7 @@ fn to_tokens(&self, tokens: &mut TokenStream) { > > /// `quote` crate but provides only just enough functionality needed by > > the current `macros` crate. > > macro_rules! quote_spanned { > > ($span:expr => $($tt:tt)*) => {{ > > - let mut tokens; > > + let mut tokens: ::std::vec::Vec<::proc_macro::TokenTree>; > > #[allow(clippy::vec_init_then_push)] > > { > > tokens = ::std::vec::Vec::new(); > > @@ -65,7 +71,8 @@ macro_rules! quote_spanned { > > quote_spanned!(@proc $v $span $($tt)*); > > }; > > (@proc $v:ident $span:ident ( $($inner:tt)* ) $($tt:tt)*) => { > > - let mut tokens = ::std::vec::Vec::new(); > > + #[allow(unused_mut)] > > It'd be nice to mention the need for this attribute in the commit > message along with the added type annotations.
Adding a note to mention that when the () is empty, not only can't it infer the item type, it's also never modified. Alice