On Wed Jun 11, 2025 at 12:31 PM CEST, Andreas Hindborg wrote: > "Benno Lossin" <los...@kernel.org> writes: >> On Tue May 6, 2025 at 3:02 PM CEST, Andreas Hindborg wrote: >>> diff --git a/rust/macros/helpers.rs b/rust/macros/helpers.rs >>> index a3ee27e29a6f..16d300ad3d3b 100644 >>> --- a/rust/macros/helpers.rs >>> +++ b/rust/macros/helpers.rs >>> @@ -10,6 +10,17 @@ pub(crate) fn try_ident(it: &mut token_stream::IntoIter) >>> -> Option<String> { >>> } >>> } >>> >>> +pub(crate) fn try_sign(it: &mut token_stream::IntoIter) -> Option<char> { >>> + let peek = it.clone().next(); >>> + match peek { >>> + Some(TokenTree::Punct(punct)) if punct.as_char() == '-' => { >> >> Should we also allow a leading `+`? > > I would argue no, because rust literals cannot start with `+`.
Makes sense. >>> + let _ = it.next(); >>> + Some(punct.as_char()) >>> + } >>> + _ => None, >>> + } >>> +} >>> + >>> pub(crate) fn try_literal(it: &mut token_stream::IntoIter) -> >>> Option<String> { >>> if let Some(TokenTree::Literal(literal)) = it.next() { >>> Some(literal.to_string()) >>> @@ -86,3 +97,17 @@ pub(crate) fn function_name(input: TokenStream) -> >>> Option<Ident> { >>> } >>> None >>> } >>> + >>> +/// Parse a token stream of the form `expected_name: "value",` and return >>> the >>> +/// string in the position of "value". >>> +/// >>> +/// # Panics >>> +/// >>> +/// - On parse error. >>> +pub(crate) fn expect_string_field(it: &mut token_stream::IntoIter, >>> expected_name: &str) -> String { >>> + assert_eq!(expect_ident(it), expected_name); >>> + assert_eq!(expect_punct(it), ':'); >>> + let string = expect_string(it); >>> + assert_eq!(expect_punct(it), ','); >> >> This won't allow omitting the trailing comma. > > This is in line with the rest of the module macro. Then we should change that: https://github.com/Rust-for-Linux/linux/issues/1172 >>> + string >>> +} >> >> [...] >> >>> @@ -186,33 +336,35 @@ pub(crate) fn module(ts: TokenStream) -> TokenStream { >>> let info = ModuleInfo::parse(&mut it); >>> >>> let mut modinfo = ModInfoBuilder::new(info.name.as_ref()); >>> - if let Some(author) = info.author { >>> - modinfo.emit("author", &author); >>> + if let Some(author) = &info.author { >>> + modinfo.emit("author", author); >>> } >>> - if let Some(authors) = info.authors { >>> + if let Some(authors) = &info.authors { >>> for author in authors { >>> - modinfo.emit("author", &author); >>> + modinfo.emit("author", author); >>> } >>> } >>> - if let Some(description) = info.description { >>> - modinfo.emit("description", &description); >>> + if let Some(description) = &info.description { >>> + modinfo.emit("description", description); >>> } >>> modinfo.emit("license", &info.license); >>> - if let Some(aliases) = info.alias { >>> + if let Some(aliases) = &info.alias { >>> for alias in aliases { >>> - modinfo.emit("alias", &alias); >>> + modinfo.emit("alias", alias); >>> } >>> } >>> - if let Some(firmware) = info.firmware { >>> + if let Some(firmware) = &info.firmware { >>> for fw in firmware { >>> - modinfo.emit("firmware", &fw); >>> + modinfo.emit("firmware", fw); >> >> I don't like that you have to change all of these. > > Why not? If I was to write this code in the first place, I would have > used a reference rather than pass by value. That's fine, but do it in a separate commit then. >> Can't you just take a >> `&[Parameter]` argument in `emit_params` instead of the whole >> `ModuleInfo` struct? > > I don't think that is a nice solution. I would have to pass the name > field as well, increasing the number of parameters to the function. Ah right makes sense. --- Cheers, Benno