diff options
| author | yukang <moorekang@gmail.com> | 2021-09-04 19:26:25 +0800 |
|---|---|---|
| committer | yukang <moorekang@gmail.com> | 2021-09-04 19:26:25 +0800 |
| commit | ca27f03ca8862344567dcc1e6ec01f29442835fa (patch) | |
| tree | 375ec81dd8b11d70a2dfccbe6fbe86abf18c9d38 /compiler/rustc_errors/src | |
| parent | 26feefddc7f6834658ee9ff4671a7b99a040e60b (diff) | |
| download | rust-ca27f03ca8862344567dcc1e6ec01f29442835fa.tar.gz rust-ca27f03ca8862344567dcc1e6ec01f29442835fa.zip | |
Fix #88256, remove duplicated diagnostic
Diffstat (limited to 'compiler/rustc_errors/src')
| -rw-r--r-- | compiler/rustc_errors/src/diagnostic.rs | 49 | ||||
| -rw-r--r-- | compiler/rustc_errors/src/diagnostic_builder.rs | 1 |
2 files changed, 49 insertions, 1 deletions
diff --git a/compiler/rustc_errors/src/diagnostic.rs b/compiler/rustc_errors/src/diagnostic.rs index 8199c44ee2a..550c1c43530 100644 --- a/compiler/rustc_errors/src/diagnostic.rs +++ b/compiler/rustc_errors/src/diagnostic.rs @@ -9,9 +9,10 @@ use rustc_lint_defs::Applicability; use rustc_serialize::json::Json; use rustc_span::{MultiSpan, Span, DUMMY_SP}; use std::fmt; +use std::hash::{Hash, Hasher}; #[must_use] -#[derive(Clone, Debug, PartialEq, Hash, Encodable, Decodable)] +#[derive(Clone, Debug, Encodable, Decodable)] pub struct Diagnostic { pub level: Level, pub message: Vec<(String, Style)>, @@ -24,6 +25,10 @@ pub struct Diagnostic { /// as a sort key to sort a buffer of diagnostics. By default, it is the primary span of /// `span` if there is one. Otherwise, it is `DUMMY_SP`. pub sort_span: Span, + + /// If diagnostic is from Lint, custom hash function ignores notes + /// otherwise hash is based on the all the fields + pub is_lint: bool, } #[derive(Clone, Debug, PartialEq, Eq, Hash, Encodable, Decodable)] @@ -91,6 +96,7 @@ impl Diagnostic { children: vec![], suggestions: vec![], sort_span: DUMMY_SP, + is_lint: false, } } @@ -558,6 +564,11 @@ impl Diagnostic { self } + pub fn set_is_lint(&mut self) -> &mut Self { + self.is_lint = true; + self + } + pub fn code(&mut self, s: DiagnosticId) -> &mut Self { self.code = Some(s); self @@ -617,6 +628,42 @@ impl Diagnostic { let sub = SubDiagnostic { level, message, span, render_span }; self.children.push(sub); } + + /// Fields used for Hash, and PartialEq trait + fn keys( + &self, + ) -> ( + &Level, + &Vec<(String, Style)>, + &Option<DiagnosticId>, + &MultiSpan, + &Vec<CodeSuggestion>, + Option<&Vec<SubDiagnostic>>, + ) { + ( + &self.level, + &self.message, + &self.code, + &self.span, + &self.suggestions, + (if self.is_lint { None } else { Some(&self.children) }), + ) + } +} + +impl Hash for Diagnostic { + fn hash<H>(&self, state: &mut H) + where + H: Hasher, + { + self.keys().hash(state); + } +} + +impl PartialEq for Diagnostic { + fn eq(&self, other: &Self) -> bool { + self.keys() == other.keys() + } } impl SubDiagnostic { diff --git a/compiler/rustc_errors/src/diagnostic_builder.rs b/compiler/rustc_errors/src/diagnostic_builder.rs index d35b2924803..c498ce7dbe4 100644 --- a/compiler/rustc_errors/src/diagnostic_builder.rs +++ b/compiler/rustc_errors/src/diagnostic_builder.rs @@ -242,6 +242,7 @@ impl<'a> DiagnosticBuilder<'a> { sp: S, msg: &str, ) -> &mut Self); + forward!(pub fn set_is_lint(&mut self,) -> &mut Self); /// See [`Diagnostic::multipart_suggestion()`]. pub fn multipart_suggestion( |
