@@ -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