macros: add interop between diagnostic derives

Add `#[subdiagnostic]` field attribute to the diagnostic derive which
is applied to fields that have types which use the subdiagnostic derive.

Signed-off-by: David Wood <david.wood@huawei.com>
This commit is contained in:
David Wood 2022-04-27 05:59:48 +01:00
parent e5d9371b30
commit dca88612b9
4 changed files with 16 additions and 3 deletions

View File

@ -404,9 +404,10 @@ impl SessionDiagnosticDeriveBuilder {
report_error_if_not_applied_to_span(attr, &info)?; report_error_if_not_applied_to_span(attr, &info)?;
Ok(self.add_subdiagnostic(field_binding, name, name)) Ok(self.add_subdiagnostic(field_binding, name, name))
} }
"subdiagnostic" => Ok(quote! { #diag.subdiagnostic(*#field_binding); }),
_ => throw_invalid_attr!(attr, &meta, |diag| { _ => throw_invalid_attr!(attr, &meta, |diag| {
diag diag
.help("only `skip_arg`, `primary_span`, `label`, `note` and `help` are valid field attributes") .help("only `skip_arg`, `primary_span`, `label`, `note`, `help` and `subdiagnostic` are valid field attributes")
}), }),
}, },
Meta::NameValue(MetaNameValue { lit: syn::Lit::Str(ref s), .. }) => match name { Meta::NameValue(MetaNameValue { lit: syn::Lit::Str(ref s), .. }) => match name {

View File

@ -73,6 +73,7 @@ decl_derive!(
skip_arg, skip_arg,
primary_span, primary_span,
label, label,
subdiagnostic,
suggestion, suggestion,
suggestion_short, suggestion_short,
suggestion_hidden, suggestion_hidden,

View File

@ -15,7 +15,7 @@ use rustc_span::symbol::Ident;
use rustc_span::Span; use rustc_span::Span;
extern crate rustc_macros; extern crate rustc_macros;
use rustc_macros::SessionDiagnostic; use rustc_macros::{SessionDiagnostic, SessionSubdiagnostic};
extern crate rustc_middle; extern crate rustc_middle;
use rustc_middle::ty::Ty; use rustc_middle::ty::Ty;
@ -463,3 +463,14 @@ struct NoApplicability {
#[suggestion(message = "bar", code = "...")] #[suggestion(message = "bar", code = "...")]
suggestion: Span, suggestion: Span,
} }
#[derive(SessionSubdiagnostic)]
#[note(slug = "note")]
struct Note;
#[derive(SessionDiagnostic)]
#[error(slug = "subdiagnostic")]
struct Subdiagnostic {
#[subdiagnostic]
note: Note,
}

View File

@ -211,7 +211,7 @@ error: `#[nonsense]` is not a valid attribute
LL | #[nonsense] LL | #[nonsense]
| ^^^^^^^^^^^ | ^^^^^^^^^^^
| |
= help: only `skip_arg`, `primary_span`, `label`, `note` and `help` are valid field attributes = help: only `skip_arg`, `primary_span`, `label`, `note`, `help` and `subdiagnostic` are valid field attributes
error: the `#[label = ...]` attribute can only be applied to fields of type `Span` error: the `#[label = ...]` attribute can only be applied to fields of type `Span`
--> $DIR/diagnostic-derive.rs:156:5 --> $DIR/diagnostic-derive.rs:156:5