@@ -4,7 +4,7 @@ use crate::scan_expr::scan_expr;
4
4
use crate :: unraw:: { IdentUnraw , MemberUnraw } ;
5
5
use proc_macro2:: { Delimiter , TokenStream , TokenTree } ;
6
6
use quote:: { format_ident, quote, quote_spanned} ;
7
- use std:: collections:: { BTreeSet , HashMap , HashSet } ;
7
+ use std:: collections:: { BTreeSet , HashMap } ;
8
8
use std:: iter;
9
9
use syn:: ext:: IdentExt ;
10
10
use syn:: parse:: discouraged:: Speculative ;
@@ -34,7 +34,7 @@ impl Display<'_> {
34
34
let mut infinite_recursive = false ;
35
35
let mut implied_bounds = BTreeSet :: new ( ) ;
36
36
let mut bindings = Vec :: new ( ) ;
37
- let mut macro_named_args = HashSet :: new ( ) ;
37
+ let mut macro_named_args = BTreeSet :: new ( ) ;
38
38
39
39
self . requires_fmt_machinery = self . requires_fmt_machinery || fmt. contains ( '}' ) ;
40
40
@@ -85,15 +85,11 @@ impl Display<'_> {
85
85
}
86
86
_ => continue ,
87
87
} ;
88
- let binding_value = match & member {
89
- MemberUnraw :: Unnamed ( index) => format_ident ! ( "_{}" , index) ,
90
- MemberUnraw :: Named ( ident) => ident. to_local ( ) ,
91
- } ;
92
- let mut wrapped_binding_value = quote ! ( :: thiserror:: __private:: Var ( #binding_value) ) ;
93
88
let end_spec = match read. find ( '}' ) {
94
89
Some ( end_spec) => end_spec,
95
90
None => return Ok ( ( ) ) ,
96
91
} ;
92
+ let mut bonus_display = false ;
97
93
let bound = match read[ ..end_spec] . chars ( ) . next_back ( ) {
98
94
Some ( '?' ) => Trait :: Debug ,
99
95
Some ( 'o' ) => Trait :: Octal ,
@@ -105,10 +101,7 @@ impl Display<'_> {
105
101
Some ( 'E' ) => Trait :: UpperExp ,
106
102
Some ( _) => Trait :: Display ,
107
103
None => {
108
- has_bonus_display = true ;
109
- wrapped_binding_value = quote_spanned ! { span=>
110
- #binding_value. as_display( )
111
- } ;
104
+ bonus_display = true ;
112
105
Trait :: Display
113
106
}
114
107
} ;
@@ -119,19 +112,36 @@ impl Display<'_> {
119
112
out += & member. to_string ( ) ;
120
113
continue ;
121
114
}
115
+ let formatvar_prefix = if bonus_display {
116
+ "__display"
117
+ } else {
118
+ "__field"
119
+ } ;
122
120
let mut formatvar = IdentUnraw :: new ( match & member {
123
- MemberUnraw :: Unnamed ( index) => format_ident ! ( "__field{}" , index) ,
124
- MemberUnraw :: Named ( ident) => format_ident ! ( "__field_{}" , ident. to_string( ) ) ,
121
+ MemberUnraw :: Unnamed ( index) => format_ident ! ( "{}{}" , formatvar_prefix, index) ,
122
+ MemberUnraw :: Named ( ident) => {
123
+ format_ident ! ( "{}_{}" , formatvar_prefix, ident. to_string( ) )
124
+ }
125
125
} ) ;
126
126
while user_named_args. contains ( & formatvar) {
127
127
formatvar = IdentUnraw :: new ( format_ident ! ( "_{}" , formatvar. to_string( ) ) ) ;
128
128
}
129
129
out += & formatvar. to_string ( ) ;
130
- if macro_named_args. insert ( member) {
131
- bindings. push ( ( formatvar. to_local ( ) , wrapped_binding_value) ) ;
132
- } else {
130
+ if !macro_named_args. insert ( formatvar. clone ( ) ) {
133
131
// Already added to bindings by a previous use.
132
+ continue ;
134
133
}
134
+ let binding_value = match & member {
135
+ MemberUnraw :: Unnamed ( index) => format_ident ! ( "_{}" , index) ,
136
+ MemberUnraw :: Named ( ident) => ident. to_local ( ) ,
137
+ } ;
138
+ let wrapped_binding_value = if bonus_display {
139
+ quote_spanned ! ( span=> #binding_value. as_display( ) )
140
+ } else {
141
+ quote ! ( :: thiserror:: __private:: Var ( #binding_value) )
142
+ } ;
143
+ has_bonus_display |= bonus_display;
144
+ bindings. push ( ( formatvar. to_local ( ) , wrapped_binding_value) ) ;
135
145
}
136
146
137
147
out += read;
0 commit comments