1
- use proc_macro2:: { Span , TokenStream } ;
1
+ use proc_macro2:: { Span , TokenStream , TokenTree } ;
2
2
use quote:: { quote, quote_spanned, ToTokens } ;
3
3
use syn:: spanned:: Spanned ;
4
4
use syn:: { Ident , PathArguments , Type } ;
@@ -20,6 +20,8 @@ impl<'a> ToTokens for MethodBody<'a> {
20
20
fn to_tokens ( & self , tokens : & mut TokenStream ) {
21
21
let this = Ident :: new ( "self" , Span :: mixed_site ( ) ) ;
22
22
let ser = Ident :: new ( "serializer" , Span :: mixed_site ( ) ) ;
23
+ // Name of destructured value inside an `Option` field value.
24
+ let bind = Ident :: new ( "value" , Span :: mixed_site ( ) ) ;
23
25
24
26
let mut next_param = OAuthParameter :: default ( ) ;
25
27
for f in self . fields {
@@ -45,13 +47,10 @@ impl<'a> ToTokens for MethodBody<'a> {
45
47
. map ( |v| v. value )
46
48
. unwrap_or_else ( || is_option ( & f. ty ) ) ;
47
49
48
- let value = if ty_is_option {
49
- quote_spanned ! { f. ty. span( ) => {
50
- let value = & #this. #ident;
51
- :: std:: option:: Option :: as_ref( value) . unwrap( )
52
- } }
50
+ let unwrapped = if ty_is_option {
51
+ TokenStream :: from ( TokenTree :: Ident ( bind. clone ( ) ) )
53
52
} else {
54
- quote ! { & #this. #ident }
53
+ quote_spanned ! { f . ty . span ( ) => & #this. #ident }
55
54
} ;
56
55
57
56
let display = if let Some ( ref fmt) = f. meta . fmt {
@@ -88,10 +87,10 @@ impl<'a> ToTokens for MethodBody<'a> {
88
87
#fmt;
89
88
fmt
90
89
} )
91
- . make_adapter( #value )
90
+ . make_adapter( #unwrapped )
92
91
}
93
92
} else {
94
- value . clone ( )
93
+ unwrapped . clone ( )
95
94
} ;
96
95
97
96
let mut stmt = if f. meta . encoded {
@@ -108,15 +107,15 @@ impl<'a> ToTokens for MethodBody<'a> {
108
107
if !{
109
108
let skip_if: fn ( & _) -> bool = #skip_if;
110
109
skip_if
111
- } ( #value )
110
+ } ( #unwrapped )
112
111
{
113
112
#stmt
114
113
}
115
114
} ;
116
115
}
117
116
if ty_is_option {
118
117
stmt = quote_spanned ! { f. ty. span( ) =>
119
- if :: std:: option:: Option :: is_some ( {
118
+ if let :: std:: option:: Option :: Some ( #bind ) = :: std :: option :: Option :: as_ref ( {
120
119
let value = & #this. #ident;
121
120
value
122
121
} ) {
0 commit comments