diff options
| author | bors <bors@rust-lang.org> | 2021-09-06 00:14:41 +0000 |
|---|---|---|
| committer | bors <bors@rust-lang.org> | 2021-09-06 00:14:41 +0000 |
| commit | 8f3aa5e8b9e176e8a5fff81a681eba1805366e3d (patch) | |
| tree | 9aff1d58e6d28e96d4d10d8f9dbebf569f66faf9 /compiler/rustc_errors/src | |
| parent | 7849e3e9dda60e8ec826ee245c6b180e73911b37 (diff) | |
| parent | ca27f03ca8862344567dcc1e6ec01f29442835fa (diff) | |
| download | rust-8f3aa5e8b9e176e8a5fff81a681eba1805366e3d.tar.gz rust-8f3aa5e8b9e176e8a5fff81a681eba1805366e3d.zip | |
Auto merge of #88493 - chenyukang:fix-duplicated-diagnostic, r=estebank
Fix #88256 remove duplicated diagnostics Fix #88256
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( |
