diff --git a/derive/src/pyclass.rs b/derive/src/pyclass.rs index 6e4a0491c..3ffab6930 100644 --- a/derive/src/pyclass.rs +++ b/derive/src/pyclass.rs @@ -426,7 +426,7 @@ pub fn impl_pyimpl(attr: AttributeArgs, item: Item) -> Result, attrs: &[Attribute], ) -> Result { let mut doc: Option> = None; @@ -452,10 +452,22 @@ fn generate_class_def( None => quote!(None), }; + let module_class_name = if let Some(module_name) = module_name { + format!("{}.{}", module_name, name) + } else { + name.to_owned() + }; + + let module_name = match module_name { + Some(v) => quote!(Some(#v) ), + None => quote!(None), + }; + let ret = quote! { impl ::rustpython_vm::pyobject::PyClassDef for #ident { const NAME: &'static str = #name; - const TP_NAME: &'static str = #tp_name; + const MODULE_NAME: Option<&'static str> = #module_name; + const TP_NAME: &'static str = #module_class_name; const DOC: Option<&'static str> = #doc; } }; @@ -473,13 +485,8 @@ pub fn impl_pyclass(attr: AttributeArgs, item: Item) -> Result Result; const TP_NAME: &'static str; const DOC: Option<&'static str> = None; } @@ -1436,6 +1437,7 @@ where T: PyClassDef, { const NAME: &'static str = T::NAME; + const MODULE_NAME: Option<&'static str> = T::MODULE_NAME; const TP_NAME: &'static str = T::TP_NAME; const DOC: Option<&'static str> = T::DOC; } @@ -1465,6 +1467,9 @@ pub trait PyClassImpl: PyClassDef { if let Some(doc) = Self::DOC { class.set_str_attr("__doc__", ctx.new_str(doc)); } + if let Some(module_name) = Self::MODULE_NAME { + class.set_str_attr("__module__", ctx.new_str(module_name)); + } } fn make_class(ctx: &PyContext) -> PyClassRef {