mirror of
https://github.com/rust-lang/rust.git
synced 2024-11-02 07:22:42 +00:00
migrate: let_underscore.rs
fix: NonBindingLetSub
This commit is contained in:
parent
80df25e160
commit
e610047940
@ -16,6 +16,18 @@ lint_enum_intrinsics_mem_variant =
|
||||
lint_expectation = this lint expectation is unfulfilled
|
||||
.note = the `unfulfilled_lint_expectations` lint can't be expected and will always produce this message
|
||||
|
||||
lint_non_binding_let_on_sync_lock =
|
||||
non-binding let on a synchronization lock
|
||||
|
||||
lint_non_binding_let_on_drop_type =
|
||||
non-binding let on a type that implements `Drop`
|
||||
|
||||
lint_non_binding_let_suggestion =
|
||||
consider binding to an unused variable to avoid immediately dropping the value
|
||||
|
||||
lint_non_binding_let_multi_suggestion =
|
||||
consider immediately dropping the value
|
||||
|
||||
lint_deprecated_lint_name =
|
||||
lint name `{$name}` is deprecated and may not have an effect in the future.
|
||||
.suggestion = change it to
|
||||
|
@ -1,5 +1,10 @@
|
||||
use crate::{LateContext, LateLintPass, LintContext};
|
||||
use rustc_errors::{Applicability, DiagnosticBuilder, MultiSpan};
|
||||
#![deny(rustc::untranslatable_diagnostic)]
|
||||
#![deny(rustc::diagnostic_outside_of_impl)]
|
||||
use crate::{
|
||||
lints::{NonBindingLet, NonBindingLetSub},
|
||||
LateContext, LateLintPass, LintContext,
|
||||
};
|
||||
use rustc_errors::MultiSpan;
|
||||
use rustc_hir as hir;
|
||||
use rustc_middle::ty;
|
||||
use rustc_span::Symbol;
|
||||
@ -119,6 +124,11 @@ impl<'tcx> LateLintPass<'tcx> for LetUnderscore {
|
||||
_ => false,
|
||||
};
|
||||
|
||||
let sub = NonBindingLetSub {
|
||||
suggestion: local.pat.span,
|
||||
multi_suggestion_start: local.span.until(init.span),
|
||||
multi_suggestion_end: init.span.shrink_to_hi(),
|
||||
};
|
||||
if is_sync_lock {
|
||||
let mut span = MultiSpan::from_spans(vec![local.pat.span, init.span]);
|
||||
span.push_span_label(
|
||||
@ -129,41 +139,14 @@ impl<'tcx> LateLintPass<'tcx> for LetUnderscore {
|
||||
init.span,
|
||||
"this binding will immediately drop the value assigned to it".to_string(),
|
||||
);
|
||||
cx.struct_span_lint(
|
||||
LET_UNDERSCORE_LOCK,
|
||||
span,
|
||||
"non-binding let on a synchronization lock",
|
||||
|lint| build_lint(lint, local, init.span),
|
||||
)
|
||||
cx.emit_spanned_lint(LET_UNDERSCORE_LOCK, span, NonBindingLet::SyncLock { sub });
|
||||
} else {
|
||||
cx.struct_span_lint(
|
||||
cx.emit_spanned_lint(
|
||||
LET_UNDERSCORE_DROP,
|
||||
local.span,
|
||||
"non-binding let on a type that implements `Drop`",
|
||||
|lint| build_lint(lint, local, init.span),
|
||||
)
|
||||
NonBindingLet::DropType { sub },
|
||||
);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
fn build_lint<'a, 'b>(
|
||||
lint: &'a mut DiagnosticBuilder<'b, ()>,
|
||||
local: &hir::Local<'_>,
|
||||
init_span: rustc_span::Span,
|
||||
) -> &'a mut DiagnosticBuilder<'b, ()> {
|
||||
lint.span_suggestion_verbose(
|
||||
local.pat.span,
|
||||
"consider binding to an unused variable to avoid immediately dropping the value",
|
||||
"_unused",
|
||||
Applicability::MachineApplicable,
|
||||
)
|
||||
.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,
|
||||
)
|
||||
}
|
||||
|
@ -49,6 +49,52 @@ pub struct EnumIntrinsicsMemVariant<'a> {
|
||||
pub ty_param: Ty<'a>,
|
||||
}
|
||||
|
||||
// let_underscore.rs
|
||||
#[derive(LintDiagnostic)]
|
||||
pub enum NonBindingLet {
|
||||
#[diag(lint::non_binding_let_on_sync_lock)]
|
||||
SyncLock {
|
||||
#[subdiagnostic]
|
||||
sub: NonBindingLetSub,
|
||||
},
|
||||
#[diag(lint::non_binding_let_on_drop_type)]
|
||||
DropType {
|
||||
#[subdiagnostic]
|
||||
sub: NonBindingLetSub,
|
||||
},
|
||||
}
|
||||
|
||||
pub struct NonBindingLetSub {
|
||||
pub suggestion: Span,
|
||||
pub multi_suggestion_start: Span,
|
||||
pub multi_suggestion_end: Span,
|
||||
}
|
||||
|
||||
impl AddToDiagnostic for NonBindingLetSub {
|
||||
fn add_to_diagnostic_with<F>(self, diag: &mut rustc_errors::Diagnostic, _: F)
|
||||
where
|
||||
F: Fn(
|
||||
&mut rustc_errors::Diagnostic,
|
||||
rustc_errors::SubdiagnosticMessage,
|
||||
) -> rustc_errors::SubdiagnosticMessage,
|
||||
{
|
||||
diag.span_suggestion_verbose(
|
||||
self.suggestion,
|
||||
fluent::lint::non_binding_let_suggestion,
|
||||
"_unused",
|
||||
Applicability::MachineApplicable,
|
||||
);
|
||||
diag.multipart_suggestion(
|
||||
fluent::lint::non_binding_let_multi_suggestion,
|
||||
vec![
|
||||
(self.multi_suggestion_start, "drop(".to_string()),
|
||||
(self.multi_suggestion_end, ")".to_string()),
|
||||
],
|
||||
Applicability::MachineApplicable,
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
// levels.rs
|
||||
#[derive(LintDiagnostic)]
|
||||
#[diag(lint_overruled_attribute)]
|
||||
|
Loading…
Reference in New Issue
Block a user