@@ -13,7 +13,7 @@ use quote::{format_ident, quote};
13
13
use std:: collections:: HashMap ;
14
14
use std:: str:: FromStr ;
15
15
use syn:: { spanned:: Spanned , Attribute , Meta , MetaList , MetaNameValue , Type } ;
16
- use synstructure:: Structure ;
16
+ use synstructure:: { BindingInfo , Structure } ;
17
17
18
18
/// The central struct for constructing the `into_diagnostic` method from an annotated struct.
19
19
pub ( crate ) struct SessionDiagnosticDerive < ' a > {
@@ -95,20 +95,7 @@ impl<'a> SessionDiagnosticDerive<'a> {
95
95
false
96
96
}
97
97
} )
98
- . each ( |field_binding| {
99
- let field = field_binding. ast ( ) ;
100
- let field_span = field. span ( ) ;
101
-
102
- builder. generate_field_attrs_code (
103
- & field. attrs ,
104
- FieldInfo {
105
- vis : & field. vis ,
106
- binding : field_binding,
107
- ty : & field. ty ,
108
- span : & field_span,
109
- } ,
110
- )
111
- } ) ;
98
+ . each ( |field_binding| builder. generate_field_attrs_code ( field_binding) ) ;
112
99
113
100
structure. bind_with ( |_| synstructure:: BindStyle :: Move ) ;
114
101
// When a field has attributes like `#[label]` or `#[note]` then it doesn't
@@ -119,20 +106,7 @@ impl<'a> SessionDiagnosticDerive<'a> {
119
106
. filter ( |field_binding| {
120
107
subdiagnostics_or_empty. contains ( & field_binding. binding )
121
108
} )
122
- . each ( |field_binding| {
123
- let field = field_binding. ast ( ) ;
124
- let field_span = field. span ( ) ;
125
-
126
- builder. generate_field_attrs_code (
127
- & field. attrs ,
128
- FieldInfo {
129
- vis : & field. vis ,
130
- binding : field_binding,
131
- ty : & field. ty ,
132
- span : & field_span,
133
- } ,
134
- )
135
- } ) ;
109
+ . each ( |field_binding| builder. generate_field_attrs_code ( field_binding) ) ;
136
110
137
111
let span = ast. span ( ) . unwrap ( ) ;
138
112
let ( diag, sess) = ( & builder. diag , & builder. sess ) ;
@@ -360,30 +334,27 @@ impl SessionDiagnosticDeriveBuilder {
360
334
Ok ( tokens. drain ( ..) . collect ( ) )
361
335
}
362
336
363
- fn generate_field_attrs_code (
364
- & mut self ,
365
- attrs : & [ syn:: Attribute ] ,
366
- info : FieldInfo < ' _ > ,
367
- ) -> TokenStream {
368
- let field_binding = & info. binding . binding ;
337
+ fn generate_field_attrs_code ( & mut self , binding_info : & BindingInfo < ' _ > ) -> TokenStream {
338
+ let field = binding_info. ast ( ) ;
339
+ let field_binding = & binding_info. binding ;
369
340
370
- let inner_ty = FieldInnerTy :: from_type ( & info . ty ) ;
341
+ let inner_ty = FieldInnerTy :: from_type ( & field . ty ) ;
371
342
372
343
// When generating `set_arg` or `add_subdiagnostic` calls, move data rather than
373
344
// borrow it to avoid requiring clones - this must therefore be the last use of
374
345
// each field (for example, any formatting machinery that might refer to a field
375
346
// should be generated already).
376
- if attrs. is_empty ( ) {
347
+ if field . attrs . is_empty ( ) {
377
348
let diag = & self . diag ;
378
- let ident = info . binding . ast ( ) . ident . as_ref ( ) . unwrap ( ) ;
349
+ let ident = field . ident . as_ref ( ) . unwrap ( ) ;
379
350
quote ! {
380
351
#diag. set_arg(
381
352
stringify!( #ident) ,
382
353
#field_binding
383
354
) ;
384
355
}
385
356
} else {
386
- attrs
357
+ field . attrs
387
358
. iter ( )
388
359
. map ( move |attr| {
389
360
let name = attr. path . segments . last ( ) . unwrap ( ) . ident . to_string ( ) ;
@@ -401,10 +372,9 @@ impl SessionDiagnosticDeriveBuilder {
401
372
. generate_inner_field_code (
402
373
attr,
403
374
FieldInfo {
404
- vis : info. vis ,
405
- binding : info. binding ,
406
- ty : inner_ty. inner_type ( ) . unwrap_or ( & info. ty ) ,
407
- span : info. span ,
375
+ binding : binding_info,
376
+ ty : inner_ty. inner_type ( ) . unwrap_or ( & field. ty ) ,
377
+ span : & field. span ( ) ,
408
378
} ,
409
379
binding,
410
380
)
0 commit comments