clippy_utils::diagnostics

Function span_lint_hir_and_then

source
pub fn span_lint_hir_and_then(
    cx: &LateContext<'_>,
    lint: &'static Lint,
    hir_id: HirId,
    sp: impl Into<MultiSpan>,
    msg: impl Into<DiagMessage>,
    f: impl FnOnce(&mut Diag<'_, ()>),
)
Expand description

Like span_lint_and_then, but emits the lint at the node identified by the given HirId.

This is in contrast to span_lint_and_then, which always emits the lint at the node that was last passed to the LintPass::check_* function.

The HirId is used for checking lint level attributes and to fulfill lint expectations defined via the #[expect] attribute.

For example:

fn f() { /* <node_1> */

    #[allow(clippy::some_lint)]
    let _x = /* <expr_1> */;
}

If some_lint does its analysis in LintPass::check_fn (at <node_1>) and emits a lint at <expr_1> using span_lint, then allowing the lint at <expr_1> as attempted in the snippet will not work! Even though that is where the warning points at, which would be confusing to users.

Instead, use this function and also pass the HirId of <expr_1>, which will let the compiler check lint level attributes at the place of the expression and the #[allow] will work.