From f164b757d409224db24061dc6a23740c7ccd62f4 Mon Sep 17 00:00:00 2001 From: Jeong YunWon Date: Tue, 11 Aug 2020 05:01:55 +0900 Subject: [PATCH] inject module name into class --- derive/src/pymodule.rs | 32 +++++++++++++++++++++----------- 1 file changed, 21 insertions(+), 11 deletions(-) diff --git a/derive/src/pymodule.rs b/derive/src/pymodule.rs index e2b997e7c..0e8375574 100644 --- a/derive/src/pymodule.rs +++ b/derive/src/pymodule.rs @@ -5,8 +5,8 @@ use quote::{quote, quote_spanned, ToTokens}; use std::collections::HashMap; use syn::{parse_quote, spanned::Spanned, AttributeArgs, Ident, Item, Meta, NestedMeta}; -#[derive(Default)] struct Module { + name: String, items: HashMap<(String, Vec), ModuleItem>, } @@ -142,15 +142,11 @@ impl Module { let mut items = Vec::new(); let mut cfgs = Vec::new(); let mut has_class = false; - for (i, meta) in item - .attrs - .iter() - .filter_map(|attr| attr.parse_meta().ok()) - .enumerate() - { + for (i, attr) in item.attrs.iter_mut().enumerate() { + let meta = attr.parse_meta()?; let meta_span = meta.span(); let name = match meta.path().get_ident() { - Some(name) => name, + Some(name) => name.clone(), None => continue, }; @@ -205,6 +201,17 @@ impl Module { } attr_name @ "pyclass" | attr_name @ "pystruct_sequence" => { assert!(item.typ == ItemType::Struct); + + let mut metalist = match &meta { + Meta::Path(path) => parse_quote!(#path()), + Meta::List(metalist) => metalist.clone(), + _ => unreachable!(), + }; + let module_name = &self.name; + metalist.nested.push(parse_quote! {module = #module_name}); + + *attr = parse_quote!(#[#metalist]); + if has_class { Err(err_span!( meta, @@ -285,13 +292,16 @@ fn extract_module_items( ) -> Result { let mut diagnostics: Vec = Vec::new(); - let mut module = Module::default(); + let mut module = Module { + name: module_name.to_owned(), + items: Default::default(), + }; for item in items.iter_mut() { push_diag_result!(diagnostics, module.extract_item_from_syn(item),); } - let functions = module + let items = module .items .into_iter() .map(|((_name, cfgs), item)| match item { @@ -361,7 +371,7 @@ fn extract_module_items( Diagnostic::from_vec(diagnostics)?; Ok(quote! { - #(#functions)* + #(#items)* }) }