calc depth

This commit is contained in:
k-nasa 2021-10-13 22:02:39 +09:00
parent ef9c4b666f
commit b3930599a7
2 changed files with 41 additions and 1 deletions

View File

@ -12,7 +12,7 @@ use syntax::{
};
use crate::{
utils::{does_pat_match_variant, unwrap_trivial_block},
utils::{does_nested_pattern, does_pat_match_variant, unwrap_trivial_block},
AssistContext, AssistId, AssistKind, Assists,
};
@ -143,6 +143,8 @@ fn make_else_arm(
Some((it, pat)) => {
if does_pat_match_variant(pat, &it.sad_pattern()) {
it.happy_pattern_wildcard()
} else if does_nested_pattern(pat) {
make::wildcard_pat().into()
} else {
it.sad_pattern()
}
@ -596,6 +598,7 @@ fn foo(x: Result<i32, ()>) {
Ok(Some(_)) => (),
_ => (),
}
}
"#,
);
}

View File

@ -285,6 +285,43 @@ 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, mut 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(_) => 1,
// TODO implement
ast::Pat::TupleStructPat(pat) => {
for p in pat.fields() {
depth += calc_depth(&p, depth + 1);
}
depth
}
}
}
// Uses a syntax-driven approach to find any impl blocks for the struct that
// exist within the module/file
//