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)>,
/// 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)]
children: vec![],
suggestions: vec![],
sort_span: DUMMY_SP,
+ is_lint: false,
}
}
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
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 {
sp: S,
msg: &str,
) -> &mut Self);
+ forward!(pub fn set_is_lint(&mut self,) -> &mut Self);
/// See [`Diagnostic::multipart_suggestion()`].
pub fn multipart_suggestion(
/// Return the inner DiagnosticBuilder, first setting the primary message to `msg`.
pub fn build(mut self, msg: &str) -> DiagnosticBuilder<'a> {
self.0.set_primary_message(msg);
+ self.0.set_is_lint();
self.0
}
#![deny(unused)]
//~^ ERROR: deny(unused) incompatible with previous forbid
//~| WARNING being phased out
- //~| ERROR: deny(unused) incompatible with previous forbid
- //~| WARNING being phased out
#![warn(unused)]
#![allow(unused)]
= warning: this was previously accepted by the compiler but is being phased out; it will become a hard error in a future release!
= note: for more information, see issue #81670 <https://github.com/rust-lang/rust/issues/81670>
-error: deny(unused) incompatible with previous forbid
- --> $DIR/issue-70819-dont-override-forbid-in-same-scope.rs:21:13
- |
-LL | #![forbid(unused)]
- | ------ `forbid` level set here
-LL | #![deny(unused)]
- | ^^^^^^ overruled by previous forbid
- |
- = warning: this was previously accepted by the compiler but is being phased out; it will become a hard error in a future release!
- = note: for more information, see issue #81670 <https://github.com/rust-lang/rust/issues/81670>
-
-error: aborting due to 2 previous errors
+error: aborting due to previous error
#![forbid(unused, non_snake_case)]
#![forbid(forbidden_lint_groups)]
-#[allow(unused_variables)] //~ ERROR incompatible with previous
+#[allow(unused_variables)]
//~^ ERROR incompatible with previous
//~| WARNING this was previously accepted by the compiler
-//~| WARNING this was previously accepted by the compiler
fn foo() {}
#[allow(unused)] //~ ERROR incompatible with previous
= note: for more information, see issue #81670 <https://github.com/rust-lang/rust/issues/81670>
error: allow(unused) incompatible with previous forbid
- --> $DIR/outer-forbid.rs:26:9
+ --> $DIR/outer-forbid.rs:25:9
|
LL | #![forbid(unused, non_snake_case)]
| ------ `forbid` level set here
= note: for more information, see issue #81670 <https://github.com/rust-lang/rust/issues/81670>
error[E0453]: allow(nonstandard_style) incompatible with previous forbid
- --> $DIR/outer-forbid.rs:30:9
+ --> $DIR/outer-forbid.rs:29:9
|
LL | #![forbid(unused, non_snake_case)]
| -------------- `forbid` level set here
LL | #[allow(nonstandard_style)]
| ^^^^^^^^^^^^^^^^^ overruled by previous forbid
-error: allow(unused_variables) incompatible with previous forbid
- --> $DIR/outer-forbid.rs:20:9
- |
-LL | #![forbid(unused, non_snake_case)]
- | ------ `forbid` level set here
-...
-LL | #[allow(unused_variables)]
- | ^^^^^^^^^^^^^^^^ overruled by previous forbid
- |
- = warning: this was previously accepted by the compiler but is being phased out; it will become a hard error in a future release!
- = note: for more information, see issue #81670 <https://github.com/rust-lang/rust/issues/81670>
-
-error: aborting due to 4 previous errors
+error: aborting due to 3 previous errors
For more information about this error, try `rustc --explain E0453`.
| ^
= help: ...or consider changing the match arm bodies
-error: this `match` has identical arm bodies
- --> $DIR/match_same_arms.rs:33:14
- |
-LL | 3 => 2, //~ ERROR 3rd matched arms have same body
- | ^
- |
-note: same as this
- --> $DIR/match_same_arms.rs:32:14
- |
-LL | 2 => 2, //~ ERROR 2nd matched arms have same body
- | ^
-help: consider refactoring into `2 | 3`
- --> $DIR/match_same_arms.rs:32:9
- |
-LL | 2 => 2, //~ ERROR 2nd matched arms have same body
- | ^
- = help: ...or consider changing the match arm bodies
-
error: this `match` has identical arm bodies
--> $DIR/match_same_arms.rs:50:55
|
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
= help: ...or consider changing the match arm bodies
-error: aborting due to 8 previous errors
+error: aborting due to 7 previous errors
|
= note: `-D clippy::identity-op` implied by `-D warnings`
-error: the operation is ineffective. Consider reducing it to `1`
- --> $DIR/modulo_one.rs:13:22
- |
-LL | const ONE: u32 = 1 * 1;
- | ^^^^^
-
error: any number modulo 1 will be 0
--> $DIR/modulo_one.rs:17:5
|
LL | INT_MIN % NEG_ONE; // also caught by rustc
| ^^^^^^^^^^^^^^^^^
-error: aborting due to 11 previous errors
+error: aborting due to 10 previous errors
|
= note: `-D clippy::suspicious-operation-groupings` implied by `-D warnings`
-error: this sequence of operators looks suspiciously like a bug
- --> $DIR/suspicious_operation_groupings.rs:14:9
- |
-LL | self.x == other.y && self.y == other.y && self.z == other.z
- | ^^^^^^^^^^^^^^^^^ help: did you mean: `self.x == other.x`
-
error: this sequence of operators looks suspiciously like a bug
--> $DIR/suspicious_operation_groupings.rs:27:20
|
LL | -(if -s1.a < -s2.a && -s1.a < -s2.b { s1.c } else { s2.a })
| ^^^^^^^^^^^^^ help: did you mean: `-s1.b < -s2.b`
-error: aborting due to 27 previous errors
+error: aborting due to 26 previous errors
suggestions: vec![],
span: span.unwrap_or_else(MultiSpan::new),
sort_span: DUMMY_SP,
+ is_lint: false,
}
}