From a863b21b1e665d8fed0022c0175ffbdc5d94c06c Mon Sep 17 00:00:00 2001 From: Gary Guo Date: Mon, 12 Jan 2026 17:07:18 +0000 Subject: [PATCH] rust: macros: convert `concat_idents!` to use `syn` This eliminates the need for `expect_punct` helper. Reviewed-by: Tamir Duberstein Reviewed-by: Benno Lossin Signed-off-by: Gary Guo Link: https://patch.msgid.link/20260112170919.1888584-8-gary@kernel.org Signed-off-by: Miguel Ojeda --- rust/macros/concat_idents.rs | 39 ++++++++++++++++++++++++------------ rust/macros/helpers.rs | 14 +------------ rust/macros/lib.rs | 4 ++-- 3 files changed, 29 insertions(+), 28 deletions(-) diff --git a/rust/macros/concat_idents.rs b/rust/macros/concat_idents.rs index 12cb231c3d715..47b6add378d2c 100644 --- a/rust/macros/concat_idents.rs +++ b/rust/macros/concat_idents.rs @@ -1,23 +1,36 @@ // SPDX-License-Identifier: GPL-2.0 -use proc_macro2::{token_stream, Ident, TokenStream, TokenTree}; +use proc_macro2::{ + Ident, + TokenStream, + TokenTree, // +}; +use syn::{ + parse::{ + Parse, + ParseStream, // + }, + Result, + Token, // +}; -use crate::helpers::expect_punct; +pub(crate) struct Input { + a: Ident, + _comma: Token![,], + b: Ident, +} -fn expect_ident(it: &mut token_stream::IntoIter) -> Ident { - if let Some(TokenTree::Ident(ident)) = it.next() { - ident - } else { - panic!("Expected Ident") +impl Parse for Input { + fn parse(input: ParseStream<'_>) -> Result { + Ok(Self { + a: input.parse()?, + _comma: input.parse()?, + b: input.parse()?, + }) } } -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), ','); - let b = expect_ident(&mut it); - assert!(it.next().is_none(), "only two idents can be concatenated"); +pub(crate) fn concat_idents(Input { a, b, .. }: Input) -> TokenStream { let res = Ident::new(&format!("{a}{b}"), b.span()); TokenStream::from_iter([TokenTree::Ident(res)]) } diff --git a/rust/macros/helpers.rs b/rust/macros/helpers.rs index 754c827cc21e1..adfa60d8f42d8 100644 --- a/rust/macros/helpers.rs +++ b/rust/macros/helpers.rs @@ -1,10 +1,6 @@ // SPDX-License-Identifier: GPL-2.0 -use proc_macro2::{ - token_stream, - TokenStream, - TokenTree, // -}; +use proc_macro2::TokenStream; use quote::ToTokens; use syn::{ parse::{ @@ -16,14 +12,6 @@ use syn::{ Result, // }; -pub(crate) fn expect_punct(it: &mut token_stream::IntoIter) -> char { - if let TokenTree::Punct(punct) = it.next().expect("Reached end of token stream for Punct") { - punct.as_char() - } else { - panic!("Expected Punct"); - } -} - /// A string literal that is required to have ASCII value only. pub(crate) struct AsciiLitStr(LitStr); diff --git a/rust/macros/lib.rs b/rust/macros/lib.rs index 027ddaa2d710d..b45e974f992e8 100644 --- a/rust/macros/lib.rs +++ b/rust/macros/lib.rs @@ -311,8 +311,8 @@ pub fn fmt(input: TokenStream) -> TokenStream { /// assert_eq!(BR_OK, binder_driver_return_protocol_BR_OK); /// ``` #[proc_macro] -pub fn concat_idents(ts: TokenStream) -> TokenStream { - concat_idents::concat_idents(ts.into()).into() +pub fn concat_idents(input: TokenStream) -> TokenStream { + concat_idents::concat_idents(parse_macro_input!(input)).into() } /// Paste identifiers together. -- 2.47.3