From 30d6419bc90b8c1f34b0965cb14969ce626c26a1 Mon Sep 17 00:00:00 2001 From: Aleksey Kladov Date: Mon, 5 Apr 2021 14:36:27 +0300 Subject: fix: extract variable works in guards closes #8336 --- .../ide_assists/src/handlers/extract_variable.rs | 73 ++++++++++++++++------ 1 file changed, 55 insertions(+), 18 deletions(-) (limited to 'crates/ide_assists') diff --git a/crates/ide_assists/src/handlers/extract_variable.rs b/crates/ide_assists/src/handlers/extract_variable.rs index 7a32483dc..136b9a55b 100644 --- a/crates/ide_assists/src/handlers/extract_variable.rs +++ b/crates/ide_assists/src/handlers/extract_variable.rs @@ -2,7 +2,8 @@ use stdx::format_to; use syntax::{ ast::{self, AstNode}, SyntaxKind::{ - BLOCK_EXPR, BREAK_EXPR, CLOSURE_EXPR, COMMENT, LOOP_EXPR, MATCH_ARM, PATH_EXPR, RETURN_EXPR, + BLOCK_EXPR, BREAK_EXPR, CLOSURE_EXPR, COMMENT, LOOP_EXPR, MATCH_ARM, MATCH_GUARD, + PATH_EXPR, RETURN_EXPR, }, SyntaxNode, }; @@ -147,9 +148,18 @@ impl Anchor { } if let Some(parent) = node.parent() { - if parent.kind() == MATCH_ARM || parent.kind() == CLOSURE_EXPR { + if parent.kind() == CLOSURE_EXPR { + cov_mark::hit!(test_extract_var_in_closure_no_block); return Some(Anchor::WrapInBlock(node)); } + if parent.kind() == MATCH_ARM { + if node.kind() == MATCH_GUARD { + cov_mark::hit!(test_extract_var_in_match_guard); + } else { + cov_mark::hit!(test_extract_var_in_match_arm_no_block); + return Some(Anchor::WrapInBlock(node)); + } + } } if let Some(stmt) = ast::Stmt::cast(node.clone()) { @@ -280,9 +290,10 @@ fn foo() { #[test] fn test_extract_var_in_match_arm_no_block() { + cov_mark::check!(test_extract_var_in_match_arm_no_block); check_assist( extract_variable, - " + r#" fn main() { let x = true; let tuple = match x { @@ -290,8 +301,8 @@ fn main() { _ => (0, false) }; } -", - " +"#, + r#" fn main() { let x = true; let tuple = match x { @@ -299,7 +310,7 @@ fn main() { _ => (0, false) }; } -", +"#, ); } @@ -307,7 +318,7 @@ fn main() { fn test_extract_var_in_match_arm_with_block() { check_assist( extract_variable, - " + r#" fn main() { let x = true; let tuple = match x { @@ -318,8 +329,8 @@ fn main() { _ => (0, false) }; } -", - " +"#, + r#" fn main() { let x = true; let tuple = match x { @@ -331,24 +342,50 @@ fn main() { _ => (0, false) }; } -", +"#, + ); + } + + #[test] + fn test_extract_var_in_match_guard() { + cov_mark::check!(test_extract_var_in_match_guard); + check_assist( + extract_variable, + r#" +fn main() { + match () { + () if $010 > 0$0 => 1 + _ => 2 + }; +} +"#, + r#" +fn main() { + let $0var_name = 10 > 0; + match () { + () if var_name => 1 + _ => 2 + }; +} +"#, ); } #[test] fn test_extract_var_in_closure_no_block() { + cov_mark::check!(test_extract_var_in_closure_no_block); check_assist( extract_variable, - " + r#" fn main() { let lambda = |x: u32| $0x * 2$0; } -", - " +"#, + r#" fn main() { let lambda = |x: u32| { let $0var_name = x * 2; var_name }; } -", +"#, ); } @@ -356,16 +393,16 @@ fn main() { fn test_extract_var_in_closure_with_block() { check_assist( extract_variable, - " + r#" fn main() { let lambda = |x: u32| { $0x * 2$0 }; } -", - " +"#, + r#" fn main() { let lambda = |x: u32| { let $0var_name = x * 2; var_name }; } -", +"#, ); } -- cgit v1.2.3