Reduce span of let else irrefutable_let_patterns warning
Huge spans aren't good for IDE users as they underline constructs that are possibly multiline.
This commit is contained in:
parent
5e97720429
commit
7b55d17a2f
@ -79,7 +79,10 @@ impl<'tcx> Visitor<'tcx> for MatchVisitor<'_, '_, 'tcx> {
|
|||||||
intravisit::walk_local(self, loc);
|
intravisit::walk_local(self, loc);
|
||||||
let els = loc.els;
|
let els = loc.els;
|
||||||
if let Some(init) = loc.init && els.is_some() {
|
if let Some(init) = loc.init && els.is_some() {
|
||||||
self.check_let(&loc.pat, init, loc.span);
|
// Build a span without the else { ... } as we don't want to underline
|
||||||
|
// the entire else block in the IDE setting.
|
||||||
|
let span = loc.span.with_hi(init.span.hi());
|
||||||
|
self.check_let(&loc.pat, init, span);
|
||||||
}
|
}
|
||||||
|
|
||||||
let (msg, sp) = match loc.source {
|
let (msg, sp) = match loc.source {
|
||||||
@ -630,11 +633,6 @@ fn irrefutable_let_patterns(
|
|||||||
count: usize,
|
count: usize,
|
||||||
span: Span,
|
span: Span,
|
||||||
) {
|
) {
|
||||||
let span = match source {
|
|
||||||
LetSource::LetElse(span) => span,
|
|
||||||
_ => span,
|
|
||||||
};
|
|
||||||
|
|
||||||
macro_rules! emit_diag {
|
macro_rules! emit_diag {
|
||||||
(
|
(
|
||||||
$lint:expr,
|
$lint:expr,
|
||||||
@ -680,7 +678,7 @@ fn irrefutable_let_patterns(
|
|||||||
"removing the guard and adding a `let` inside the match arm"
|
"removing the guard and adding a `let` inside the match arm"
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
LetSource::LetElse(..) => {
|
LetSource::LetElse => {
|
||||||
emit_diag!(
|
emit_diag!(
|
||||||
lint,
|
lint,
|
||||||
"`let...else`",
|
"`let...else`",
|
||||||
@ -1127,7 +1125,7 @@ pub enum LetSource {
|
|||||||
GenericLet,
|
GenericLet,
|
||||||
IfLet,
|
IfLet,
|
||||||
IfLetGuard,
|
IfLetGuard,
|
||||||
LetElse(Span),
|
LetElse,
|
||||||
WhileLet,
|
WhileLet,
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1156,8 +1154,8 @@ fn let_source_parent(tcx: TyCtxt<'_>, parent: HirId, pat_id: Option<HirId>) -> L
|
|||||||
let parent_parent = hir.get_parent_node(parent);
|
let parent_parent = hir.get_parent_node(parent);
|
||||||
let parent_parent_node = hir.get(parent_parent);
|
let parent_parent_node = hir.get(parent_parent);
|
||||||
match parent_parent_node {
|
match parent_parent_node {
|
||||||
hir::Node::Stmt(hir::Stmt { kind: hir::StmtKind::Local(_), span, .. }) => {
|
hir::Node::Stmt(hir::Stmt { kind: hir::StmtKind::Local(_), .. }) => {
|
||||||
return LetSource::LetElse(*span);
|
return LetSource::LetElse;
|
||||||
}
|
}
|
||||||
hir::Node::Arm(hir::Arm { guard: Some(hir::Guard::If(_)), .. }) => {
|
hir::Node::Arm(hir::Arm { guard: Some(hir::Guard::If(_)), .. }) => {
|
||||||
return LetSource::IfLetGuard;
|
return LetSource::IfLetGuard;
|
||||||
|
@ -1,7 +1,11 @@
|
|||||||
// check-pass
|
// check-pass
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
fn main() {
|
fn main() {
|
||||||
let x = 1 else { return }; //~ WARN irrefutable `let...else` pattern
|
let x = 1 else { return }; //~ WARN irrefutable `let...else` pattern
|
||||||
|
|
||||||
|
// Multiline else blocks should not get printed
|
||||||
|
let x = 1 else { //~ WARN irrefutable `let...else` pattern
|
||||||
|
eprintln!("problem case encountered");
|
||||||
|
return
|
||||||
|
};
|
||||||
}
|
}
|
||||||
|
@ -1,12 +1,21 @@
|
|||||||
warning: irrefutable `let...else` pattern
|
warning: irrefutable `let...else` pattern
|
||||||
--> $DIR/let-else-irrefutable.rs:6:5
|
--> $DIR/let-else-irrefutable.rs:4:5
|
||||||
|
|
|
|
||||||
LL | let x = 1 else { return };
|
LL | let x = 1 else { return };
|
||||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^
|
| ^^^^^^^^^
|
||||||
|
|
|
|
||||||
= note: this pattern will always match, so the `else` clause is useless
|
= note: this pattern will always match, so the `else` clause is useless
|
||||||
= help: consider removing the `else` clause
|
= help: consider removing the `else` clause
|
||||||
= note: `#[warn(irrefutable_let_patterns)]` on by default
|
= note: `#[warn(irrefutable_let_patterns)]` on by default
|
||||||
|
|
||||||
warning: 1 warning emitted
|
warning: irrefutable `let...else` pattern
|
||||||
|
--> $DIR/let-else-irrefutable.rs:7:5
|
||||||
|
|
|
||||||
|
LL | let x = 1 else {
|
||||||
|
| ^^^^^^^^^
|
||||||
|
|
|
||||||
|
= note: this pattern will always match, so the `else` clause is useless
|
||||||
|
= help: consider removing the `else` clause
|
||||||
|
|
||||||
|
warning: 2 warnings emitted
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user