diff options
| author | Anton Firszov <antonfir@gmail.com> | 2021-10-15 12:15:52 +0200 |
|---|---|---|
| committer | Anton Firszov <antonfir@gmail.com> | 2021-10-15 12:15:52 +0200 |
| commit | 1e303cc03530e265ad22c7885c28915a86ea85d4 (patch) | |
| tree | 6af2a0183badf8990c12d08ec0f232e63caa5996 | |
| parent | 68a50150d674dc9736e07e7befa46827d2323d63 (diff) | |
| download | rust-1e303cc03530e265ad22c7885c28915a86ea85d4.tar.gz rust-1e303cc03530e265ad22c7885c28915a86ea85d4.zip | |
cursor_inside_simple_match_arm_list -- tests
| -rw-r--r-- | crates/ide_assists/src/handlers/add_missing_match_arms.rs | 69 |
1 files changed, 47 insertions, 22 deletions
diff --git a/crates/ide_assists/src/handlers/add_missing_match_arms.rs b/crates/ide_assists/src/handlers/add_missing_match_arms.rs index e106719f363..7c67c596159 100644 --- a/crates/ide_assists/src/handlers/add_missing_match_arms.rs +++ b/crates/ide_assists/src/handlers/add_missing_match_arms.rs @@ -5,7 +5,7 @@ use hir::{Adt, HasSource, ModuleDef, Semantics}; use ide_db::helpers::{mod_path_to_ast, FamousDefs}; use ide_db::RootDatabase; use itertools::Itertools; -use syntax::ast::{self, make, AstNode, HasName, MatchArm, Pat}; +use syntax::ast::{self, AstNode, HasName, MatchArm, MatchArmList, MatchExpr, Pat, make}; use syntax::TextRange; use crate::{ @@ -39,15 +39,21 @@ use crate::{ pub(crate) fn add_missing_match_arms(acc: &mut Assists, ctx: &AssistContext) -> Option<()> { let match_expr = ctx.find_node_at_offset_with_descend::<ast::MatchExpr>()?; let match_arm_list = match_expr.match_arm_list()?; + let target_range : TextRange; - let available_range = TextRange::new( - ctx.sema.original_range(match_expr.syntax()).range.start(), - ctx.sema.original_range(match_arm_list.syntax()).range.start(), - ); + if !cursor_inside_simple_match_arm_list(&ctx, &match_expr, &match_arm_list) { + target_range = TextRange::new( + ctx.sema.original_range(match_expr.syntax()).range.start(), + ctx.sema.original_range(match_arm_list.syntax()).range.start(), + ); - let cursor_in_range = available_range.contains_range(ctx.selection_trimmed()); - if !cursor_in_range { - return None; + let cursor_in_range = target_range.contains_range(ctx.selection_trimmed()); + if !cursor_in_range { + return None; + } + } + else { + target_range = ctx.sema.original_range(match_expr.syntax()).range; } let expr = match_expr.expr()?; @@ -134,7 +140,7 @@ pub(crate) fn add_missing_match_arms(acc: &mut Assists, ctx: &AssistContext) -> acc.add( AssistId("add_missing_match_arms", AssistKind::QuickFix), "Fill match arms", - available_range, + target_range, |builder| { let new_match_arm_list = match_arm_list.clone_for_update(); let missing_arms = missing_pats @@ -186,6 +192,14 @@ pub(crate) fn add_missing_match_arms(acc: &mut Assists, ctx: &AssistContext) -> ) } +fn cursor_inside_simple_match_arm_list(ctx: &AssistContext, match_expr : &MatchExpr, match_arm_list : &MatchArmList) -> bool { + // println!("---\n{:#?}\n{:#?}\n---", match_expr, match_arm_list); + if match_arm_list.arms().next() == None { + return true; + } + false +} + fn is_variant_missing(existing_pats: &[Pat], var: &Pat) -> bool { !existing_pats.iter().any(|pat| does_pat_match_variant(pat, var)) } @@ -320,10 +334,7 @@ fn main() { check_assist_not_applicable( add_missing_match_arms, r#" -enum A { - X, - Y -} +enum A { X, Y } fn foo(a: A) { $0 match a { @@ -339,10 +350,7 @@ fn foo(a: A) { check_assist_not_applicable( add_missing_match_arms, r#" -enum A { - X, - Y -} +enum A { X, Y } fn foo(a: A) { match a {$0 @@ -637,7 +645,7 @@ enum A { As, Bs, Cs(String), Ds(String, String), Es { x: usize, y: usize } } fn main() { let a = A::As; - match a$0 {} + match a {$0} } "#, r#" @@ -900,7 +908,7 @@ fn foo(a: &mut A) { } #[test] - fn add_missing_match_arms_target() { + fn add_missing_match_arms_target_simple() { check_assist_target( add_missing_match_arms, r#" @@ -910,6 +918,23 @@ fn main() { match E::X$0 {} } "#, + "match E::X {}", + ); + } + + #[test] + fn add_missing_match_arms_target_complex() { + check_assist_target( + add_missing_match_arms, + r#" +enum E { X, Y } + +fn main() { + match E::X$0 { + E::X => {} + } +} +"#, "match E::X ", ); } @@ -922,8 +947,8 @@ fn main() { enum E { X, Y } fn main() { - match E::X $0 { - _ => {} + match E::X { + $0_ => {} } } "#, @@ -931,7 +956,7 @@ fn main() { enum E { X, Y } fn main() { - match E::X { + match E::X { $0E::X => todo!(), E::Y => todo!(), } |
