From 52e19c23317e664f8a161dc5c63f1d3b61302b13 Mon Sep 17 00:00:00 2001 From: Jeong YunWon Date: Sat, 19 Sep 2020 07:47:57 +0900 Subject: [PATCH] pyattr allows use group --- derive/src/pymodule.rs | 37 ++++++++++++++++++++++++++++++++++++- vm/src/stdlib/zlib.rs | 13 ++++--------- 2 files changed, 40 insertions(+), 10 deletions(-) diff --git a/derive/src/pymodule.rs b/derive/src/pymodule.rs index ca75aa9f2..231b8b578 100644 --- a/derive/src/pymodule.rs +++ b/derive/src/pymodule.rs @@ -366,8 +366,43 @@ impl ModuleItem for AttributeItem { let ident = match &*path.tree { UseTree::Name(name) => &name.ident, UseTree::Rename(rename) => &rename.rename, + UseTree::Group(syn::UseGroup { items, .. }) => { + for item in items { + let ident = match item { + UseTree::Name(name) => &name.ident, + UseTree::Rename(rename) => &rename.rename, + other => { + return Err(self.new_syn_error( + other.span(), + "can only contains a simple use or a group of simple uses", + )); + } + }; + let item_meta = SimpleItemMeta::from_attr(ident.clone(), &attr)?; + if item_meta.optional_name().is_some() { + // this check actually doesn't need to be placed in loop + return Err(self.new_syn_error( + ident.span(), + "`name` attribute is not allowed for multiple use items", + )); + } + let py_name = ident.to_string(); + let tokens = quote! { + vm.__module_set_attr(&module, #py_name, vm.new_pyobj(#ident)).unwrap(); + }; + args.context.module_extend_items.add_item( + py_name, + cfgs.clone(), + tokens, + )?; + } + return Ok(()); + } other => { - return Err(self.new_syn_error(other.span(), "can only be a simple use")); + return Err(self.new_syn_error( + other.span(), + "can only contains a simple use or a group of simple uses", + )); } }; diff --git a/vm/src/stdlib/zlib.rs b/vm/src/stdlib/zlib.rs index 28be57273..42b09e1fa 100644 --- a/vm/src/stdlib/zlib.rs +++ b/vm/src/stdlib/zlib.rs @@ -23,15 +23,10 @@ mod decl { use std::io::Write; #[pyattr] - use libz::Z_BEST_COMPRESSION; - #[pyattr] - use libz::Z_BEST_SPEED; - #[pyattr] - use libz::Z_DEFAULT_COMPRESSION; - #[pyattr] - use libz::Z_DEFLATED as DEFLATED; - #[pyattr] - use libz::Z_NO_COMPRESSION; + use libz::{ + Z_BEST_COMPRESSION, Z_BEST_SPEED, Z_DEFAULT_COMPRESSION, Z_DEFLATED as DEFLATED, + Z_NO_COMPRESSION, + }; // copied from zlibmodule.c (commit 530f506ac91338) #[pyattr]