mirror of
https://github.com/rust-lang/rust.git
synced 2024-11-22 06:44:35 +00:00
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:
parent
e5d9371b30
commit
dca88612b9
@ -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 {
|
||||||
|
@ -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,
|
||||||
|
@ -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,
|
||||||
|
}
|
||||||
|
@ -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
|
||||||
|
Loading…
Reference in New Issue
Block a user