Skip to content

Commit b57d943

Browse files
authored
Merge pull request RustPython#2117 from youknowone/pymodule-attr-use
Allow `use` for `#[pyattr]`
2 parents cf10a34 + 33bb4e1 commit b57d943

File tree

3 files changed

+63
-59
lines changed

3 files changed

+63
-59
lines changed

derive/src/pymodule.rs

Lines changed: 50 additions & 43 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ use crate::util::{
55
use proc_macro2::{Span, TokenStream as TokenStream2};
66
use quote::{quote, quote_spanned, ToTokens};
77
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};
99

1010
struct 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

derive/src/util.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -84,6 +84,7 @@ pub(crate) enum ItemType {
8484
Struct,
8585
Enum,
8686
Const,
87+
Use,
8788
}
8889

8990
pub(crate) struct ItemIdent<'a> {

vm/src/stdlib/zlib.rs

Lines changed: 12 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -1,19 +1,4 @@
1-
use crate::pyobject::PyObjectRef;
2-
use crate::vm::VirtualMachine;
3-
4-
pub fn make_module(vm: &VirtualMachine) -> PyObjectRef {
5-
use libz_sys as libz;
6-
let module = decl::make_module(vm);
7-
let ctx = &vm.ctx;
8-
extend_module!(vm, module, {
9-
"Z_DEFAULT_COMPRESSION" => ctx.new_int(libz::Z_DEFAULT_COMPRESSION),
10-
"Z_NO_COMPRESSION" => ctx.new_int(libz::Z_NO_COMPRESSION),
11-
"Z_BEST_SPEED" => ctx.new_int(libz::Z_BEST_SPEED),
12-
"Z_BEST_COMPRESSION" => ctx.new_int(libz::Z_BEST_COMPRESSION),
13-
"DEFLATED" => ctx.new_int(libz::Z_DEFLATED),
14-
});
15-
module
16-
}
1+
pub(crate) use decl::make_module;
172

183
#[pymodule(name = "zlib")]
194
mod decl {
@@ -37,6 +22,17 @@ mod decl {
3722
use libz_sys as libz;
3823
use std::io::Write;
3924

25+
#[pyattr]
26+
use libz::Z_BEST_COMPRESSION;
27+
#[pyattr]
28+
use libz::Z_BEST_SPEED;
29+
#[pyattr]
30+
use libz::Z_DEFAULT_COMPRESSION;
31+
#[pyattr]
32+
use libz::Z_DEFLATED;
33+
#[pyattr]
34+
use libz::Z_NO_COMPRESSION;
35+
4036
// copied from zlibmodule.c (commit 530f506ac91338)
4137
#[pyattr]
4238
const MAX_WBITS: u8 = 15;

0 commit comments

Comments
 (0)