@@ -4,17 +4,16 @@ use quote::quote;
44use std:: collections:: HashMap ;
55use 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
2019fn 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