Skip to content

Commit 47bd968

Browse files
committed
Change ClassItem to enum
1 parent cbdab22 commit 47bd968

File tree

1 file changed

+26
-38
lines changed

1 file changed

+26
-38
lines changed

derive/src/pyclass.rs

Lines changed: 26 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -4,17 +4,16 @@ use quote::quote;
44
use std::collections::HashMap;
55
use syn::{Attribute, AttributeArgs, Ident, ImplItem, Item, Lit, Meta, MethodSig, NestedMeta};
66

7-
#[derive(PartialEq, Clone, Copy)]
8-
enum ClassItemKind {
9-
Method,
10-
PropertyGetter,
11-
PropertySetter,
12-
}
13-
14-
struct ClassItem {
15-
item_name: Ident,
16-
py_name: String,
17-
kind: ClassItemKind,
7+
enum ClassItem {
8+
Method {
9+
item_name: Ident,
10+
py_name: String,
11+
},
12+
Property {
13+
item_name: Ident,
14+
py_name: String,
15+
setter: bool,
16+
},
1817
}
1918

2019
fn meta_to_vec(meta: Meta) -> Result<Vec<NestedMeta>, Meta> {
@@ -60,10 +59,9 @@ impl ClassItem {
6059
_ => {}
6160
}
6261
}
63-
item = Some(ClassItem {
62+
item = Some(ClassItem::Method {
6463
item_name: sig.ident.clone(),
6564
py_name: py_name.unwrap_or_else(|| sig.ident.to_string()),
66-
kind: ClassItemKind::Method,
6765
});
6866
attr_idx = Some(i);
6967
} else if name == "pyproperty" {
@@ -97,11 +95,6 @@ impl ClassItem {
9795
_ => {}
9896
}
9997
}
100-
let kind = if setter {
101-
ClassItemKind::PropertySetter
102-
} else {
103-
ClassItemKind::PropertyGetter
104-
};
10598
let py_name = py_name.unwrap_or_else(|| {
10699
let item_name = sig.ident.to_string();
107100
if item_name.starts_with("set_") {
@@ -121,10 +114,10 @@ impl ClassItem {
121114
)
122115
}
123116
});
124-
item = Some(ClassItem {
117+
item = Some(ClassItem::Property {
125118
py_name,
126119
item_name: sig.ident.clone(),
127-
kind,
120+
setter,
128121
});
129122
attr_idx = Some(i);
130123
}
@@ -159,29 +152,24 @@ pub fn impl_pyimpl(attr: AttributeArgs, item: Item) -> TokenStream2 {
159152
let ty = &imp.self_ty;
160153
let mut properties: HashMap<&str, (Option<&Ident>, Option<&Ident>)> = HashMap::new();
161154
for item in items.iter() {
162-
match item.kind {
163-
ClassItemKind::PropertyGetter => {
164-
let (ref mut getter, _) = properties.entry(&item.py_name).or_default();
165-
if getter.is_some() {
166-
panic!("Multiple property getters with name {:?}", &item.py_name)
167-
}
168-
*getter = Some(&item.item_name);
169-
}
170-
ClassItemKind::PropertySetter => {
171-
let (_, ref mut setter) = properties.entry(&item.py_name).or_default();
172-
if setter.is_some() {
173-
panic!("Multiple property getters with name {:?}", &item.py_name)
155+
match item {
156+
ClassItem::Property {
157+
item_name,
158+
py_name,
159+
setter,
160+
} => {
161+
let entry = properties.entry(py_name).or_default();
162+
let func = if *setter { &mut entry.1 } else { &mut entry.0 };
163+
if func.is_some() {
164+
panic!("Multiple property accessors with name {:?}", py_name)
174165
}
175-
*setter = Some(&item.item_name);
166+
*func = Some(item_name);
176167
}
177-
ClassItemKind::Method => {}
168+
_ => {}
178169
}
179170
}
180171
let methods = items.iter().filter_map(|item| {
181-
if let ClassItemKind::Method = item.kind {
182-
let ClassItem {
183-
py_name, item_name, ..
184-
} = item;
172+
if let ClassItem::Method { item_name, py_name } = item {
185173
Some(quote! {
186174
class.set_str_attr(#py_name, ctx.new_rustfunc(Self::#item_name));
187175
})

0 commit comments

Comments
 (0)