lkml.org 
[lkml]   [2023]   [Feb]   [24]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Date
    Subject[PATCH 2/3] rust: macros: concat_idents: Allow :: paths in the first argument
    This makes things like concat_idents!(bindings::foo, bar) work.
    Otherwise, there is no way to concatenate two idents and then use the
    result as part of a type path.

    Signed-off-by: Asahi Lina <lina@asahilina.net>
    ---
    rust/macros/concat_idents.rs | 24 +++++++++++++++++++++---
    1 file changed, 21 insertions(+), 3 deletions(-)

    diff --git a/rust/macros/concat_idents.rs b/rust/macros/concat_idents.rs
    index 6d955d65016e..d6614b900aa2 100644
    --- a/rust/macros/concat_idents.rs
    +++ b/rust/macros/concat_idents.rs
    @@ -14,10 +14,28 @@ fn expect_ident(it: &mut token_stream::IntoIter) -> Ident {

    pub(crate) fn concat_idents(ts: TokenStream) -> TokenStream {
    let mut it = ts.into_iter();
    - let a = expect_ident(&mut it);
    - assert_eq!(expect_punct(&mut it).as_char(), ',');
    + let mut out = TokenStream::new();
    + let a = loop {
    + let ident = expect_ident(&mut it);
    + let punct = expect_punct(&mut it);
    + match punct.as_char() {
    + ',' => break ident,
    + ':' => {
    + let punct2 = expect_punct(&mut it);
    + assert_eq!(punct2.as_char(), ':');
    + out.extend([
    + TokenTree::Ident(ident),
    + TokenTree::Punct(punct),
    + TokenTree::Punct(punct2),
    + ]);
    + }
    + _ => panic!("Expected , or ::"),
    + }
    + };
    +
    let b = expect_ident(&mut it);
    assert!(it.next().is_none(), "only two idents can be concatenated");
    let res = Ident::new(&format!("{a}{b}"), b.span());
    - TokenStream::from_iter([TokenTree::Ident(res)])
    + out.extend([TokenTree::Ident(res)]);
    + out
    }
    --
    2.35.1

    \
     
     \ /
      Last update: 2023-03-27 00:34    [W:4.312 / U:0.180 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site