mirror of
https://github.com/rust-lang/rust.git
synced 2025-02-16 08:53:35 +00:00
Auto merge of #87140 - camsteffen:pat-slice-refs, r=oli-obk
Remove refs from Pat slices Changes `PatKind::Or(&'hir [&'hir Pat<'hir>])` to `PatKind::Or(&'hir [Pat<'hir>])` and others. This is more consistent with `ExprKind`, saves a little memory, and is a little easier to use.
This commit is contained in:
commit
1b0e57800c
@ -61,13 +61,13 @@ fn lint_manual_unwrap_or<'tcx>(cx: &LateContext<'tcx>, expr: &'tcx Expr<'tcx>) {
|
|||||||
if let Some((idx, or_arm)) = arms.iter().enumerate().find(|(_, arm)| {
|
if let Some((idx, or_arm)) = arms.iter().enumerate().find(|(_, arm)| {
|
||||||
match arm.pat.kind {
|
match arm.pat.kind {
|
||||||
PatKind::Path(ref qpath) => is_lang_ctor(cx, qpath, OptionNone),
|
PatKind::Path(ref qpath) => is_lang_ctor(cx, qpath, OptionNone),
|
||||||
PatKind::TupleStruct(ref qpath, &[pat], _) =>
|
PatKind::TupleStruct(ref qpath, [pat], _) =>
|
||||||
matches!(pat.kind, PatKind::Wild) && is_lang_ctor(cx, qpath, ResultErr),
|
matches!(pat.kind, PatKind::Wild) && is_lang_ctor(cx, qpath, ResultErr),
|
||||||
_ => false,
|
_ => false,
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
let unwrap_arm = &arms[1 - idx];
|
let unwrap_arm = &arms[1 - idx];
|
||||||
if let PatKind::TupleStruct(ref qpath, &[unwrap_pat], _) = unwrap_arm.pat.kind;
|
if let PatKind::TupleStruct(ref qpath, [unwrap_pat], _) = unwrap_arm.pat.kind;
|
||||||
if is_lang_ctor(cx, qpath, OptionSome) || is_lang_ctor(cx, qpath, ResultOk);
|
if is_lang_ctor(cx, qpath, OptionSome) || is_lang_ctor(cx, qpath, ResultOk);
|
||||||
if let PatKind::Binding(_, binding_hir_id, ..) = unwrap_pat.kind;
|
if let PatKind::Binding(_, binding_hir_id, ..) = unwrap_pat.kind;
|
||||||
if path_to_local_id(unwrap_arm.body, binding_hir_id);
|
if path_to_local_id(unwrap_arm.body, binding_hir_id);
|
||||||
|
@ -625,7 +625,7 @@ impl<'tcx> LateLintPass<'tcx> for Matches {
|
|||||||
if let PatKind::TupleStruct(
|
if let PatKind::TupleStruct(
|
||||||
QPath::Resolved(None, variant_name), args, _) = arms[0].pat.kind;
|
QPath::Resolved(None, variant_name), args, _) = arms[0].pat.kind;
|
||||||
if args.len() == 1;
|
if args.len() == 1;
|
||||||
if let PatKind::Binding(_, arg, ..) = strip_pat_refs(args[0]).kind;
|
if let PatKind::Binding(_, arg, ..) = strip_pat_refs(&args[0]).kind;
|
||||||
let body = remove_blocks(arms[0].body);
|
let body = remove_blocks(arms[0].body);
|
||||||
if path_to_local_id(body, arg);
|
if path_to_local_id(body, arg);
|
||||||
|
|
||||||
|
@ -132,7 +132,7 @@ fn detect_option_if_let_else<'tcx>(
|
|||||||
if !is_else_clause(cx.tcx, expr);
|
if !is_else_clause(cx.tcx, expr);
|
||||||
if arms.len() == 2;
|
if arms.len() == 2;
|
||||||
if !is_result_ok(cx, cond_expr); // Don't lint on Result::ok because a different lint does it already
|
if !is_result_ok(cx, cond_expr); // Don't lint on Result::ok because a different lint does it already
|
||||||
if let PatKind::TupleStruct(struct_qpath, &[inner_pat], _) = &arms[0].pat.kind;
|
if let PatKind::TupleStruct(struct_qpath, [inner_pat], _) = &arms[0].pat.kind;
|
||||||
if is_lang_ctor(cx, struct_qpath, OptionSome);
|
if is_lang_ctor(cx, struct_qpath, OptionSome);
|
||||||
if let PatKind::Binding(bind_annotation, _, id, _) = &inner_pat.kind;
|
if let PatKind::Binding(bind_annotation, _, id, _) = &inner_pat.kind;
|
||||||
if !contains_return_break_continue_macro(arms[0].body);
|
if !contains_return_break_continue_macro(arms[0].body);
|
||||||
|
@ -258,7 +258,7 @@ fn get_variant<'a>(adt_def: &'a AdtDef, qpath: &QPath<'_>) -> Option<&'a Variant
|
|||||||
|
|
||||||
fn find_first_mismatch_in_tuple<'tcx, I>(
|
fn find_first_mismatch_in_tuple<'tcx, I>(
|
||||||
cx: &LateContext<'tcx>,
|
cx: &LateContext<'tcx>,
|
||||||
pats: &[&Pat<'_>],
|
pats: &[Pat<'_>],
|
||||||
ty_iter_src: I,
|
ty_iter_src: I,
|
||||||
) -> Option<(Span, Mutability, Level)>
|
) -> Option<(Span, Mutability, Level)>
|
||||||
where
|
where
|
||||||
|
@ -255,7 +255,7 @@ pub fn in_macro(span: Span) -> bool {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/// Checks if given pattern is a wildcard (`_`)
|
/// Checks if given pattern is a wildcard (`_`)
|
||||||
pub fn is_wild<'tcx>(pat: &impl std::ops::Deref<Target = Pat<'tcx>>) -> bool {
|
pub fn is_wild(pat: &Pat<'_>) -> bool {
|
||||||
matches!(pat.kind, PatKind::Wild)
|
matches!(pat.kind, PatKind::Wild)
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1023,8 +1023,8 @@ pub fn is_refutable(cx: &LateContext<'_>, pat: &Pat<'_>) -> bool {
|
|||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
fn are_refutable<'a, I: Iterator<Item = &'a Pat<'a>>>(cx: &LateContext<'_>, mut i: I) -> bool {
|
fn are_refutable<'a, I: IntoIterator<Item = &'a Pat<'a>>>(cx: &LateContext<'_>, i: I) -> bool {
|
||||||
i.any(|pat| is_refutable(cx, pat))
|
i.into_iter().any(|pat| is_refutable(cx, pat))
|
||||||
}
|
}
|
||||||
|
|
||||||
match pat.kind {
|
match pat.kind {
|
||||||
@ -1035,23 +1035,23 @@ pub fn is_refutable(cx: &LateContext<'_>, pat: &Pat<'_>) -> bool {
|
|||||||
PatKind::Path(ref qpath) => is_enum_variant(cx, qpath, pat.hir_id),
|
PatKind::Path(ref qpath) => is_enum_variant(cx, qpath, pat.hir_id),
|
||||||
PatKind::Or(pats) => {
|
PatKind::Or(pats) => {
|
||||||
// TODO: should be the honest check, that pats is exhaustive set
|
// TODO: should be the honest check, that pats is exhaustive set
|
||||||
are_refutable(cx, pats.iter().map(|pat| &**pat))
|
are_refutable(cx, pats)
|
||||||
},
|
},
|
||||||
PatKind::Tuple(pats, _) => are_refutable(cx, pats.iter().map(|pat| &**pat)),
|
PatKind::Tuple(pats, _) => are_refutable(cx, pats),
|
||||||
PatKind::Struct(ref qpath, fields, _) => {
|
PatKind::Struct(ref qpath, fields, _) => {
|
||||||
is_enum_variant(cx, qpath, pat.hir_id) || are_refutable(cx, fields.iter().map(|field| &*field.pat))
|
is_enum_variant(cx, qpath, pat.hir_id) || are_refutable(cx, fields.iter().map(|field| &*field.pat))
|
||||||
},
|
},
|
||||||
PatKind::TupleStruct(ref qpath, pats, _) => {
|
PatKind::TupleStruct(ref qpath, pats, _) => {
|
||||||
is_enum_variant(cx, qpath, pat.hir_id) || are_refutable(cx, pats.iter().map(|pat| &**pat))
|
is_enum_variant(cx, qpath, pat.hir_id) || are_refutable(cx, pats)
|
||||||
},
|
},
|
||||||
PatKind::Slice(head, ref middle, tail) => {
|
PatKind::Slice(head, middle, tail) => {
|
||||||
match &cx.typeck_results().node_type(pat.hir_id).kind() {
|
match &cx.typeck_results().node_type(pat.hir_id).kind() {
|
||||||
rustc_ty::Slice(..) => {
|
rustc_ty::Slice(..) => {
|
||||||
// [..] is the only irrefutable slice pattern.
|
// [..] is the only irrefutable slice pattern.
|
||||||
!head.is_empty() || middle.is_none() || !tail.is_empty()
|
!head.is_empty() || middle.is_none() || !tail.is_empty()
|
||||||
},
|
},
|
||||||
rustc_ty::Array(..) => {
|
rustc_ty::Array(..) => {
|
||||||
are_refutable(cx, head.iter().chain(middle).chain(tail.iter()).map(|pat| &**pat))
|
are_refutable(cx, head.iter().chain(middle).chain(tail.iter()))
|
||||||
},
|
},
|
||||||
_ => {
|
_ => {
|
||||||
// unreachable!()
|
// unreachable!()
|
||||||
@ -1066,7 +1066,7 @@ pub fn is_refutable(cx: &LateContext<'_>, pat: &Pat<'_>) -> bool {
|
|||||||
/// the function once on the given pattern.
|
/// the function once on the given pattern.
|
||||||
pub fn recurse_or_patterns<'tcx, F: FnMut(&'tcx Pat<'tcx>)>(pat: &'tcx Pat<'tcx>, mut f: F) {
|
pub fn recurse_or_patterns<'tcx, F: FnMut(&'tcx Pat<'tcx>)>(pat: &'tcx Pat<'tcx>, mut f: F) {
|
||||||
if let PatKind::Or(pats) = pat.kind {
|
if let PatKind::Or(pats) = pat.kind {
|
||||||
pats.iter().copied().for_each(f);
|
pats.iter().for_each(f);
|
||||||
} else {
|
} else {
|
||||||
f(pat);
|
f(pat);
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user