use crate::{LateContext, LateLintPass, LintContext};
-use rustc_errors::Applicability;
+use rustc_errors::{Applicability, LintDiagnosticBuilder, MultiSpan};
use rustc_hir as hir;
-use rustc_middle::{lint::LintDiagnosticBuilder, ty};
+use rustc_middle::ty;
use rustc_span::Symbol;
declare_lint! {
};
if is_sync_lock {
- cx.struct_span_lint(LET_UNDERSCORE_LOCK, local.span, |lint| {
+ let mut span = MultiSpan::from_spans(vec![local.pat.span, init.span]);
+ span.push_span_label(
+ local.pat.span,
+ "this lock is not assigned to a binding and is immediately dropped".to_string(),
+ );
+ span.push_span_label(
+ init.span,
+ "this binding will immediately drop the value assigned to it".to_string(),
+ );
+ cx.struct_span_lint(LET_UNDERSCORE_LOCK, span, |lint| {
build_and_emit_lint(
lint,
local,
lint.build(msg)
.span_suggestion_verbose(
local.pat.span,
- "consider binding to an unused variable",
+ "consider binding to an unused variable to avoid immediately dropping the value",
"_unused",
Applicability::MachineApplicable,
)
- .span_suggestion_verbose(
- init_span,
- "consider explicitly droping with `std::mem::drop`",
- "drop(...)",
- Applicability::HasPlaceholders,
+ .multipart_suggestion(
+ "consider immediately dropping the value",
+ vec![
+ (local.span.until(init_span), "drop(".to_string()),
+ (init_span.shrink_to_hi(), ")".to_string()),
+ ],
+ Applicability::MachineApplicable,
)
.emit();
}