[PATCH 1/4] rust: pin-init: internal: extract utility code to new module

From: Gary Guo

Date: Fri Sep 04 2026 - 10:51:44 EST


Create a new `util.rs` to host utility code that are generic and can be
shared by multiple macros.

Signed-off-by: Gary Guo <gary@xxxxxxxxxxx>
---
rust/pin-init/internal/src/lib.rs | 1 +
rust/pin-init/internal/src/pin_data.rs | 17 +++++------------
rust/pin-init/internal/src/util.rs | 27 +++++++++++++++++++++++++++
3 files changed, 33 insertions(+), 12 deletions(-)

diff --git a/rust/pin-init/internal/src/lib.rs b/rust/pin-init/internal/src/lib.rs
index 60d5093f3128..4d8ff86484b6 100644
--- a/rust/pin-init/internal/src/lib.rs
+++ b/rust/pin-init/internal/src/lib.rs
@@ -18,6 +18,7 @@
mod init;
mod pin_data;
mod pinned_drop;
+mod util;
mod zeroable;

#[proc_macro_attribute]
diff --git a/rust/pin-init/internal/src/pin_data.rs b/rust/pin-init/internal/src/pin_data.rs
index ff194d27565e..074bc6b3091a 100644
--- a/rust/pin-init/internal/src/pin_data.rs
+++ b/rust/pin-init/internal/src/pin_data.rs
@@ -10,7 +10,10 @@
Field, Fields, Generics, Ident, Item, PathSegment, Type, TypePath, Visibility, WhereClause,
};

-use crate::diagnostics::{DiagCtxt, ErrorGuaranteed};
+use crate::{
+ diagnostics::{DiagCtxt, ErrorGuaranteed},
+ util::*,
+};

pub(crate) mod kw {
syn::custom_keyword!(PinnedDrop);
@@ -81,21 +84,11 @@ pub(crate) fn pin_data(
//
// We need to perform this after parsing so we can reliably detect field cfgs.
for (field_idx, field) in struct_.fields.iter_mut().enumerate() {
- let cfg: Vec<_> = field
- .attrs
- .iter()
- .filter(|a| a.path().is_ident("cfg"))
- .map(|a| {
- a.parse_args::<TokenStream>()
- .expect("parse as token stream cannot fail")
- })
- .collect();
-
+ let cfg = field.attrs.extract_cfg_attrs();
if cfg.is_empty() {
continue;
}

- field.attrs.retain(|a| !a.path().is_ident("cfg"));
let cfg_true_struct = quote!(#struct_);

let punctuated = match &mut struct_.fields {
diff --git a/rust/pin-init/internal/src/util.rs b/rust/pin-init/internal/src/util.rs
new file mode 100644
index 000000000000..ed18ab7d45e6
--- /dev/null
+++ b/rust/pin-init/internal/src/util.rs
@@ -0,0 +1,27 @@
+// SPDX-License-Identifier: Apache-2.0 OR MIT
+
+use proc_macro2::TokenStream;
+use syn::Attribute;
+
+pub(crate) trait AttrListExt {
+ fn extract_cfg_attrs(&mut self) -> Vec<TokenStream>;
+}
+
+impl AttrListExt for Vec<Attribute> {
+ fn extract_cfg_attrs(&mut self) -> Vec<TokenStream> {
+ let cfg: Vec<_> = self
+ .iter()
+ .filter(|a| a.path().is_ident("cfg"))
+ .map(|a| {
+ a.parse_args::<TokenStream>()
+ .expect("parse as token stream cannot fail")
+ })
+ .collect();
+
+ if !cfg.is_empty() {
+ self.retain(|a| !a.path().is_ident("cfg"));
+ }
+
+ cfg
+ }
+}

--
2.54.0