1+ use darling:: ast:: NestedMeta ;
12use darling:: FromMeta ;
23use proc_macro2:: TokenStream ;
34use quote:: quote;
45use std:: collections:: HashMap ;
5- use syn:: { AttributeArgs , Ident , ItemImpl , Lit } ;
6+ use syn:: { Ident , ItemImpl , Lit } ;
67
78use crate :: function:: { Args , CallType , Function , MethodReceiver } ;
89use crate :: helpers:: get_docs;
@@ -96,8 +97,9 @@ pub struct ImplArgs {
9697 rename_methods : RenameRule ,
9798}
9899
99- pub fn parser ( args : AttributeArgs , mut input : ItemImpl ) -> Result < TokenStream > {
100- let args = match ImplArgs :: from_list ( & args) {
100+ pub fn parser ( args : TokenStream , mut input : ItemImpl ) -> Result < TokenStream > {
101+ let meta = NestedMeta :: parse_meta_list ( args) ?;
102+ let args = match ImplArgs :: from_list ( & meta) {
101103 Ok ( args) => args,
102104 Err ( e) => bail ! ( input => "Failed to parse impl attribute arguments: {:?}" , e) ,
103105 } ;
@@ -153,49 +155,47 @@ impl MethodArgs {
153155 let mut unparsed = vec ! [ ] ;
154156 unparsed. append ( attrs) ;
155157 for attr in unparsed {
156- if attr. path . is_ident ( "optional" ) {
158+ let path = & attr. path ( ) ;
159+
160+ if path. is_ident ( "optional" ) {
157161 // x
158162 if self . optional . is_some ( ) {
159163 bail ! ( attr => "Only one `#[optional]` attribute is valid per method." ) ;
160164 }
161165 let optional = attr. parse_args ( ) . map_err (
162- |e| err ! ( attr => "Invalid arguments passed to `#[optional]` attribute. {}" , e) ,
166+ |e| err ! ( e . span ( ) => "Invalid arguments passed to `#[optional]` attribute. {}" , e) ,
163167 ) ?;
164168 self . optional = Some ( optional) ;
165- } else if attr. path . is_ident ( "defaults" ) {
166- // x
167- let meta = attr
168- . parse_meta ( )
169- . map_err ( |e| err ! ( attr => "Failed to parse metadata from attribute. {}" , e) ) ?;
170- let defaults = HashMap :: from_meta ( & meta) . map_err (
171- |e| err ! ( attr => "Invalid arguments passed to `#[defaults]` attribute. {}" , e) ,
169+ } else if path. is_ident ( "defaults" ) {
170+ let defaults = HashMap :: from_meta ( & attr. meta ) . map_err (
171+ |e| err ! ( e. span( ) => "Invalid arguments passed to `#[defaults]` attribute. {}" , e) ,
172172 ) ?;
173173 self . defaults = defaults;
174- } else if attr . path . is_ident ( "public" ) {
174+ } else if path. is_ident ( "public" ) {
175175 // x
176176 self . vis = MethodVis :: Public ;
177- } else if attr . path . is_ident ( "protected" ) {
177+ } else if path. is_ident ( "protected" ) {
178178 // x
179179 self . vis = MethodVis :: Protected ;
180- } else if attr . path . is_ident ( "private" ) {
180+ } else if path. is_ident ( "private" ) {
181181 // x
182182 self . vis = MethodVis :: Private ;
183- } else if attr . path . is_ident ( "rename" ) {
183+ } else if path. is_ident ( "rename" ) {
184184 let lit: syn:: Lit = attr. parse_args ( ) . map_err ( |e| err ! ( attr => "Invalid arguments passed to the `#[rename]` attribute. {}" , e) ) ?;
185185 match lit {
186186 Lit :: Str ( name) => self . name = name. value ( ) ,
187187 _ => bail ! ( attr => "Only strings are valid method names." ) ,
188188 } ;
189- } else if attr . path . is_ident ( "getter" ) {
189+ } else if path. is_ident ( "getter" ) {
190190 // x
191191 self . ty = MethodTy :: Getter ;
192- } else if attr . path . is_ident ( "setter" ) {
192+ } else if path. is_ident ( "setter" ) {
193193 // x
194194 self . ty = MethodTy :: Setter ;
195- } else if attr . path . is_ident ( "constructor" ) {
195+ } else if path. is_ident ( "constructor" ) {
196196 // x
197197 self . ty = MethodTy :: Constructor ;
198- } else if attr . path . is_ident ( "abstract_method" ) {
198+ } else if path. is_ident ( "abstract_method" ) {
199199 // x
200200 self . ty = MethodTy :: Abstract ;
201201 } else {
@@ -261,7 +261,7 @@ impl<'a> ParsedImpl<'a> {
261261 let mut unparsed = vec ! [ ] ;
262262 unparsed. append ( & mut c. attrs ) ;
263263 for attr in unparsed {
264- if attr. path . is_ident ( "rename" ) {
264+ if attr. path ( ) . is_ident ( "rename" ) {
265265 let lit: syn:: Lit = attr. parse_args ( ) . map_err ( |e| err ! ( attr => "Invalid arguments passed to the `#[rename]` attribute. {}" , e) ) ?;
266266 match lit {
267267 Lit :: Str ( str) => name = Some ( str. value ( ) ) ,
@@ -279,7 +279,7 @@ impl<'a> ParsedImpl<'a> {
279279 docs,
280280 } ) ;
281281 }
282- syn:: ImplItem :: Method ( method) => {
282+ syn:: ImplItem :: Fn ( method) => {
283283 let name = self . rename . rename ( method. sig . ident . to_string ( ) ) ;
284284 let docs = get_docs ( & method. attrs ) ;
285285 let mut opts = MethodArgs :: new ( name) ;
0 commit comments