On Tue, May 27, 2025 at 12:18 AM Tamir Duberstein <tam...@gmail.com> wrote: > > > +} > > > + > > > +fn make_ident<'a, T: IntoIterator<Item = &'a str>>( > > > + span: Span, > > > + names: T, > > > +) -> impl Iterator<Item = TokenTree> + use<'a, T> { > > > + names.into_iter().flat_map(move |name| { > > > + [ > > > + TokenTree::Punct(Punct::new(':', Spacing::Joint)), > > > + TokenTree::Punct(Punct::new(':', Spacing::Alone)), > > > + TokenTree::Ident(Ident::new(name, span)), > > > + ] > > > + }) > > > +} > > > diff --git a/rust/macros/lib.rs b/rust/macros/lib.rs > > > index d31e50c446b0..fa956eaa3ba7 100644 > > > --- a/rust/macros/lib.rs > > > +++ b/rust/macros/lib.rs > > > @@ -10,6 +10,7 @@ > > > mod quote; > > > mod concat_idents; > > > mod export; > > > +mod fmt; > > > mod helpers; > > > mod kunit; > > > mod module; > > > @@ -196,6 +197,24 @@ pub fn export(attr: TokenStream, ts: TokenStream) -> > > > TokenStream { > > > export::export(attr, ts) > > > } > > > > > > +/// Like [`core::format_args!`], but automatically wraps arguments in > > > [`kernel::fmt::Adapter`]. > > > +/// > > > +/// This macro allows generating `core::fmt::Arguments` while ensuring > > > that each argument is wrapped > > > +/// with `::kernel::fmt::Adapter`, which customizes formatting behavior > > > for kernel logging. > > > +/// > > > +/// Named arguments used in the format string (e.g. `{foo}`) are > > > detected and resolved from local > > > +/// bindings. All positional and named arguments are automatically > > > wrapped. > > > +/// > > > +/// This macro is an implementation detail of other kernel logging > > > macros like [`pr_info!`] and > > > +/// should not typically be used directly. > > > +/// > > > +/// [`kernel::fmt::Adapter`]: ../kernel/fmt/struct.Adapter.html > > > +/// [`pr_info!`]: ../kernel/macro.pr_info.html > > > +#[proc_macro] > > > +pub fn fmt(input: TokenStream) -> TokenStream { > > > > I'm wondering if we should name this `format_args` instead in order to > > better communicate that it's a replacement for `core::format_args!`. > > Unfortunately that introduces ambiguity in cases where > kernel::prelude::* is imported because core::format_args is in core's > prelude.
I'm pretty sure that glob imports are higher priority than the core prelude? Or is this because there are macros that now incorrectly use kernel::prelude::format_args when they should use the one from core? Alice