Skip to content

Commit 04caaae

Browse files
committed
use let chains to get more in line with the general style
1 parent 12ed41b commit 04caaae

File tree

1 file changed

+44
-50
lines changed

1 file changed

+44
-50
lines changed

clippy_lints/src/rest_when_destructuring_struct.rs

Lines changed: 44 additions & 50 deletions
Original file line numberDiff line numberDiff line change
@@ -47,60 +47,54 @@ declare_lint_pass!(RestWhenDestructuringStruct => [REST_WHEN_DESTRUCTURING_STRUC
4747

4848
impl<'tcx> LateLintPass<'tcx> for RestWhenDestructuringStruct {
4949
fn check_pat(&mut self, cx: &rustc_lint::LateContext<'tcx>, pat: &'tcx rustc_hir::Pat<'tcx>) {
50-
if pat.span.in_external_macro(cx.tcx.sess.source_map()) {
51-
return;
52-
}
53-
54-
if is_from_proc_macro(cx, pat) {
55-
return;
56-
}
57-
58-
if let rustc_hir::PatKind::Struct(path, fields, true) = pat.kind {
59-
let qty = cx.typeck_results().qpath_res(&path, pat.hir_id);
60-
let ty = cx.typeck_results().pat_ty(pat);
61-
if let ty::Adt(a, _) = ty.kind() {
62-
let vid = qty
63-
.opt_def_id()
64-
.map_or(VariantIdx::ZERO, |x| a.variant_index_with_id(x));
65-
let mut rest_fields = a.variants()[vid]
66-
.fields
67-
.iter()
68-
.map(|field| field.ident(cx.tcx))
69-
.filter(|pf| !fields.iter().any(|x| x.ident == *pf))
70-
.map(|x| format!("{x}: _"));
71-
let fmt_fields = rest_fields.join(", ");
50+
if let rustc_hir::PatKind::Struct(path, fields, true) = pat.kind
51+
&& !pat.span.in_external_macro(cx.tcx.sess.source_map())
52+
&& !is_from_proc_macro(cx, pat)
53+
&& let qty = cx.typeck_results().qpath_res(&path, pat.hir_id)
54+
&& let ty = cx.typeck_results().pat_ty(pat)
55+
&& let ty::Adt(a, _) = ty.kind()
56+
{
57+
let vid = qty
58+
.opt_def_id()
59+
.map_or(VariantIdx::ZERO, |x| a.variant_index_with_id(x));
60+
let mut rest_fields = a.variants()[vid]
61+
.fields
62+
.iter()
63+
.map(|field| field.ident(cx.tcx))
64+
.filter(|pf| !fields.iter().any(|x| x.ident == *pf))
65+
.map(|x| format!("{x}: _"));
66+
let fmt_fields = rest_fields.join(", ");
7267

73-
let sm = cx.sess().source_map();
68+
let sm = cx.sess().source_map();
7469

75-
// It is not possible to get the span of the et cetera symbol at HIR level
76-
// so we have to get it in a bit of a roundabout way:
70+
// It is not possible to get the span of the et cetera symbol at HIR level
71+
// so we have to get it in a bit of a roundabout way:
7772

78-
// Find the end of the last field if any.
79-
let last_field = fields.iter().last().map(|x| x.span.shrink_to_hi());
80-
// If no last field take the whole pattern.
81-
let last_field = last_field.unwrap_or(pat.span.shrink_to_lo());
82-
// Create a new span starting and ending just before the first .
83-
let before_dot = sm.span_extend_to_next_char(last_field, '.', true).shrink_to_hi();
84-
// Extend the span to the end of the line
85-
let rest_of_line = sm.span_extend_to_next_char(before_dot, '\n', true);
86-
// Shrink the span so it only contains dots
87-
let dotdot = sm.span_take_while(rest_of_line, |x| *x == '.');
73+
// Find the end of the last field if any.
74+
let last_field = fields.iter().last().map(|x| x.span.shrink_to_hi());
75+
// If no last field take the whole pattern.
76+
let last_field = last_field.unwrap_or(pat.span.shrink_to_lo());
77+
// Create a new span starting and ending just before the first .
78+
let before_dot = sm.span_extend_to_next_char(last_field, '.', true).shrink_to_hi();
79+
// Extend the span to the end of the line
80+
let rest_of_line = sm.span_extend_to_next_char(before_dot, '\n', true);
81+
// Shrink the span so it only contains dots
82+
let dotdot = sm.span_take_while(rest_of_line, |x| *x == '.');
8883

89-
span_lint_and_then(
90-
cx,
91-
REST_WHEN_DESTRUCTURING_STRUCT,
92-
pat.span,
93-
"struct destructuring with rest (..)",
94-
|diag| {
95-
diag.span_suggestion_verbose(
96-
dotdot,
97-
"consider explicitly ignoring remaining fields with wildcard patterns (x: _)",
98-
fmt_fields,
99-
rustc_errors::Applicability::MachineApplicable,
100-
);
101-
},
102-
);
103-
}
84+
span_lint_and_then(
85+
cx,
86+
REST_WHEN_DESTRUCTURING_STRUCT,
87+
pat.span,
88+
"struct destructuring with rest (..)",
89+
|diag| {
90+
diag.span_suggestion_verbose(
91+
dotdot,
92+
"consider explicitly ignoring remaining fields with wildcard patterns (x: _)",
93+
fmt_fields,
94+
rustc_errors::Applicability::MachineApplicable,
95+
);
96+
},
97+
);
10498
}
10599
}
106100
}

0 commit comments

Comments
 (0)