Unnamed repository; edit this file 'description' to name the repository.
Diffstat (limited to 'crates/ide_assists/src/utils.rs')
| -rw-r--r-- | crates/ide_assists/src/utils.rs | 41 |
1 files changed, 41 insertions, 0 deletions
diff --git a/crates/ide_assists/src/utils.rs b/crates/ide_assists/src/utils.rs index c1092b97c2..6866186d34 100644 --- a/crates/ide_assists/src/utils.rs +++ b/crates/ide_assists/src/utils.rs @@ -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 // |