about summary refs log tree commit diff
path: root/compiler/rustc_lint/src/expect.rs
diff options
context:
space:
mode:
authorxFrednet <xFrednet@gmail.com>2021-08-06 23:36:33 +0200
committerxFrednet <xFrednet@gmail.com>2022-03-02 17:46:07 +0100
commit44cb8fa482abaa567119ceab125498cfeef1171b (patch)
treea5c38e9375af1afd0545e8b7f74f236f87bb2677 /compiler/rustc_lint/src/expect.rs
parent2ca9037b6154227306d9b40a87d79e691f1c9126 (diff)
downloadrust-44cb8fa482abaa567119ceab125498cfeef1171b.tar.gz
rust-44cb8fa482abaa567119ceab125498cfeef1171b.zip
Check lint expectations and emit lint if unfulfilled (RFC-2383)
Diffstat (limited to 'compiler/rustc_lint/src/expect.rs')
-rw-r--r--compiler/rustc_lint/src/expect.rs48
1 files changed, 48 insertions, 0 deletions
diff --git a/compiler/rustc_lint/src/expect.rs b/compiler/rustc_lint/src/expect.rs
new file mode 100644
index 00000000000..a0c8b3501cd
--- /dev/null
+++ b/compiler/rustc_lint/src/expect.rs
@@ -0,0 +1,48 @@
+use crate::builtin;
+use rustc_data_structures::fx::FxHashMap;
+use rustc_middle::lint::struct_lint_level;
+use rustc_middle::{lint::LintExpectation, ty::TyCtxt};
+use rustc_session::lint::LintExpectationId;
+use rustc_span::symbol::sym;
+use rustc_span::MultiSpan;
+
+pub fn check_expectations(tcx: TyCtxt<'_>) {
+    if !tcx.sess.features_untracked().enabled(sym::lint_reasons) {
+        return;
+    }
+
+    let fulfilled_expectations = tcx.sess.diagnostic().steal_fulfilled_expectation_ids();
+    let lint_expectations: &FxHashMap<LintExpectationId, LintExpectation> =
+        &tcx.lint_levels(()).lint_expectations;
+
+    for (id, expectation) in lint_expectations {
+        if fulfilled_expectations.contains(id) {
+            continue;
+        }
+
+        emit_unfulfilled_expectation_lint(tcx, expectation);
+    }
+}
+
+fn emit_unfulfilled_expectation_lint(tcx: TyCtxt<'_>, expectation: &LintExpectation) {
+    // FIXME  The current implementation doesn't cover cases where the
+    // `unfulfilled_lint_expectations` is actually expected by another lint
+    // expectation. This can be added here as we have the lint level of this
+    // expectation, and we can also mark the lint expectation it would fulfill
+    // as such. This is currently not implemented to get some early feedback
+    // before diving deeper into this.
+    struct_lint_level(
+        tcx.sess,
+        builtin::UNFULFILLED_LINT_EXPECTATIONS,
+        expectation.emission_level,
+        expectation.emission_level_source,
+        Some(MultiSpan::from_span(expectation.emission_span)),
+        |diag| {
+            let mut diag = diag.build("this lint expectation is unfulfilled");
+            if let Some(rationale) = expectation.reason {
+                diag.note(&rationale.as_str());
+            }
+            diag.emit();
+        },
+    );
+}