(&self)
| 1646 | |
| 1647 | impl SlotItemMeta { |
| 1648 | fn slot_name(&self) -> Result<Ident> { |
| 1649 | let inner = self.inner(); |
| 1650 | let method_name = if let Some((_, meta)) = inner.meta_map.get("name") { |
| 1651 | match meta { |
| 1652 | Meta::Path(path) => path.get_ident().cloned(), |
| 1653 | _ => None, |
| 1654 | } |
| 1655 | } else { |
| 1656 | let ident_str = self.inner().item_name(); |
| 1657 | // Convert to lowercase to handle both SLOT_NEW and slot_new |
| 1658 | let ident_lower = ident_str.to_lowercase(); |
| 1659 | let name = if let Some(stripped) = ident_lower.strip_prefix("slot_") { |
| 1660 | proc_macro2::Ident::new(stripped, inner.item_ident.span()) |
| 1661 | } else { |
| 1662 | inner.item_ident.clone() |
| 1663 | }; |
| 1664 | Some(name) |
| 1665 | }; |
| 1666 | let method_name = method_name.ok_or_else(|| { |
| 1667 | err_span!( |
| 1668 | inner.meta_ident, |
| 1669 | "#[pyslot] must be of the form #[pyslot] or #[pyslot(slot_name)]", |
| 1670 | ) |
| 1671 | })?; |
| 1672 | |
| 1673 | // Strip double underscores from slot names like __init__ -> init |
| 1674 | let method_name_str = method_name.to_string(); |
| 1675 | let slot_name = if method_name_str.starts_with("__") |
| 1676 | && method_name_str.ends_with("__") |
| 1677 | && method_name_str.len() > 4 |
| 1678 | { |
| 1679 | &method_name_str[2..method_name_str.len() - 2] |
| 1680 | } else { |
| 1681 | &method_name_str |
| 1682 | }; |
| 1683 | |
| 1684 | Ok(proc_macro2::Ident::new(slot_name, slot_name.span())) |
| 1685 | } |
| 1686 | } |
| 1687 | |
| 1688 | struct MemberItemMeta(ItemMetaInner); |
no test coverage detected