mirror of
https://github.com/RustPython/RustPython.git
synced 2026-10-28 18:59:04 +08:00
Allow use for #[pyattr]
This commit is contained in:
1 parent
ad08843c78
commit
1ed00a4866
2 files changed
+51
-43
No files matched your search
+50
-43
@@ -5,7 +5,7 @@ use crate::util::{
|
||||
use proc_macro2::{Span, TokenStream as TokenStream2};
|
||||
use quote::{quote, quote_spanned, ToTokens};
|
||||
use std::collections::HashMap;
|
||||
use syn::{parse_quote, spanned::Spanned, AttributeArgs, Ident, Item, Meta, NestedMeta};
|
||||
use syn::{parse_quote, spanned::Spanned, AttributeArgs, Ident, Item, Meta, NestedMeta, UseTree};
|
||||
|
||||
struct Module {
|
||||
name: String,
|
||||
@@ -173,33 +173,22 @@ impl Module {
|
||||
}
|
||||
"pyattr" => {
|
||||
attr_idxs.push(i);
|
||||
match item.typ {
|
||||
ItemType::Fn => {
|
||||
items.push((
|
||||
Self::extract_evaluated_attr(item.ident, into_nested()?)?,
|
||||
meta_span,
|
||||
));
|
||||
}
|
||||
ItemType::Const => {
|
||||
items.push((
|
||||
Self::extract_const_attr(item.ident, into_nested()?)?,
|
||||
meta_span,
|
||||
));
|
||||
}
|
||||
ItemType::Struct => {
|
||||
let item = match item.typ {
|
||||
ItemType::Fn => Self::extract_evaluated_attr(item.ident, into_nested()?)?,
|
||||
ItemType::Const => Self::extract_const_attr(item.ident, into_nested()?)?,
|
||||
ItemType::Struct | ItemType::Enum => {
|
||||
if has_class {
|
||||
return Err(err_span!(
|
||||
meta,
|
||||
"#[pyattr] must be placed on top of #[pyclass] or #[pystruct_sequence]",
|
||||
));
|
||||
}
|
||||
items.push((
|
||||
Self::extract_class_attr(item.ident, into_nested()?)?,
|
||||
meta_span,
|
||||
));
|
||||
Self::extract_class_attr(item.ident, into_nested()?)?
|
||||
}
|
||||
_ => unreachable!(),
|
||||
}
|
||||
ItemType::Use => Self::extract_const_attr(item.ident, into_nested()?)?,
|
||||
ItemType::Method => unreachable!(),
|
||||
};
|
||||
items.push((item, meta_span));
|
||||
}
|
||||
attr_name @ "pyclass" | attr_name @ "pystruct_sequence" => {
|
||||
assert!(item.typ == ItemType::Struct);
|
||||
@@ -399,28 +388,46 @@ pub fn impl_pymodule(attr: AttributeArgs, item: Item) -> Result<TokenStream2, Di
|
||||
|
||||
let items = content
|
||||
.iter_mut()
|
||||
.filter_map(|item| match item {
|
||||
Item::Fn(syn::ItemFn { attrs, sig, .. }) => Some(ItemIdent {
|
||||
typ: ItemType::Fn,
|
||||
attrs,
|
||||
ident: &sig.ident,
|
||||
}),
|
||||
Item::Struct(syn::ItemStruct { attrs, ident, .. }) => Some(ItemIdent {
|
||||
typ: ItemType::Struct,
|
||||
attrs,
|
||||
ident,
|
||||
}),
|
||||
Item::Enum(syn::ItemEnum { attrs, ident, .. }) => Some(ItemIdent {
|
||||
typ: ItemType::Enum,
|
||||
attrs,
|
||||
ident,
|
||||
}),
|
||||
Item::Const(syn::ItemConst { attrs, ident, .. }) => Some(ItemIdent {
|
||||
typ: ItemType::Const,
|
||||
attrs,
|
||||
ident,
|
||||
}),
|
||||
_ => None,
|
||||
.filter_map(|item| {
|
||||
let item = match item {
|
||||
Item::Fn(syn::ItemFn { attrs, sig, .. }) => ItemIdent {
|
||||
typ: ItemType::Fn,
|
||||
attrs,
|
||||
ident: &sig.ident,
|
||||
},
|
||||
Item::Struct(syn::ItemStruct { attrs, ident, .. }) => ItemIdent {
|
||||
typ: ItemType::Struct,
|
||||
attrs,
|
||||
ident,
|
||||
},
|
||||
Item::Enum(syn::ItemEnum { attrs, ident, .. }) => ItemIdent {
|
||||
typ: ItemType::Enum,
|
||||
attrs,
|
||||
ident,
|
||||
},
|
||||
Item::Const(syn::ItemConst { attrs, ident, .. }) => ItemIdent {
|
||||
typ: ItemType::Const,
|
||||
attrs,
|
||||
ident,
|
||||
},
|
||||
Item::Use(syn::ItemUse { attrs, tree, .. }) => {
|
||||
let ident = match tree {
|
||||
UseTree::Path(path) => match &*path.tree {
|
||||
UseTree::Name(name) => &name.ident,
|
||||
UseTree::Rename(rename) => &rename.rename,
|
||||
_ => return None,
|
||||
},
|
||||
_ => return None,
|
||||
};
|
||||
ItemIdent {
|
||||
typ: ItemType::Use,
|
||||
attrs,
|
||||
ident,
|
||||
}
|
||||
}
|
||||
_ => return None,
|
||||
};
|
||||
Some(item)
|
||||
})
|
||||
.collect();
|
||||
|
||||
|
||||
@@ -84,6 +84,7 @@ pub(crate) enum ItemType {
|
||||
Struct,
|
||||
Enum,
|
||||
Const,
|
||||
Use,
|
||||
}
|
||||
|
||||
pub(crate) struct ItemIdent<'a> {
|
||||
|
||||
Reference in new issue
Block a user