@@ -5,7 +5,7 @@ use crate::util::{
5
5
use proc_macro2:: { Span , TokenStream as TokenStream2 } ;
6
6
use quote:: { quote, quote_spanned, ToTokens } ;
7
7
use 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 } ;
9
9
10
10
struct Module {
11
11
name : String ,
@@ -173,33 +173,22 @@ impl Module {
173
173
}
174
174
"pyattr" => {
175
175
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 => {
190
180
if has_class {
191
181
return Err ( err_span ! (
192
182
meta,
193
183
"#[pyattr] must be placed on top of #[pyclass] or #[pystruct_sequence]" ,
194
184
) ) ;
195
185
}
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 ( ) ?) ?
200
187
}
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) ) ;
203
192
}
204
193
attr_name @ "pyclass" | attr_name @ "pystruct_sequence" => {
205
194
assert ! ( item. typ == ItemType :: Struct ) ;
@@ -399,28 +388,46 @@ pub fn impl_pymodule(attr: AttributeArgs, item: Item) -> Result<TokenStream2, Di
399
388
400
389
let items = content
401
390
. 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)
424
431
} )
425
432
. collect ( ) ;
426
433
0 commit comments