Commit 9578c390 authored by Tamir Duberstein's avatar Tamir Duberstein Committed by Miguel Ojeda
Browse files

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 dbd5058b
("rust: make pin-init its own crate").

Acked-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Reviewed-by: default avatarAlice Ryhl <aliceryhl@google.com>
Acked-by: default avatarDanilo Krummrich <dakr@kernel.org>
Signed-off-by: default avatarTamir Duberstein <tamird@gmail.com>
Signed-off-by: default avatarMiguel Ojeda <ojeda@kernel.org>
parent 65740363
Loading
Loading
Loading
Loading
+49 −55
Original line number Diff line number Diff line
@@ -2,7 +2,6 @@

use proc_macro::{TokenStream, TokenTree};

#[allow(dead_code)]
pub(crate) trait ToTokens {
    fn to_tokens(&self, tokens: &mut TokenStream);
}
@@ -47,121 +46,116 @@ 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: ::std::vec::Vec<::proc_macro::TokenTree>;
        #[allow(clippy::vec_init_then_push)]
        let mut tokens = ::proc_macro::TokenStream::new();
        {
            tokens = ::std::vec::Vec::new();
            let span = $span;
            quote_spanned!(@proc tokens span $($tt)*);
        }
        ::proc_macro::TokenStream::from_iter(tokens)
        tokens
    }};
    (@proc $v:ident $span:ident) => {};
    (@proc $v:ident $span:ident #$id:ident $($tt:tt)*) => {
        let mut ts = ::proc_macro::TokenStream::new();
        $crate::quote::ToTokens::to_tokens(&$id, &mut ts);
        $v.extend(ts);
        $crate::quote::ToTokens::to_tokens(&$id, &mut $v);
        quote_spanned!(@proc $v $span $($tt)*);
    };
    (@proc $v:ident $span:ident #(#$id:ident)* $($tt:tt)*) => {
        for token in $id {
            let mut ts = ::proc_macro::TokenStream::new();
            $crate::quote::ToTokens::to_tokens(&token, &mut ts);
            $v.extend(ts);
            $crate::quote::ToTokens::to_tokens(&token, &mut $v);
        }
        quote_spanned!(@proc $v $span $($tt)*);
    };
    (@proc $v:ident $span:ident ( $($inner:tt)* ) $($tt:tt)*) => {
        #[allow(unused_mut)]
        let mut tokens = ::std::vec::Vec::<::proc_macro::TokenTree>::new();
        let mut tokens = ::proc_macro::TokenStream::new();
        quote_spanned!(@proc tokens $span $($inner)*);
        $v.push(::proc_macro::TokenTree::Group(::proc_macro::Group::new(
        $v.extend([::proc_macro::TokenTree::Group(::proc_macro::Group::new(
            ::proc_macro::Delimiter::Parenthesis,
            ::proc_macro::TokenStream::from_iter(tokens)
        )));
            tokens,
        ))]);
        quote_spanned!(@proc $v $span $($tt)*);
    };
    (@proc $v:ident $span:ident [ $($inner:tt)* ] $($tt:tt)*) => {
        let mut tokens = ::std::vec::Vec::new();
        let mut tokens = ::proc_macro::TokenStream::new();
        quote_spanned!(@proc tokens $span $($inner)*);
        $v.push(::proc_macro::TokenTree::Group(::proc_macro::Group::new(
        $v.extend([::proc_macro::TokenTree::Group(::proc_macro::Group::new(
            ::proc_macro::Delimiter::Bracket,
            ::proc_macro::TokenStream::from_iter(tokens)
        )));
            tokens,
        ))]);
        quote_spanned!(@proc $v $span $($tt)*);
    };
    (@proc $v:ident $span:ident { $($inner:tt)* } $($tt:tt)*) => {
        let mut tokens = ::std::vec::Vec::new();
        let mut tokens = ::proc_macro::TokenStream::new();
        quote_spanned!(@proc tokens $span $($inner)*);
        $v.push(::proc_macro::TokenTree::Group(::proc_macro::Group::new(
        $v.extend([::proc_macro::TokenTree::Group(::proc_macro::Group::new(
            ::proc_macro::Delimiter::Brace,
            ::proc_macro::TokenStream::from_iter(tokens)
        )));
            tokens,
        ))]);
        quote_spanned!(@proc $v $span $($tt)*);
    };
    (@proc $v:ident $span:ident :: $($tt:tt)*) => {
        $v.push(::proc_macro::TokenTree::Punct(
                ::proc_macro::Punct::new(':', ::proc_macro::Spacing::Joint)
        ));
        $v.push(::proc_macro::TokenTree::Punct(
                ::proc_macro::Punct::new(':', ::proc_macro::Spacing::Alone)
        ));
        $v.extend([::proc_macro::Spacing::Joint, ::proc_macro::Spacing::Alone].map(|spacing| {
            ::proc_macro::TokenTree::Punct(::proc_macro::Punct::new(':', spacing))
        }));
        quote_spanned!(@proc $v $span $($tt)*);
    };
    (@proc $v:ident $span:ident : $($tt:tt)*) => {
        $v.push(::proc_macro::TokenTree::Punct(
                ::proc_macro::Punct::new(':', ::proc_macro::Spacing::Alone)
        ));
        $v.extend([::proc_macro::TokenTree::Punct(
            ::proc_macro::Punct::new(':', ::proc_macro::Spacing::Alone),
        )]);
        quote_spanned!(@proc $v $span $($tt)*);
    };
    (@proc $v:ident $span:ident , $($tt:tt)*) => {
        $v.push(::proc_macro::TokenTree::Punct(
                ::proc_macro::Punct::new(',', ::proc_macro::Spacing::Alone)
        ));
        $v.extend([::proc_macro::TokenTree::Punct(
            ::proc_macro::Punct::new(',', ::proc_macro::Spacing::Alone),
        )]);
        quote_spanned!(@proc $v $span $($tt)*);
    };
    (@proc $v:ident $span:ident @ $($tt:tt)*) => {
        $v.push(::proc_macro::TokenTree::Punct(
                ::proc_macro::Punct::new('@', ::proc_macro::Spacing::Alone)
        ));
        $v.extend([::proc_macro::TokenTree::Punct(
            ::proc_macro::Punct::new('@', ::proc_macro::Spacing::Alone),
        )]);
        quote_spanned!(@proc $v $span $($tt)*);
    };
    (@proc $v:ident $span:ident ! $($tt:tt)*) => {
        $v.push(::proc_macro::TokenTree::Punct(
                ::proc_macro::Punct::new('!', ::proc_macro::Spacing::Alone)
        ));
        $v.extend([::proc_macro::TokenTree::Punct(
            ::proc_macro::Punct::new('!', ::proc_macro::Spacing::Alone),
        )]);
        quote_spanned!(@proc $v $span $($tt)*);
    };
    (@proc $v:ident $span:ident ; $($tt:tt)*) => {
        $v.push(::proc_macro::TokenTree::Punct(
                ::proc_macro::Punct::new(';', ::proc_macro::Spacing::Alone)
        ));
        $v.extend([::proc_macro::TokenTree::Punct(
            ::proc_macro::Punct::new(';', ::proc_macro::Spacing::Alone),
        )]);
        quote_spanned!(@proc $v $span $($tt)*);
    };
    (@proc $v:ident $span:ident + $($tt:tt)*) => {
        $v.push(::proc_macro::TokenTree::Punct(
                ::proc_macro::Punct::new('+', ::proc_macro::Spacing::Alone)
        ));
        $v.extend([::proc_macro::TokenTree::Punct(
            ::proc_macro::Punct::new('+', ::proc_macro::Spacing::Alone),
        )]);
        quote_spanned!(@proc $v $span $($tt)*);
    };
    (@proc $v:ident $span:ident = $($tt:tt)*) => {
        $v.push(::proc_macro::TokenTree::Punct(
                ::proc_macro::Punct::new('=', ::proc_macro::Spacing::Alone)
        ));
        $v.extend([::proc_macro::TokenTree::Punct(
            ::proc_macro::Punct::new('=', ::proc_macro::Spacing::Alone),
        )]);
        quote_spanned!(@proc $v $span $($tt)*);
    };
    (@proc $v:ident $span:ident # $($tt:tt)*) => {
        $v.push(::proc_macro::TokenTree::Punct(
                ::proc_macro::Punct::new('#', ::proc_macro::Spacing::Alone)
        ));
        $v.extend([::proc_macro::TokenTree::Punct(
            ::proc_macro::Punct::new('#', ::proc_macro::Spacing::Alone),
        )]);
        quote_spanned!(@proc $v $span $($tt)*);
    };
    (@proc $v:ident $span:ident _ $($tt:tt)*) => {
        $v.push(::proc_macro::TokenTree::Ident(::proc_macro::Ident::new("_", $span)));
        $v.extend([::proc_macro::TokenTree::Ident(
            ::proc_macro::Ident::new("_", $span),
        )]);
        quote_spanned!(@proc $v $span $($tt)*);
    };
    (@proc $v:ident $span:ident $id:ident $($tt:tt)*) => {
        $v.push(::proc_macro::TokenTree::Ident(::proc_macro::Ident::new(stringify!($id), $span)));
        $v.extend([::proc_macro::TokenTree::Ident(
            ::proc_macro::Ident::new(stringify!($id), $span),
        )]);
        quote_spanned!(@proc $v $span $($tt)*);
    };
}