diff options
| author | xFrednet <xFrednet@gmail.com> | 2021-11-25 17:45:11 +0100 |
|---|---|---|
| committer | xFrednet <xFrednet@gmail.com> | 2022-03-02 17:46:10 +0100 |
| commit | 3414ad95517933c40d8e66c14b951ee5ede3e0cb (patch) | |
| tree | 1c119bedc8525107201cbc327f18c1d8ee852023 /compiler/rustc_lint/src/expect.rs | |
| parent | a14456f91f2385cbf1a0f3e2108f9684ba56f281 (diff) | |
| download | rust-3414ad95517933c40d8e66c14b951ee5ede3e0cb.tar.gz rust-3414ad95517933c40d8e66c14b951ee5ede3e0cb.zip | |
Emit `unfullfilled_lint_expectation` using a `HirId` for performance (RFC-2383)
Diffstat (limited to 'compiler/rustc_lint/src/expect.rs')
| -rw-r--r-- | compiler/rustc_lint/src/expect.rs | 29 |
1 files changed, 16 insertions, 13 deletions
diff --git a/compiler/rustc_lint/src/expect.rs b/compiler/rustc_lint/src/expect.rs index db0756f5f54..5dcd1f0fbe6 100644 --- a/compiler/rustc_lint/src/expect.rs +++ b/compiler/rustc_lint/src/expect.rs @@ -1,10 +1,9 @@ use crate::builtin; use rustc_data_structures::fx::FxHashMap; -use rustc_middle::lint::struct_lint_level; +use rustc_hir::HirId; 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) { @@ -17,24 +16,28 @@ pub fn check_expectations(tcx: TyCtxt<'_>) { for (id, expectation) in lint_expectations { if !fulfilled_expectations.contains(id) { - emit_unfulfilled_expectation_lint(tcx, expectation); + // This check will always be true, since `lint_expectations` only + // holds stable ids + if let LintExpectationId::Stable { hir_id, .. } = id { + emit_unfulfilled_expectation_lint(tcx, *hir_id, expectation); + } } } } -fn emit_unfulfilled_expectation_lint(tcx: TyCtxt<'_>, expectation: &LintExpectation) { +fn emit_unfulfilled_expectation_lint( + tcx: TyCtxt<'_>, + hir_id: HirId, + 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, + // expectation. This can be added here by checking the lint level and + // retrieving the `LintExpectationId` if it was expected. + tcx.struct_span_lint_hir( builtin::UNFULFILLED_LINT_EXPECTATIONS, - expectation.emission_level, - expectation.emission_level_source, - Some(MultiSpan::from_span(expectation.emission_span)), + hir_id, + expectation.emission_span, |diag| { let mut diag = diag.build("this lint expectation is unfulfilled"); if let Some(rationale) = expectation.reason { |
