Merge #10491
10491: Support nested type on replace if let with match r=k-nasa a=k-nasa ## Why close: https://github.com/rust-analyzer/rust-analyzer/issues/8690 Now, Replacing if-let with match cant't output exhaustive patterns code. This was because the `else` conversion used specific types (ex. Option, Result) instead of wildcards. I thought it was more of a problem to generate non-exhaustive patterns than the benefits of using the concrete one. How about using wildcards in `else`? Is this change policy acceptable? ## What - using wildcards on `make_else_arm` - Change test cases Co-authored-by: k-nasa <htilcs1115@gmail.com>
This commit is contained in:
@@ -285,6 +285,47 @@ pub(crate) fn does_pat_match_variant(pat: &ast::Pat, var: &ast::Pat) -> bool {
|
||||
pat_head == var_head
|
||||
}
|
||||
|
||||
pub(crate) fn does_nested_pattern(pat: &ast::Pat) -> bool {
|
||||
let depth = calc_depth(pat, 0);
|
||||
|
||||
if 1 < depth {
|
||||
return true;
|
||||
}
|
||||
false
|
||||
}
|
||||
|
||||
fn calc_depth(pat: &ast::Pat, depth: usize) -> usize {
|
||||
match pat {
|
||||
ast::Pat::IdentPat(_)
|
||||
| ast::Pat::BoxPat(_)
|
||||
| ast::Pat::RestPat(_)
|
||||
| ast::Pat::LiteralPat(_)
|
||||
| ast::Pat::MacroPat(_)
|
||||
| ast::Pat::OrPat(_)
|
||||
| ast::Pat::ParenPat(_)
|
||||
| ast::Pat::PathPat(_)
|
||||
| ast::Pat::WildcardPat(_)
|
||||
| ast::Pat::RangePat(_)
|
||||
| ast::Pat::RecordPat(_)
|
||||
| ast::Pat::RefPat(_)
|
||||
| ast::Pat::SlicePat(_)
|
||||
| ast::Pat::TuplePat(_)
|
||||
| ast::Pat::ConstBlockPat(_) => depth,
|
||||
|
||||
// FIXME: Other patterns may also be nested. Currently it simply supports only `TupleStructPat`
|
||||
ast::Pat::TupleStructPat(pat) => {
|
||||
let mut max_depth = depth;
|
||||
for p in pat.fields() {
|
||||
let d = calc_depth(&p, depth + 1);
|
||||
if d > max_depth {
|
||||
max_depth = d
|
||||
}
|
||||
}
|
||||
max_depth
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Uses a syntax-driven approach to find any impl blocks for the struct that
|
||||
// exist within the module/file
|
||||
//
|
||||
|
||||
Reference in New Issue
Block a user