| use std::borrow::Cow; |
| |
| use rustc_error_messages::{DiagArgValue, IntoDiagArg}; |
| use rustc_macros::Subdiagnostic; |
| use rustc_span::{Span, Symbol}; |
| |
| use crate::diagnostic::DiagLocation; |
| use crate::{Diag, EmissionGuarantee, Subdiagnostic}; |
| |
| impl IntoDiagArg for DiagLocation { |
| fn into_diag_arg(self, _: &mut Option<std::path::PathBuf>) -> DiagArgValue { |
| DiagArgValue::Str(Cow::from(self.to_string())) |
| } |
| } |
| |
| #[derive(Clone)] |
| pub struct DiagSymbolList<S = Symbol>(Vec<S>); |
| |
| impl<S> From<Vec<S>> for DiagSymbolList<S> { |
| fn from(v: Vec<S>) -> Self { |
| DiagSymbolList(v) |
| } |
| } |
| |
| impl<S> FromIterator<S> for DiagSymbolList<S> { |
| fn from_iter<T: IntoIterator<Item = S>>(iter: T) -> Self { |
| iter.into_iter().collect::<Vec<_>>().into() |
| } |
| } |
| |
| impl<S: std::fmt::Display> IntoDiagArg for DiagSymbolList<S> { |
| fn into_diag_arg(self, _: &mut Option<std::path::PathBuf>) -> DiagArgValue { |
| DiagArgValue::StrListSepByAnd( |
| self.0.into_iter().map(|sym| Cow::Owned(format!("`{sym}`"))).collect(), |
| ) |
| } |
| } |
| |
| /// Utility struct used to apply a single label while highlighting multiple spans |
| pub struct SingleLabelManySpans { |
| pub spans: Vec<Span>, |
| pub label: &'static str, |
| } |
| impl Subdiagnostic for SingleLabelManySpans { |
| fn add_to_diag<G: EmissionGuarantee>(self, diag: &mut Diag<'_, G>) { |
| diag.span_labels(self.spans, self.label); |
| } |
| } |
| |
| #[derive(Subdiagnostic)] |
| #[label( |
| "expected lifetime {$count -> |
| [1] parameter |
| *[other] parameters |
| }" |
| )] |
| pub struct ExpectedLifetimeParameter { |
| #[primary_span] |
| pub span: Span, |
| pub count: usize, |
| } |
| |
| #[derive(Subdiagnostic)] |
| #[suggestion( |
| "indicate the anonymous {$count -> |
| [1] lifetime |
| *[other] lifetimes |
| }", |
| code = "{suggestion}", |
| style = "verbose" |
| )] |
| pub struct IndicateAnonymousLifetime { |
| #[primary_span] |
| pub span: Span, |
| pub count: usize, |
| pub suggestion: String, |
| } |
| |
| #[derive(Subdiagnostic)] |
| pub struct ElidedLifetimeInPathSubdiag { |
| #[subdiagnostic] |
| pub expected: ExpectedLifetimeParameter, |
| #[subdiagnostic] |
| pub indicate: Option<IndicateAnonymousLifetime>, |
| } |