From a17a132617dd484b13196a1e70ef87a0b762d3ed Mon Sep 17 00:00:00 2001 From: Anton Firszov Date: Thu, 14 Oct 2021 18:15:00 +0200 Subject: [PATCH 01/13] Narrow add_missing_match_arms assist range --- .../src/handlers/add_missing_match_arms.rs | 52 ++++++++++++++++++- 1 file changed, 50 insertions(+), 2 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 c856ab45d7b..1ad5daeff07 100644 --- a/crates/ide_assists/src/handlers/add_missing_match_arms.rs +++ b/crates/ide_assists/src/handlers/add_missing_match_arms.rs @@ -5,6 +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::TextRange; use syntax::ast::{self, make, AstNode, HasName, MatchArm, Pat}; use crate::{ @@ -40,6 +41,16 @@ pub(crate) fn add_missing_match_arms(acc: &mut Assists, ctx: &AssistContext) -> let match_expr = ctx.find_node_at_offset_with_descend::()?; let match_arm_list = match_expr.match_arm_list()?; + let available_range = TextRange::new( + match_expr.syntax().text_range().start(), + match_arm_list.syntax().text_range().start(), + ); + + let cursor_in_range = available_range.contains_range(ctx.frange.range); + if !cursor_in_range { + return None; + } + let expr = match_expr.expr()?; let mut arms: Vec = match_arm_list.arms().collect(); @@ -121,11 +132,10 @@ pub(crate) fn add_missing_match_arms(acc: &mut Assists, ctx: &AssistContext) -> return None; } - let target = ctx.sema.original_range(match_expr.syntax()).range; acc.add( AssistId("add_missing_match_arms", AssistKind::QuickFix), "Fill match arms", - target, + available_range, |builder| { let new_match_arm_list = match_arm_list.clone_for_update(); let missing_arms = missing_pats @@ -306,6 +316,44 @@ fn main() { ); } + #[test] + fn not_applicable_outside_of_range_left() { + check_assist_not_applicable( + add_missing_match_arms, + r#" +enum A { + X, + Y +} + +fn foo(a: A) { + $0match a { + A::X => { } + } +} + "#, + ); + } + + #[test] + fn not_applicable_outside_of_range_right() { + check_assist_not_applicable( + add_missing_match_arms, + r#" +enum A { + X, + Y +} + +fn foo(a: A) { + match a {$0 + A::X => { } + } +} + "#, + ); + } + #[test] fn all_boolean_match_arms_provided() { check_assist_not_applicable( From fb47a65ab2c1b8d0b541f995cfb44c05c4b4b5f0 Mon Sep 17 00:00:00 2001 From: Anton Firszov Date: Thu, 14 Oct 2021 19:31:27 +0200 Subject: [PATCH 02/13] apply necessary test changes --- .../src/handlers/add_missing_match_arms.rs | 30 +++++++++---------- 1 file changed, 14 insertions(+), 16 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 1ad5daeff07..8cb3e8fe423 100644 --- a/crates/ide_assists/src/handlers/add_missing_match_arms.rs +++ b/crates/ide_assists/src/handlers/add_missing_match_arms.rs @@ -21,8 +21,7 @@ use crate::{ // enum Action { Move { distance: u32 }, Stop } // // fn handle(action: Action) { -// match action { -// $0 +// match action $0 { // } // } // ``` @@ -327,7 +326,7 @@ enum A { } fn foo(a: A) { - $0match a { + $0 match a { A::X => { } } } @@ -911,7 +910,7 @@ fn main() { match E::X$0 {} } "#, - "match E::X {}", + "match E::X ", ); } @@ -923,8 +922,8 @@ fn main() { enum E { X, Y } fn main() { - match E::X { - $0_ => {} + match E::X $0 { + _ => {} } } "#, @@ -932,7 +931,7 @@ fn main() { enum E { X, Y } fn main() { - match E::X { + match E::X { $0E::X => todo!(), E::Y => todo!(), } @@ -950,8 +949,7 @@ mod foo { pub enum E { X, Y } } use foo::E::X; fn main() { - match X { - $0 + match X $0 { } } "#, @@ -960,7 +958,7 @@ mod foo { pub enum E { X, Y } } use foo::E::X; fn main() { - match X { + match X { $0X => todo!(), foo::E::Y => todo!(), } @@ -976,8 +974,8 @@ fn main() { r#" enum A { One, Two } fn foo(a: A) { - match a { - // foo bar baz$0 + match a $0 { + // foo bar baz A::One => {} // This is where the rest should be } @@ -986,7 +984,7 @@ fn foo(a: A) { r#" enum A { One, Two } fn foo(a: A) { - match a { + match a { // foo bar baz A::One => {} $0A::Two => todo!(), @@ -1004,15 +1002,15 @@ fn foo(a: A) { r#" enum A { One, Two } fn foo(a: A) { - match a { - // foo bar baz$0 + match a $0 { + // foo bar baz } } "#, r#" enum A { One, Two } fn foo(a: A) { - match a { + match a { $0A::One => todo!(), A::Two => todo!(), // foo bar baz From 8cca6242f85f74b67979e7a9a4981c1c76e8b880 Mon Sep 17 00:00:00 2001 From: Anton Firszov Date: Thu, 14 Oct 2021 20:31:33 +0200 Subject: [PATCH 03/13] make it work from macro --- crates/ide_assists/src/handlers/add_missing_match_arms.rs | 6 +++--- 1 file changed, 3 insertions(+), 3 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 8cb3e8fe423..0cfe63a1829 100644 --- a/crates/ide_assists/src/handlers/add_missing_match_arms.rs +++ b/crates/ide_assists/src/handlers/add_missing_match_arms.rs @@ -30,7 +30,7 @@ use crate::{ // enum Action { Move { distance: u32 }, Stop } // // fn handle(action: Action) { -// match action { +// match action { // $0Action::Move { distance } => todo!(), // Action::Stop => todo!(), // } @@ -41,8 +41,8 @@ pub(crate) fn add_missing_match_arms(acc: &mut Assists, ctx: &AssistContext) -> let match_arm_list = match_expr.match_arm_list()?; let available_range = TextRange::new( - match_expr.syntax().text_range().start(), - match_arm_list.syntax().text_range().start(), + 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.frange.range); From 01e302252123b41b52ed37f4385cd80a1ab8e068 Mon Sep 17 00:00:00 2001 From: Anton Firszov Date: Thu, 14 Oct 2021 20:35:59 +0200 Subject: [PATCH 04/13] update generated.rs --- crates/ide_assists/src/tests/generated.rs | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/crates/ide_assists/src/tests/generated.rs b/crates/ide_assists/src/tests/generated.rs index 62c44d70e46..633412b9196 100644 --- a/crates/ide_assists/src/tests/generated.rs +++ b/crates/ide_assists/src/tests/generated.rs @@ -129,8 +129,7 @@ fn doctest_add_missing_match_arms() { enum Action { Move { distance: u32 }, Stop } fn handle(action: Action) { - match action { - $0 + match action $0 { } } "#####, @@ -138,7 +137,7 @@ fn handle(action: Action) { enum Action { Move { distance: u32 }, Stop } fn handle(action: Action) { - match action { + match action { $0Action::Move { distance } => todo!(), Action::Stop => todo!(), } From 0a8a56b77aa3a8920e9035bd482489a652372d3b Mon Sep 17 00:00:00 2001 From: Anton Firszov Date: Thu, 14 Oct 2021 20:38:06 +0200 Subject: [PATCH 05/13] apply formatting recommendations --- crates/ide_assists/src/handlers/add_missing_match_arms.rs | 6 +++--- 1 file changed, 3 insertions(+), 3 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 0cfe63a1829..1c9df119028 100644 --- a/crates/ide_assists/src/handlers/add_missing_match_arms.rs +++ b/crates/ide_assists/src/handlers/add_missing_match_arms.rs @@ -5,8 +5,8 @@ use hir::{Adt, HasSource, ModuleDef, Semantics}; use ide_db::helpers::{mod_path_to_ast, FamousDefs}; use ide_db::RootDatabase; use itertools::Itertools; -use syntax::TextRange; use syntax::ast::{self, make, AstNode, HasName, MatchArm, Pat}; +use syntax::TextRange; use crate::{ utils::{self, render_snippet, Cursor}, @@ -319,7 +319,7 @@ fn main() { fn not_applicable_outside_of_range_left() { check_assist_not_applicable( add_missing_match_arms, - r#" + r#" enum A { X, Y @@ -338,7 +338,7 @@ fn foo(a: A) { fn not_applicable_outside_of_range_right() { check_assist_not_applicable( add_missing_match_arms, - r#" + r#" enum A { X, Y From 68a50150d674dc9736e07e7befa46827d2323d63 Mon Sep 17 00:00:00 2001 From: Anton Firszov Date: Thu, 14 Oct 2021 20:45:10 +0200 Subject: [PATCH 06/13] use ctx.selection_trimmed() instead of ctx.frange.range --- crates/ide_assists/src/handlers/add_missing_match_arms.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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 1c9df119028..e106719f363 100644 --- a/crates/ide_assists/src/handlers/add_missing_match_arms.rs +++ b/crates/ide_assists/src/handlers/add_missing_match_arms.rs @@ -45,7 +45,7 @@ pub(crate) fn add_missing_match_arms(acc: &mut Assists, ctx: &AssistContext) -> ctx.sema.original_range(match_arm_list.syntax()).range.start(), ); - let cursor_in_range = available_range.contains_range(ctx.frange.range); + let cursor_in_range = available_range.contains_range(ctx.selection_trimmed()); if !cursor_in_range { return None; } From 1e303cc03530e265ad22c7885c28915a86ea85d4 Mon Sep 17 00:00:00 2001 From: Anton Firszov Date: Fri, 15 Oct 2021 12:15:52 +0200 Subject: [PATCH 07/13] cursor_inside_simple_match_arm_list -- tests --- .../src/handlers/add_missing_match_arms.rs | 69 +++++++++++++------ 1 file 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::()?; 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#" @@ -909,6 +917,23 @@ enum E { X, Y } 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!(), } From 4e16cfbdf42c901476f82a9e8c77620037e76e92 Mon Sep 17 00:00:00 2001 From: Anton Firszov Date: Fri, 15 Oct 2021 13:19:46 +0200 Subject: [PATCH 08/13] simple implementation --- .../src/handlers/add_missing_match_arms.rs | 18 +++++++++++++----- 1 file changed, 13 insertions(+), 5 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 7c67c596159..675fbef20fb 100644 --- a/crates/ide_assists/src/handlers/add_missing_match_arms.rs +++ b/crates/ide_assists/src/handlers/add_missing_match_arms.rs @@ -41,7 +41,7 @@ pub(crate) fn add_missing_match_arms(acc: &mut Assists, ctx: &AssistContext) -> let match_arm_list = match_expr.match_arm_list()?; let target_range : TextRange; - if !cursor_inside_simple_match_arm_list(&ctx, &match_expr, &match_arm_list) { + if let None = 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(), @@ -192,12 +192,20 @@ 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); +fn cursor_inside_simple_match_arm_list(ctx: &AssistContext, match_expr : &MatchExpr, match_arm_list : &MatchArmList) -> Option<()> { + println!("---\n{:#?}\n{:#?}\n---", match_expr, match_arm_list); if match_arm_list.arms().next() == None { - return true; + return Some(()); } - false + + let wild_pat = ctx.find_node_at_offset_with_descend::()?; + let arm = wild_pat.syntax().parent().and_then(ast::MatchArm::cast)?; + let arm_match_expr = arm.syntax().ancestors().nth(2).and_then(ast::MatchExpr::cast)?; + if arm_match_expr == *match_expr { + return Some(()) + } + + None } fn is_variant_missing(existing_pats: &[Pat], var: &Pat) -> bool { From a01a4bae1828b35871c46a936c969bff5c708d18 Mon Sep 17 00:00:00 2001 From: Anton Firszov Date: Fri, 15 Oct 2021 14:14:21 +0200 Subject: [PATCH 09/13] fix sample + cosmetics + one more test --- .../src/handlers/add_missing_match_arms.rs | 32 ++++++++++++++++--- 1 file changed, 27 insertions(+), 5 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 675fbef20fb..c366832ebbf 100644 --- a/crates/ide_assists/src/handlers/add_missing_match_arms.rs +++ b/crates/ide_assists/src/handlers/add_missing_match_arms.rs @@ -21,7 +21,8 @@ use crate::{ // enum Action { Move { distance: u32 }, Stop } // // fn handle(action: Action) { -// match action $0 { +// match action { +// $0 // } // } // ``` @@ -30,7 +31,7 @@ use crate::{ // enum Action { Move { distance: u32 }, Stop } // // fn handle(action: Action) { -// match action { +// match action { // $0Action::Move { distance } => todo!(), // Action::Stop => todo!(), // } @@ -41,7 +42,7 @@ pub(crate) fn add_missing_match_arms(acc: &mut Assists, ctx: &AssistContext) -> let match_arm_list = match_expr.match_arm_list()?; let target_range : TextRange; - if let None = cursor_inside_simple_match_arm_list(&ctx, &match_expr, &match_arm_list) { + if let None = trivial_match_arm_list_at_cursor(&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(), @@ -192,12 +193,13 @@ 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) -> Option<()> { - println!("---\n{:#?}\n{:#?}\n---", match_expr, match_arm_list); +fn trivial_match_arm_list_at_cursor(ctx: &AssistContext, match_expr : &MatchExpr, match_arm_list : &MatchArmList) -> Option<()> { + // match x { $0 } if match_arm_list.arms().next() == None { return Some(()); } + // match { _$0 => {...} } let wild_pat = ctx.find_node_at_offset_with_descend::()?; let arm = wild_pat.syntax().parent().and_then(ast::MatchArm::cast)?; let arm_match_expr = arm.syntax().ancestors().nth(2).and_then(ast::MatchExpr::cast)?; @@ -973,6 +975,26 @@ fn main() { ); } + + #[test] + fn wildcard_inside_expression_not_applicable() { + check_assist_not_applicable( + add_missing_match_arms, + r#" +enum E { X, Y } + +fn foo(e : E) { + match e { + _ => { + println!("1");$0 + println!("2"); + } + } +} +"#, + ); + } + #[test] fn add_missing_match_arms_qualifies_path() { check_assist( From e25b20e48d42f49f027f458d695a4176b2c104a2 Mon Sep 17 00:00:00 2001 From: Anton Firszov Date: Fri, 15 Oct 2021 14:30:38 +0200 Subject: [PATCH 10/13] update generated.rs --- crates/ide_assists/src/tests/generated.rs | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/crates/ide_assists/src/tests/generated.rs b/crates/ide_assists/src/tests/generated.rs index 633412b9196..62c44d70e46 100644 --- a/crates/ide_assists/src/tests/generated.rs +++ b/crates/ide_assists/src/tests/generated.rs @@ -129,7 +129,8 @@ fn doctest_add_missing_match_arms() { enum Action { Move { distance: u32 }, Stop } fn handle(action: Action) { - match action $0 { + match action { + $0 } } "#####, @@ -137,7 +138,7 @@ fn handle(action: Action) { enum Action { Move { distance: u32 }, Stop } fn handle(action: Action) { - match action { + match action { $0Action::Move { distance } => todo!(), Action::Stop => todo!(), } From cc6eee1b609db61935466a857ae6e577c359d0dc Mon Sep 17 00:00:00 2001 From: Anton Firszov Date: Fri, 15 Oct 2021 14:36:37 +0200 Subject: [PATCH 11/13] cosmetics --- .../src/handlers/add_missing_match_arms.rs | 18 ++++++++++-------- 1 file changed, 10 insertions(+), 8 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 c366832ebbf..6dc438063d9 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, AstNode, HasName, MatchArm, MatchArmList, MatchExpr, Pat, make}; +use syntax::ast::{self, make, AstNode, HasName, MatchArm, MatchArmList, MatchExpr, Pat}; use syntax::TextRange; use crate::{ @@ -40,9 +40,9 @@ 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::()?; let match_arm_list = match_expr.match_arm_list()?; - let target_range : TextRange; + let target_range: TextRange; - if let None = trivial_match_arm_list_at_cursor(&ctx, &match_expr, &match_arm_list) { + if let None = cursor_at_trivial_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(), @@ -52,8 +52,7 @@ pub(crate) fn add_missing_match_arms(acc: &mut Assists, ctx: &AssistContext) -> if !cursor_in_range { return None; } - } - else { + } else { target_range = ctx.sema.original_range(match_expr.syntax()).range; } @@ -193,7 +192,11 @@ pub(crate) fn add_missing_match_arms(acc: &mut Assists, ctx: &AssistContext) -> ) } -fn trivial_match_arm_list_at_cursor(ctx: &AssistContext, match_expr : &MatchExpr, match_arm_list : &MatchArmList) -> Option<()> { +fn cursor_at_trivial_match_arm_list( + ctx: &AssistContext, + match_expr: &MatchExpr, + match_arm_list: &MatchArmList, +) -> Option<()> { // match x { $0 } if match_arm_list.arms().next() == None { return Some(()); @@ -204,7 +207,7 @@ fn trivial_match_arm_list_at_cursor(ctx: &AssistContext, match_expr : &MatchExpr let arm = wild_pat.syntax().parent().and_then(ast::MatchArm::cast)?; let arm_match_expr = arm.syntax().ancestors().nth(2).and_then(ast::MatchExpr::cast)?; if arm_match_expr == *match_expr { - return Some(()) + return Some(()); } None @@ -975,7 +978,6 @@ fn main() { ); } - #[test] fn wildcard_inside_expression_not_applicable() { check_assist_not_applicable( From 1c0eed5f9745b7d1b7a3fa672bf9a179a81866dc Mon Sep 17 00:00:00 2001 From: Anton Firszov Date: Fri, 15 Oct 2021 14:45:11 +0200 Subject: [PATCH 12/13] undo unnecessary test changes --- .../src/handlers/add_missing_match_arms.rs | 11 ++++++----- 1 file changed, 6 insertions(+), 5 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 6dc438063d9..b4a167ea5ff 100644 --- a/crates/ide_assists/src/handlers/add_missing_match_arms.rs +++ b/crates/ide_assists/src/handlers/add_missing_match_arms.rs @@ -1006,7 +1006,8 @@ mod foo { pub enum E { X, Y } } use foo::E::X; fn main() { - match X $0 { + match X { + $0 } } "#, @@ -1015,7 +1016,7 @@ mod foo { pub enum E { X, Y } } use foo::E::X; fn main() { - match X { + match X { $0X => todo!(), foo::E::Y => todo!(), } @@ -1059,15 +1060,15 @@ fn foo(a: A) { r#" enum A { One, Two } fn foo(a: A) { - match a $0 { - // foo bar baz + match a { + // foo bar baz$0 } } "#, r#" enum A { One, Two } fn foo(a: A) { - match a { + match a { $0A::One => todo!(), A::Two => todo!(), // foo bar baz From 3d9ce6b6cee657f9625c24cde78dc17a413d3559 Mon Sep 17 00:00:00 2001 From: Anton Firszov Date: Fri, 15 Oct 2021 17:53:01 +0200 Subject: [PATCH 13/13] cov_mark for add_missing_match_arms special cases --- crates/ide_assists/src/handlers/add_missing_match_arms.rs | 6 ++++++ 1 file changed, 6 insertions(+) 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 b4a167ea5ff..4573a609893 100644 --- a/crates/ide_assists/src/handlers/add_missing_match_arms.rs +++ b/crates/ide_assists/src/handlers/add_missing_match_arms.rs @@ -50,6 +50,7 @@ pub(crate) fn add_missing_match_arms(acc: &mut Assists, ctx: &AssistContext) -> let cursor_in_range = target_range.contains_range(ctx.selection_trimmed()); if !cursor_in_range { + cov_mark::hit!(not_applicable_outside_of_range_right); return None; } } else { @@ -199,6 +200,7 @@ fn cursor_at_trivial_match_arm_list( ) -> Option<()> { // match x { $0 } if match_arm_list.arms().next() == None { + cov_mark::hit!(add_missing_match_arms_empty_body); return Some(()); } @@ -207,6 +209,7 @@ fn cursor_at_trivial_match_arm_list( let arm = wild_pat.syntax().parent().and_then(ast::MatchArm::cast)?; let arm_match_expr = arm.syntax().ancestors().nth(2).and_then(ast::MatchExpr::cast)?; if arm_match_expr == *match_expr { + cov_mark::hit!(add_missing_match_arms_trivial_arm); return Some(()); } @@ -360,6 +363,7 @@ fn foo(a: A) { #[test] fn not_applicable_outside_of_range_right() { + cov_mark::check!(not_applicable_outside_of_range_right); check_assist_not_applicable( add_missing_match_arms, r#" @@ -651,6 +655,7 @@ fn main() { #[test] fn add_missing_match_arms_empty_body() { + cov_mark::check!(add_missing_match_arms_empty_body); check_assist( add_missing_match_arms, r#" @@ -954,6 +959,7 @@ fn main() { #[test] fn add_missing_match_arms_trivial_arm() { + cov_mark::check!(add_missing_match_arms_trivial_arm); check_assist( add_missing_match_arms, r#"