From b3930599a791682e5ae8268f0c779d74e1e3dfda Mon Sep 17 00:00:00 2001 From: k-nasa Date: Wed, 13 Oct 2021 22:02:39 +0900 Subject: [PATCH] calc depth --- .../src/handlers/replace_if_let_with_match.rs | 5 ++- crates/ide_assists/src/utils.rs | 37 +++++++++++++++++++ 2 files changed, 41 insertions(+), 1 deletion(-) diff --git a/crates/ide_assists/src/handlers/replace_if_let_with_match.rs b/crates/ide_assists/src/handlers/replace_if_let_with_match.rs index f7b601d144a..dcbc277b26a 100644 --- a/crates/ide_assists/src/handlers/replace_if_let_with_match.rs +++ b/crates/ide_assists/src/handlers/replace_if_let_with_match.rs @@ -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) { Ok(Some(_)) => (), _ => (), } +} "#, ); } diff --git a/crates/ide_assists/src/utils.rs b/crates/ide_assists/src/utils.rs index 3d4ab968fbb..64adddb1de6 100644 --- a/crates/ide_assists/src/utils.rs +++ b/crates/ide_assists/src/utils.rs @@ -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 //