errors: only eagerly translate subdiagnostics
Subdiagnostics don't need to be lazily translated, they can always be eagerly translated. Eager translation is slightly more complex as we need to have a `DiagCtxt` available to perform the translation, which involves slightly more threading of that context. This slight increase in complexity should enable later simplifications - like passing `DiagCtxt` into `AddToDiagnostic` and moving Fluent messages into the diagnostic structs rather than having them in separate files (working on that was what led to this change). Signed-off-by: David Wood <david@davidtw.co>
This commit is contained in:
parent
bb89df6903
commit
b80fc5d4e8
43 changed files with 532 additions and 388 deletions
|
@ -331,44 +331,7 @@ impl DiagnosticDeriveVariantBuilder {
|
|||
}
|
||||
}
|
||||
(Meta::Path(_), "subdiagnostic") => {
|
||||
if FieldInnerTy::from_type(&info.binding.ast().ty).will_iterate() {
|
||||
let DiagnosticDeriveKind::Diagnostic = self.kind else {
|
||||
// No eager translation for lints.
|
||||
return Ok(quote! { diag.subdiagnostic(#binding); });
|
||||
};
|
||||
return Ok(quote! { diag.eager_subdiagnostic(dcx, #binding); });
|
||||
} else {
|
||||
return Ok(quote! { diag.subdiagnostic(#binding); });
|
||||
}
|
||||
}
|
||||
(Meta::List(meta_list), "subdiagnostic") => {
|
||||
let err = || {
|
||||
span_err(
|
||||
meta_list.span().unwrap(),
|
||||
"`eager` is the only supported nested attribute for `subdiagnostic`",
|
||||
)
|
||||
.emit();
|
||||
};
|
||||
|
||||
let Ok(p): Result<Path, _> = meta_list.parse_args() else {
|
||||
err();
|
||||
return Ok(quote! {});
|
||||
};
|
||||
|
||||
if !p.is_ident("eager") {
|
||||
err();
|
||||
return Ok(quote! {});
|
||||
}
|
||||
|
||||
match &self.kind {
|
||||
DiagnosticDeriveKind::Diagnostic => {}
|
||||
DiagnosticDeriveKind::LintDiagnostic => {
|
||||
throw_invalid_attr!(attr, |diag| {
|
||||
diag.help("eager subdiagnostics are not supported on lints")
|
||||
})
|
||||
}
|
||||
};
|
||||
return Ok(quote! { diag.eager_subdiagnostic(dcx, #binding); });
|
||||
return Ok(quote! { diag.subdiagnostic(diag.dcx, #binding); });
|
||||
}
|
||||
_ => (),
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue