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,7 +155,9 @@ 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." ) ;
@@ -162,40 +166,39 @@ impl MethodArgs {
162166 |e| err ! ( attr => "Invalid arguments passed to `#[optional]` attribute. {}" , e) ,
163167 ) ?;
164168 self . optional = Some ( optional) ;
165- } else if attr. path . is_ident ( "defaults" ) {
166- // x
169+ } else if path. is_ident ( "defaults" ) {
167170 let meta = attr
168- . parse_meta ( )
171+ . parse_args ( )
169172 . map_err ( |e| err ! ( attr => "Failed to parse metadata from attribute. {}" , e) ) ?;
170173 let defaults = HashMap :: from_meta ( & meta) . map_err (
171174 |e| err ! ( attr => "Invalid arguments passed to `#[defaults]` attribute. {}" , e) ,
172175 ) ?;
173176 self . defaults = defaults;
174- } else if attr . path . is_ident ( "public" ) {
177+ } else if path. is_ident ( "public" ) {
175178 // x
176179 self . vis = MethodVis :: Public ;
177- } else if attr . path . is_ident ( "protected" ) {
180+ } else if path. is_ident ( "protected" ) {
178181 // x
179182 self . vis = MethodVis :: Protected ;
180- } else if attr . path . is_ident ( "private" ) {
183+ } else if path. is_ident ( "private" ) {
181184 // x
182185 self . vis = MethodVis :: Private ;
183- } else if attr . path . is_ident ( "rename" ) {
186+ } else if path. is_ident ( "rename" ) {
184187 let lit: syn:: Lit = attr. parse_args ( ) . map_err ( |e| err ! ( attr => "Invalid arguments passed to the `#[rename]` attribute. {}" , e) ) ?;
185188 match lit {
186189 Lit :: Str ( name) => self . name = name. value ( ) ,
187190 _ => bail ! ( attr => "Only strings are valid method names." ) ,
188191 } ;
189- } else if attr . path . is_ident ( "getter" ) {
192+ } else if path. is_ident ( "getter" ) {
190193 // x
191194 self . ty = MethodTy :: Getter ;
192- } else if attr . path . is_ident ( "setter" ) {
195+ } else if path. is_ident ( "setter" ) {
193196 // x
194197 self . ty = MethodTy :: Setter ;
195- } else if attr . path . is_ident ( "constructor" ) {
198+ } else if path. is_ident ( "constructor" ) {
196199 // x
197200 self . ty = MethodTy :: Constructor ;
198- } else if attr . path . is_ident ( "abstract_method" ) {
201+ } else if path. is_ident ( "abstract_method" ) {
199202 // x
200203 self . ty = MethodTy :: Abstract ;
201204 } else {
@@ -261,7 +264,7 @@ impl<'a> ParsedImpl<'a> {
261264 let mut unparsed = vec ! [ ] ;
262265 unparsed. append ( & mut c. attrs ) ;
263266 for attr in unparsed {
264- if attr. path . is_ident ( "rename" ) {
267+ if attr. path ( ) . is_ident ( "rename" ) {
265268 let lit: syn:: Lit = attr. parse_args ( ) . map_err ( |e| err ! ( attr => "Invalid arguments passed to the `#[rename]` attribute. {}" , e) ) ?;
266269 match lit {
267270 Lit :: Str ( str) => name = Some ( str. value ( ) ) ,
@@ -279,7 +282,7 @@ impl<'a> ParsedImpl<'a> {
279282 docs,
280283 } ) ;
281284 }
282- syn:: ImplItem :: Method ( method) => {
285+ syn:: ImplItem :: Fn ( method) => {
283286 let name = self . rename . rename ( method. sig . ident . to_string ( ) ) ;
284287 let docs = get_docs ( & method. attrs ) ;
285288 let mut opts = MethodArgs :: new ( name) ;
0 commit comments