From b6ff541260a224263127ebad8f0f75c2ddfd7427 Mon Sep 17 00:00:00 2001 From: Shahar Naveh <50263213+ShaharNaveh@users.noreply.github.com> Date: Sun, 29 Jun 2025 18:22:52 +0300 Subject: [PATCH] Create ContentItem with a macro (#5859) * Create ContentItem with a macro * Set struct docs via metadata --- derive-impl/src/pyclass.rs | 101 +++++++++++++++---------------------- 1 file changed, 42 insertions(+), 59 deletions(-) diff --git a/derive-impl/src/pyclass.rs b/derive-impl/src/pyclass.rs index 3ff493bbc..777d52dd1 100644 --- a/derive-impl/src/pyclass.rs +++ b/derive-impl/src/pyclass.rs @@ -653,72 +653,55 @@ pub(crate) fn impl_pyexception_impl(attr: PunctuatedNestedMeta, item: Item) -> R }) } -/// #[pymethod] and #[pyclassmethod] -struct MethodItem { - inner: ContentItemInner, +macro_rules! define_content_item { + ( + $(#[$meta:meta])* + $vis:vis struct $name:ident + ) => { + $(#[$meta])* + $vis struct $name { + inner: ContentItemInner, + } + + impl ContentItem for $name { + type AttrName = AttrName; + + fn inner(&self) -> &ContentItemInner { + &self.inner + } + } + }; } -/// #[pygetset] -struct GetSetItem { - inner: ContentItemInner, -} +define_content_item!( + /// #[pymethod] and #[pyclassmethod] + struct MethodItem +); -/// #[pyslot] -struct SlotItem { - inner: ContentItemInner, -} +define_content_item!( + /// #[pygetset] + struct GetSetItem +); -/// #[pyattr] -struct AttributeItem { - inner: ContentItemInner, -} +define_content_item!( + /// #[pyslot] + struct SlotItem +); -/// #[extend_class] -struct ExtendClassItem { - inner: ContentItemInner, -} +define_content_item!( + /// #[pyattr] + struct AttributeItem +); -/// #[pymember] -struct MemberItem { - inner: ContentItemInner, -} +define_content_item!( + /// #[extend_class] + struct ExtendClassItem +); -impl ContentItem for MethodItem { - type AttrName = AttrName; - fn inner(&self) -> &ContentItemInner { - &self.inner - } -} -impl ContentItem for GetSetItem { - type AttrName = AttrName; - fn inner(&self) -> &ContentItemInner { - &self.inner - } -} -impl ContentItem for SlotItem { - type AttrName = AttrName; - fn inner(&self) -> &ContentItemInner { - &self.inner - } -} -impl ContentItem for AttributeItem { - type AttrName = AttrName; - fn inner(&self) -> &ContentItemInner { - &self.inner - } -} -impl ContentItem for ExtendClassItem { - type AttrName = AttrName; - fn inner(&self) -> &ContentItemInner { - &self.inner - } -} -impl ContentItem for MemberItem { - type AttrName = AttrName; - fn inner(&self) -> &ContentItemInner { - &self.inner - } -} +define_content_item!( + /// #[pymember] + struct MemberItem +); struct ImplItemArgs<'a, Item: ItemLike> { item: &'a Item,