@@ -5,7 +5,7 @@ use crate::util::{
55use proc_macro2:: { Span , TokenStream as TokenStream2 } ;
66use quote:: { quote, quote_spanned, ToTokens } ;
77use std:: collections:: HashMap ;
8- use syn:: { parse_quote, spanned:: Spanned , AttributeArgs , Ident , Item , Meta , NestedMeta } ;
8+ use syn:: { parse_quote, spanned:: Spanned , AttributeArgs , Ident , Item , Meta , NestedMeta , UseTree } ;
99
1010struct Module {
1111 name : String ,
@@ -173,33 +173,22 @@ impl Module {
173173 }
174174 "pyattr" => {
175175 attr_idxs. push ( i) ;
176- match item. typ {
177- ItemType :: Fn => {
178- items. push ( (
179- Self :: extract_evaluated_attr ( item. ident , into_nested ( ) ?) ?,
180- meta_span,
181- ) ) ;
182- }
183- ItemType :: Const => {
184- items. push ( (
185- Self :: extract_const_attr ( item. ident , into_nested ( ) ?) ?,
186- meta_span,
187- ) ) ;
188- }
189- ItemType :: Struct => {
176+ let item = match item. typ {
177+ ItemType :: Fn => Self :: extract_evaluated_attr ( item. ident , into_nested ( ) ?) ?,
178+ ItemType :: Const => Self :: extract_const_attr ( item. ident , into_nested ( ) ?) ?,
179+ ItemType :: Struct | ItemType :: Enum => {
190180 if has_class {
191181 return Err ( err_span ! (
192182 meta,
193183 "#[pyattr] must be placed on top of #[pyclass] or #[pystruct_sequence]" ,
194184 ) ) ;
195185 }
196- items. push ( (
197- Self :: extract_class_attr ( item. ident , into_nested ( ) ?) ?,
198- meta_span,
199- ) ) ;
186+ Self :: extract_class_attr ( item. ident , into_nested ( ) ?) ?
200187 }
201- _ => unreachable ! ( ) ,
202- }
188+ ItemType :: Use => Self :: extract_const_attr ( item. ident , into_nested ( ) ?) ?,
189+ ItemType :: Method => unreachable ! ( ) ,
190+ } ;
191+ items. push ( ( item, meta_span) ) ;
203192 }
204193 attr_name @ "pyclass" | attr_name @ "pystruct_sequence" => {
205194 assert ! ( item. typ == ItemType :: Struct ) ;
@@ -399,28 +388,46 @@ pub fn impl_pymodule(attr: AttributeArgs, item: Item) -> Result<TokenStream2, Di
399388
400389 let items = content
401390 . iter_mut ( )
402- . filter_map ( |item| match item {
403- Item :: Fn ( syn:: ItemFn { attrs, sig, .. } ) => Some ( ItemIdent {
404- typ : ItemType :: Fn ,
405- attrs,
406- ident : & sig. ident ,
407- } ) ,
408- Item :: Struct ( syn:: ItemStruct { attrs, ident, .. } ) => Some ( ItemIdent {
409- typ : ItemType :: Struct ,
410- attrs,
411- ident,
412- } ) ,
413- Item :: Enum ( syn:: ItemEnum { attrs, ident, .. } ) => Some ( ItemIdent {
414- typ : ItemType :: Enum ,
415- attrs,
416- ident,
417- } ) ,
418- Item :: Const ( syn:: ItemConst { attrs, ident, .. } ) => Some ( ItemIdent {
419- typ : ItemType :: Const ,
420- attrs,
421- ident,
422- } ) ,
423- _ => None ,
391+ . filter_map ( |item| {
392+ let item = match item {
393+ Item :: Fn ( syn:: ItemFn { attrs, sig, .. } ) => ItemIdent {
394+ typ : ItemType :: Fn ,
395+ attrs,
396+ ident : & sig. ident ,
397+ } ,
398+ Item :: Struct ( syn:: ItemStruct { attrs, ident, .. } ) => ItemIdent {
399+ typ : ItemType :: Struct ,
400+ attrs,
401+ ident,
402+ } ,
403+ Item :: Enum ( syn:: ItemEnum { attrs, ident, .. } ) => ItemIdent {
404+ typ : ItemType :: Enum ,
405+ attrs,
406+ ident,
407+ } ,
408+ Item :: Const ( syn:: ItemConst { attrs, ident, .. } ) => ItemIdent {
409+ typ : ItemType :: Const ,
410+ attrs,
411+ ident,
412+ } ,
413+ Item :: Use ( syn:: ItemUse { attrs, tree, .. } ) => {
414+ let ident = match tree {
415+ UseTree :: Path ( path) => match & * path. tree {
416+ UseTree :: Name ( name) => & name. ident ,
417+ UseTree :: Rename ( rename) => & rename. rename ,
418+ _ => return None ,
419+ } ,
420+ _ => return None ,
421+ } ;
422+ ItemIdent {
423+ typ : ItemType :: Use ,
424+ attrs,
425+ ident,
426+ }
427+ }
428+ _ => return None ,
429+ } ;
430+ Some ( item)
424431 } )
425432 . collect ( ) ;
426433
0 commit comments