@@ -2,10 +2,11 @@ use proc_macro2::{Ident, Span};
2
2
use quote:: quote;
3
3
use syn:: export:: TokenStream ;
4
4
use syn:: Meta ;
5
+ use syn:: visit_mut:: { self , VisitMut } ;
5
6
6
7
#[ proc_macro_attribute]
7
8
pub fn api ( _attr : TokenStream , item : TokenStream ) -> TokenStream {
8
- let input = syn:: parse_macro_input!( item as syn:: ItemTrait ) ;
9
+ let mut input = syn:: parse_macro_input!( item as syn:: ItemTrait ) ;
9
10
let name = & input. ident ;
10
11
11
12
let struct_name = Ident :: new ( & format ! ( "{}RestClient" , name) , Span :: call_site ( ) ) ;
@@ -44,6 +45,9 @@ pub fn api(_attr: TokenStream, item: TokenStream) -> TokenStream {
44
45
. map ( |a| syn:: ImplItem :: from ( get_impl_item ( a) ) )
45
46
. collect ( ) ;
46
47
48
+ // remove all method param attributes
49
+ FnSigAttrRemove . visit_item_trait_mut ( & mut input) ;
50
+
47
51
// outputting it all
48
52
let result = quote ! {
49
53
#input
@@ -102,6 +106,9 @@ fn get_impl_method(trait_item: syn::TraitItemMethod) -> syn::ImplItemMethod {
102
106
103
107
method_impl. sig = trait_item. clone ( ) . sig ;
104
108
109
+ // remove all method param attributes
110
+ FnSigAttrRemove . visit_signature_mut ( & mut method_impl. sig ) ;
111
+
105
112
method_impl
106
113
}
107
114
@@ -126,6 +133,23 @@ fn get_endpoint_attr(trait_item: syn::TraitItemMethod) -> Option<String> {
126
133
. next ( )
127
134
}
128
135
136
+ struct FnSigAttrRemove ;
137
+ impl VisitMut for FnSigAttrRemove {
138
+ fn visit_fn_arg_mut ( & mut self , node : & mut syn:: FnArg ) {
139
+ match node {
140
+ syn:: FnArg :: Receiver ( arg) => {
141
+ arg. attrs . clear ( ) ;
142
+ }
143
+ syn:: FnArg :: Typed ( arg) => {
144
+ arg. attrs . clear ( ) ;
145
+ }
146
+ }
147
+
148
+ // Delegate to the default impl to visit nested nodes
149
+ visit_mut:: visit_fn_arg_mut ( self , node) ;
150
+ }
151
+ }
152
+
129
153
#[ proc_macro_attribute]
130
154
pub fn endpoint ( _attr : TokenStream , item : TokenStream ) -> TokenStream {
131
155
item
0 commit comments