@@ -478,26 +478,12 @@ impl DiagnosticDeriveBuilder {
478
478
let formatted_str = self . build_format ( & s. value ( ) , s. span ( ) ) ;
479
479
code. set_once ( ( formatted_str, span) ) ;
480
480
}
481
- "applicability" => {
482
- applicability = match applicability {
483
- Some ( v) => {
484
- span_err (
485
- span,
486
- "applicability cannot be set in both the field and \
487
- attribute",
488
- )
489
- . emit ( ) ;
490
- Some ( v)
491
- }
492
- None => match Applicability :: from_str ( & s. value ( ) ) {
493
- Ok ( v) => Some ( quote ! { #v } ) ,
494
- Err ( ( ) ) => {
495
- span_err ( span, "invalid applicability" ) . emit ( ) ;
496
- None
497
- }
498
- } ,
481
+ "applicability" => match Applicability :: from_str ( & s. value ( ) ) {
482
+ Ok ( v) => applicability. set_once ( ( quote ! { #v } , span) ) ,
483
+ Err ( ( ) ) => {
484
+ span_err ( span, "invalid applicability" ) . emit ( ) ;
499
485
}
500
- }
486
+ } ,
501
487
_ => throw_invalid_nested_attr ! ( attr, & nested_attr, |diag| {
502
488
diag. help(
503
489
"only `message`, `code` and `applicability` are valid field \
@@ -516,8 +502,9 @@ impl DiagnosticDeriveBuilder {
516
502
}
517
503
}
518
504
519
- let applicability =
520
- applicability. unwrap_or_else ( || quote ! ( rustc_errors:: Applicability :: Unspecified ) ) ;
505
+ let applicability = applicability
506
+ . value ( )
507
+ . unwrap_or_else ( || quote ! ( rustc_errors:: Applicability :: Unspecified ) ) ;
521
508
522
509
let name = path. segments . last ( ) . unwrap ( ) . ident . to_string ( ) ;
523
510
let method = format_ident ! ( "span_{}" , name) ;
@@ -559,7 +546,7 @@ impl DiagnosticDeriveBuilder {
559
546
fn span_and_applicability_of_ty (
560
547
& self ,
561
548
info : FieldInfo < ' _ > ,
562
- ) -> Result < ( TokenStream , Option < TokenStream > ) , DiagnosticDeriveError > {
549
+ ) -> Result < ( TokenStream , Option < ( TokenStream , proc_macro :: Span ) > ) , DiagnosticDeriveError > {
563
550
match & info. ty {
564
551
// If `ty` is `Span` w/out applicability, then use `Applicability::Unspecified`.
565
552
ty @ Type :: Path ( ..) if type_matches_path ( ty, & [ "rustc_span" , "Span" ] ) => {
@@ -594,14 +581,14 @@ impl DiagnosticDeriveBuilder {
594
581
let Some ( ( span_idx, _) ) = span_idx else {
595
582
type_err ( & tup. span ( ) ) ?;
596
583
} ;
597
- let Some ( ( applicability_idx, _applicability_span ) ) = applicability_idx else {
584
+ let Some ( ( applicability_idx, applicability_span ) ) = applicability_idx else {
598
585
type_err ( & tup. span ( ) ) ?;
599
586
} ;
600
587
let binding = & info. binding . binding ;
601
588
let span = quote ! ( #binding. #span_idx) ;
602
589
let applicability = quote ! ( #binding. #applicability_idx) ;
603
590
604
- Ok ( ( span, Some ( applicability) ) )
591
+ Ok ( ( span, Some ( ( applicability, applicability_span ) ) ) )
605
592
}
606
593
// If `ty` isn't a `Span` or `(Span, Applicability)` then emit an error.
607
594
_ => throw_span_err ! ( info. span. unwrap( ) , "wrong field type for suggestion" , |diag| {
0 commit comments