diff --git a/newsfragments/4228.changed.md b/newsfragments/4228.changed.md new file mode 100644 index 00000000000..84323876b42 --- /dev/null +++ b/newsfragments/4228.changed.md @@ -0,0 +1 @@ +Changed the `module` option for complex enum variants to inherit from the value set on the complex enum `module`. diff --git a/pyo3-macros-backend/src/pyclass.rs b/pyo3-macros-backend/src/pyclass.rs index 6c7e7d8609c..255fc80c418 100644 --- a/pyo3-macros-backend/src/pyclass.rs +++ b/pyo3-macros-backend/src/pyclass.rs @@ -676,7 +676,7 @@ struct PyClassEnumVariantUnnamedField<'a> { } /// `#[pyo3()]` options for pyclass enum variants -#[derive(Default)] +#[derive(Clone, Default)] struct EnumVariantPyO3Options { name: Option, constructor: Option, @@ -949,7 +949,12 @@ fn impl_complex_enum( let variant_args = PyClassArgs { class_kind: PyClassKind::Struct, // TODO(mkovaxx): propagate variant.options - options: parse_quote!(extends = #cls, frozen), + options: { + let mut rigged_options: PyClassPyO3Options = parse_quote!(extends = #cls, frozen); + // If a specific module was given to the base class, use it for all variants. + rigged_options.module.clone_from(&args.options.module); + rigged_options + }, }; let variant_cls_pytypeinfo = impl_pytypeinfo(&variant_cls, &variant_args, None, ctx); diff --git a/pyo3-macros-backend/src/pyfunction/signature.rs b/pyo3-macros-backend/src/pyfunction/signature.rs index b73b96a3d59..0a2d861d2b1 100644 --- a/pyo3-macros-backend/src/pyfunction/signature.rs +++ b/pyo3-macros-backend/src/pyfunction/signature.rs @@ -13,6 +13,7 @@ use crate::{ method::{FnArg, RegularArg}, }; +#[derive(Clone)] pub struct Signature { paren_token: syn::token::Paren, pub items: Punctuated, @@ -36,35 +37,35 @@ impl ToTokens for Signature { } } -#[derive(Debug, PartialEq, Eq)] +#[derive(Clone, Debug, PartialEq, Eq)] pub struct SignatureItemArgument { pub ident: syn::Ident, pub eq_and_default: Option<(Token![=], syn::Expr)>, } -#[derive(Debug, PartialEq, Eq)] +#[derive(Clone, Debug, PartialEq, Eq)] pub struct SignatureItemPosargsSep { pub slash: Token![/], } -#[derive(Debug, PartialEq, Eq)] +#[derive(Clone, Debug, PartialEq, Eq)] pub struct SignatureItemVarargsSep { pub asterisk: Token![*], } -#[derive(Debug, PartialEq, Eq)] +#[derive(Clone, Debug, PartialEq, Eq)] pub struct SignatureItemVarargs { pub sep: SignatureItemVarargsSep, pub ident: syn::Ident, } -#[derive(Debug, PartialEq, Eq)] +#[derive(Clone, Debug, PartialEq, Eq)] pub struct SignatureItemKwargs { pub asterisks: (Token![*], Token![*]), pub ident: syn::Ident, } -#[derive(Debug, PartialEq, Eq)] +#[derive(Clone, Debug, PartialEq, Eq)] pub enum SignatureItem { Argument(Box), PosargsSep(SignatureItemPosargsSep), diff --git a/tests/test_enum.rs b/tests/test_enum.rs index 7bfd624af03..1406ac7f4d0 100644 --- a/tests/test_enum.rs +++ b/tests/test_enum.rs @@ -221,6 +221,24 @@ fn test_renaming_all_enum_variants() { }); } +#[pyclass(module = "custom_module")] +#[derive(Debug, Clone)] +enum CustomModuleComplexEnum { + Variant(), +} + +#[test] +fn test_custom_module() { + Python::with_gil(|py| { + let enum_obj = py.get_type_bound::(); + py_assert!( + py, + enum_obj, + "enum_obj.Variant.__module__ == 'custom_module'" + ); + }); +} + #[pyclass(frozen, eq, eq_int, hash)] #[derive(PartialEq, Hash)] enum SimpleEnumWithHash {