summaryrefslogtreecommitdiffstats
path: root/compiler/rustc_errors/src/diagnostic.rs
diff options
context:
space:
mode:
Diffstat (limited to 'compiler/rustc_errors/src/diagnostic.rs')
-rw-r--r--compiler/rustc_errors/src/diagnostic.rs77
1 files changed, 21 insertions, 56 deletions
diff --git a/compiler/rustc_errors/src/diagnostic.rs b/compiler/rustc_errors/src/diagnostic.rs
index 470f318eb..be5068060 100644
--- a/compiler/rustc_errors/src/diagnostic.rs
+++ b/compiler/rustc_errors/src/diagnostic.rs
@@ -91,10 +91,7 @@ where
#[rustc_diagnostic_item = "DecorateLint"]
pub trait DecorateLint<'a, G: EmissionGuarantee> {
/// Decorate and emit a lint.
- fn decorate_lint<'b>(
- self,
- diag: &'b mut DiagnosticBuilder<'a, G>,
- ) -> &'b mut DiagnosticBuilder<'a, G>;
+ fn decorate_lint<'b>(self, diag: &'b mut DiagnosticBuilder<'a, G>);
fn msg(&self) -> DiagnosticMessage;
}
@@ -239,7 +236,7 @@ impl Diagnostic {
}
#[track_caller]
- pub fn new_with_code<M: Into<DiagnosticMessage>>(
+ pub(crate) fn new_with_code<M: Into<DiagnosticMessage>>(
level: Level,
code: Option<DiagnosticId>,
message: M,
@@ -281,7 +278,7 @@ impl Diagnostic {
}
}
- pub fn update_unstable_expectation_id(
+ pub(crate) fn update_unstable_expectation_id(
&mut self,
unstable_to_stable: &FxHashMap<LintExpectationId, LintExpectationId>,
) {
@@ -307,14 +304,14 @@ impl Diagnostic {
}
/// Indicates whether this diagnostic should show up in cargo's future breakage report.
- pub fn has_future_breakage(&self) -> bool {
+ pub(crate) fn has_future_breakage(&self) -> bool {
match self.code {
Some(DiagnosticId::Lint { has_future_breakage, .. }) => has_future_breakage,
_ => false,
}
}
- pub fn is_force_warn(&self) -> bool {
+ pub(crate) fn is_force_warn(&self) -> bool {
match self.code {
Some(DiagnosticId::Lint { is_force_warn, .. }) => is_force_warn,
_ => false,
@@ -391,29 +388,6 @@ impl Diagnostic {
self.note_expected_found_extra(expected_label, expected, found_label, found, &"", &"")
}
- pub fn note_unsuccessful_coercion(
- &mut self,
- expected: DiagnosticStyledString,
- found: DiagnosticStyledString,
- ) -> &mut Self {
- let mut msg: Vec<_> =
- vec![(Cow::from("required when trying to coerce from type `"), Style::NoStyle)];
- msg.extend(expected.0.iter().map(|x| match *x {
- StringPart::Normal(ref s) => (Cow::from(s.clone()), Style::NoStyle),
- StringPart::Highlighted(ref s) => (Cow::from(s.clone()), Style::Highlight),
- }));
- msg.push((Cow::from("` to type '"), Style::NoStyle));
- msg.extend(found.0.iter().map(|x| match *x {
- StringPart::Normal(ref s) => (Cow::from(s.clone()), Style::NoStyle),
- StringPart::Highlighted(ref s) => (Cow::from(s.clone()), Style::Highlight),
- }));
- msg.push((Cow::from("`"), Style::NoStyle));
-
- // For now, just attach these as notes
- self.highlighted_note(msg);
- self
- }
-
pub fn note_expected_found_extra(
&mut self,
expected_label: &dyn fmt::Display,
@@ -475,7 +449,7 @@ impl Diagnostic {
self
}
- pub fn highlighted_note<M: Into<SubdiagnosticMessage>>(
+ fn highlighted_note<M: Into<SubdiagnosticMessage>>(
&mut self,
msg: Vec<(M, Style)>,
) -> &mut Self {
@@ -572,14 +546,6 @@ impl Diagnostic {
self
}
- /// Clear any existing suggestions.
- pub fn clear_suggestions(&mut self) -> &mut Self {
- if let Ok(suggestions) = &mut self.suggestions {
- suggestions.clear();
- }
- self
- }
-
/// Helper for pushing to `self.suggestions`, if available (not disable).
fn push_suggestion(&mut self, suggestion: CodeSuggestion) {
if let Ok(suggestions) = &mut self.suggestions {
@@ -622,17 +588,18 @@ impl Diagnostic {
pub fn multipart_suggestion_with_style(
&mut self,
msg: impl Into<SubdiagnosticMessage>,
- suggestion: Vec<(Span, String)>,
+ mut suggestion: Vec<(Span, String)>,
applicability: Applicability,
style: SuggestionStyle,
) -> &mut Self {
- let mut parts = suggestion
+ suggestion.sort_unstable();
+ suggestion.dedup();
+
+ let parts = suggestion
.into_iter()
.map(|(span, snippet)| SubstitutionPart { snippet, span })
.collect::<Vec<_>>();
- parts.sort_unstable_by_key(|part| part.span);
-
assert!(!parts.is_empty());
debug_assert_eq!(
parts.iter().find(|part| part.span.is_empty() && part.snippet.is_empty()),
@@ -777,17 +744,15 @@ impl Diagnostic {
applicability: Applicability,
style: SuggestionStyle,
) -> &mut Self {
- let mut suggestions: Vec<_> = suggestions.into_iter().collect();
- suggestions.sort();
-
- debug_assert!(
- !(sp.is_empty() && suggestions.iter().any(|suggestion| suggestion.is_empty())),
- "Span must not be empty and have no suggestion"
- );
-
let substitutions = suggestions
.into_iter()
- .map(|snippet| Substitution { parts: vec![SubstitutionPart { snippet, span: sp }] })
+ .map(|snippet| {
+ debug_assert!(
+ !(sp.is_empty() && snippet.is_empty()),
+ "Span must not be empty and have no suggestion"
+ );
+ Substitution { parts: vec![SubstitutionPart { snippet, span: sp }] }
+ })
.collect();
self.push_suggestion(CodeSuggestion {
substitutions,
@@ -921,13 +886,13 @@ impl Diagnostic {
/// interpolated variables).
pub fn eager_subdiagnostic(
&mut self,
- handler: &crate::Handler,
+ dcx: &crate::DiagCtxt,
subdiagnostic: impl AddToDiagnostic,
) -> &mut Self {
subdiagnostic.add_to_diagnostic_with(self, |diag, msg| {
let args = diag.args();
let msg = diag.subdiagnostic_message_to_diagnostic_message(msg);
- handler.eagerly_translate(msg, args)
+ dcx.eagerly_translate(msg, args)
});
self
}
@@ -994,7 +959,7 @@ impl Diagnostic {
/// Helper function that takes a `SubdiagnosticMessage` and returns a `DiagnosticMessage` by
/// combining it with the primary message of the diagnostic (if translatable, otherwise it just
/// passes the user's string along).
- pub(crate) fn subdiagnostic_message_to_diagnostic_message(
+ fn subdiagnostic_message_to_diagnostic_message(
&self,
attr: impl Into<SubdiagnosticMessage>,
) -> DiagnosticMessage {