From: Charalampos Mitrodimas <charmitro@posteo.net>
To: Eunsoo Eun <ewhk9887@gmail.com>
Cc: rust-for-linux@vger.kernel.org, linux-kernel@vger.kernel.org,
Eunsoo Eun <naturale@hufs.ac.kr>,
Benno Lossin <benno.lossin@proton.me>
Subject: Re: [PATCH 1/2] rust: macros: allow optional trailing comma in module!
Date: Sat, 14 Jun 2025 17:42:27 +0000 [thread overview]
Message-ID: <87zfeamd8c.fsf@posteo.net> (raw)
In-Reply-To: <20250614081312.763606-1-ewhk9887@gmail.com>
Eunsoo Eun <ewhk9887@gmail.com> writes:
> From: Eunsoo Eun <naturale@hufs.ac.kr>
>
> Make the `module!` macro syntax more flexible by allowing an optional
> trailing comma after the last field. This makes it consistent with
> Rust’s general syntax patterns where trailing commas are allowed in
> structs, arrays, and other comma-separated lists.
>
> For example, these are now all valid:
>
> module! {
> type: MyModule,
> name: "mymodule",
> license: "GPL" // No trailing comma
> }
>
> module! {
> type: MyModule,
> name: "mymodule",
> license: "GPL", // With trailing comma
> }
>
> This change also allows optional trailing commas in array fields like
> `authors`, `alias`, and `firmware`:
>
> module! {
> type: MyModule,
> name: "mymodule",
> authors: ["Author 1", "Author 2"], // No trailing comma
> license: "GPL"
> }
>
> module! {
> type: MyModule,
> name: "mymodule",
> authors: ["Author 1", "Author 2",], // With trailing comma
> license: "GPL"
> }
>
> Suggested-by: Benno Lossin <benno.lossin@proton.me>
> Link: https://github.com/Rust-for-Linux/linux/issues/1172
> Signed-off-by: Eunsoo Eun <naturale@hufs.ac.kr>
> ---
> rust/macros/concat_idents.rs | 9 ++++++++
> rust/macros/module.rs | 42 ++++++++++++++++++++++++++++++------
> 2 files changed, 45 insertions(+), 6 deletions(-)
>
> diff --git a/rust/macros/concat_idents.rs b/rust/macros/concat_idents.rs
> index 7e4b450f3a50..c139e1658b4a 100644
> --- a/rust/macros/concat_idents.rs
> +++ b/rust/macros/concat_idents.rs
> @@ -17,6 +17,15 @@ pub(crate) fn concat_idents(ts: TokenStream) -> TokenStream {
> let a = expect_ident(&mut it);
> assert_eq!(expect_punct(&mut it), ',');
> let b = expect_ident(&mut it);
> +
We have some whitespaces here ^
> + // Check for optional trailing comma
> + if let Some(TokenTree::Punct(punct)) = it.clone().next() {
> + if punct.as_char() == ',' {
> + // Consume the trailing comma
> + it.next();
> + }
> + }
> +
Whitespaces also here ^.
Maybe you can add a new helper function for this one?
> 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)])
> diff --git a/rust/macros/module.rs b/rust/macros/module.rs
> index 2ddd2eeb2852..d37492457be5 100644
> --- a/rust/macros/module.rs
> +++ b/rust/macros/module.rs
> @@ -13,10 +13,27 @@ fn expect_string_array(it: &mut token_stream::IntoIter) -> Vec<String> {
> while let Some(val) = try_string(&mut it) {
> assert!(val.is_ascii(), "Expected ASCII string");
> values.push(val);
> - match it.next() {
> - Some(TokenTree::Punct(punct)) => assert_eq!(punct.as_char(), ','),
> - None => break,
> - _ => panic!("Expected ',' or end of array"),
> +
> + // Check for optional trailing comma
> + match it.clone().next() {
We might be able to do something like this here,
let next_token = it.clone().next();
match next_token {
...
> + Some(TokenTree::Punct(punct)) if punct.as_char() == ',' => {
> + // Consume the comma
> + it.next();
> + // Check if there's another string after the comma
> + if it.clone().next().is_none() {
> + // Trailing comma at end of array is allowed
> + break;
> + }
Lose this, and let it check naturally?
> + }
> + Some(TokenTree::Literal(_)) => {
> + // Next item is a string literal, comma was required
> + panic!("Expected ',' between array elements");
> + }
> + None => {
> + // End of array, no comma needed
> + break;
> + }
> + Some(_) => panic!("Expected ',' or end of array"),
> }
> }
> values
> @@ -143,9 +160,22 @@ fn parse(it: &mut token_stream::IntoIter) -> Self {
> _ => panic!("Unknown key \"{key}\". Valid keys are: {EXPECTED_KEYS:?}."),
> }
>
> - assert_eq!(expect_punct(it), ',');
> -
> seen_keys.push(key);
> +
> + // Check for optional trailing comma
> + match it.clone().next() {
> + Some(TokenTree::Punct(punct)) if punct.as_char() == ',' => {
> + // Consume the comma
> + it.next();
> + }
> + Some(TokenTree::Ident(_)) => {
> + // Next item is an identifier, comma was required
> + panic!("Expected ',' between module properties");
> + }
> + _ => {
> + // End of input or closing brace, comma is optional
> + }
> + }
> }
>
> expect_end(it);
next prev parent reply other threads:[~2025-06-14 17:42 UTC|newest]
Thread overview: 9+ messages / expand[flat|nested] mbox.gz Atom feed top
2025-06-14 8:13 [PATCH 1/2] rust: macros: allow optional trailing comma in module! Eunsoo Eun
2025-06-14 8:13 ` [PATCH 1/2] spi: spi-pci1xxxx: Drop MSI-X usage as unsupported by DMA engine Eunsoo Eun
2025-06-17 8:05 ` Miguel Ojeda
2025-06-19 3:44 ` Thangaraj.S
2025-06-21 16:24 ` Miguel Ojeda
2025-06-14 17:42 ` Charalampos Mitrodimas [this message]
2025-06-14 18:15 ` [PATCH 1/2] rust: macros: allow optional trailing comma in module! Benno Lossin
2025-06-17 8:13 ` Miguel Ojeda
2025-06-16 15:51 ` Mark Brown
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=87zfeamd8c.fsf@posteo.net \
--to=charmitro@posteo.net \
--cc=benno.lossin@proton.me \
--cc=ewhk9887@gmail.com \
--cc=linux-kernel@vger.kernel.org \
--cc=naturale@hufs.ac.kr \
--cc=rust-for-linux@vger.kernel.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.