Skip to content

Commit d8ee25b

Browse files
bors[bot]matklad
andauthored
Merge #8339
8339: fix: extract variable works in guards r=matklad a=matklad bors r+ 🤖 Co-authored-by: Aleksey Kladov <[email protected]>
2 parents 4a589b1 + 30d6419 commit d8ee25b

File tree

1 file changed

+55
-18
lines changed

1 file changed

+55
-18
lines changed

crates/ide_assists/src/handlers/extract_variable.rs

Lines changed: 55 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,8 @@ use stdx::format_to;
22
use syntax::{
33
ast::{self, AstNode},
44
SyntaxKind::{
5-
BLOCK_EXPR, BREAK_EXPR, CLOSURE_EXPR, COMMENT, LOOP_EXPR, MATCH_ARM, PATH_EXPR, RETURN_EXPR,
5+
BLOCK_EXPR, BREAK_EXPR, CLOSURE_EXPR, COMMENT, LOOP_EXPR, MATCH_ARM, MATCH_GUARD,
6+
PATH_EXPR, RETURN_EXPR,
67
},
78
SyntaxNode,
89
};
@@ -147,9 +148,18 @@ impl Anchor {
147148
}
148149

149150
if let Some(parent) = node.parent() {
150-
if parent.kind() == MATCH_ARM || parent.kind() == CLOSURE_EXPR {
151+
if parent.kind() == CLOSURE_EXPR {
152+
cov_mark::hit!(test_extract_var_in_closure_no_block);
151153
return Some(Anchor::WrapInBlock(node));
152154
}
155+
if parent.kind() == MATCH_ARM {
156+
if node.kind() == MATCH_GUARD {
157+
cov_mark::hit!(test_extract_var_in_match_guard);
158+
} else {
159+
cov_mark::hit!(test_extract_var_in_match_arm_no_block);
160+
return Some(Anchor::WrapInBlock(node));
161+
}
162+
}
153163
}
154164

155165
if let Some(stmt) = ast::Stmt::cast(node.clone()) {
@@ -280,34 +290,35 @@ fn foo() {
280290

281291
#[test]
282292
fn test_extract_var_in_match_arm_no_block() {
293+
cov_mark::check!(test_extract_var_in_match_arm_no_block);
283294
check_assist(
284295
extract_variable,
285-
"
296+
r#"
286297
fn main() {
287298
let x = true;
288299
let tuple = match x {
289300
true => ($02 + 2$0, true)
290301
_ => (0, false)
291302
};
292303
}
293-
",
294-
"
304+
"#,
305+
r#"
295306
fn main() {
296307
let x = true;
297308
let tuple = match x {
298309
true => { let $0var_name = 2 + 2; (var_name, true) }
299310
_ => (0, false)
300311
};
301312
}
302-
",
313+
"#,
303314
);
304315
}
305316

306317
#[test]
307318
fn test_extract_var_in_match_arm_with_block() {
308319
check_assist(
309320
extract_variable,
310-
"
321+
r#"
311322
fn main() {
312323
let x = true;
313324
let tuple = match x {
@@ -318,8 +329,8 @@ fn main() {
318329
_ => (0, false)
319330
};
320331
}
321-
",
322-
"
332+
"#,
333+
r#"
323334
fn main() {
324335
let x = true;
325336
let tuple = match x {
@@ -331,41 +342,67 @@ fn main() {
331342
_ => (0, false)
332343
};
333344
}
334-
",
345+
"#,
346+
);
347+
}
348+
349+
#[test]
350+
fn test_extract_var_in_match_guard() {
351+
cov_mark::check!(test_extract_var_in_match_guard);
352+
check_assist(
353+
extract_variable,
354+
r#"
355+
fn main() {
356+
match () {
357+
() if $010 > 0$0 => 1
358+
_ => 2
359+
};
360+
}
361+
"#,
362+
r#"
363+
fn main() {
364+
let $0var_name = 10 > 0;
365+
match () {
366+
() if var_name => 1
367+
_ => 2
368+
};
369+
}
370+
"#,
335371
);
336372
}
337373

338374
#[test]
339375
fn test_extract_var_in_closure_no_block() {
376+
cov_mark::check!(test_extract_var_in_closure_no_block);
340377
check_assist(
341378
extract_variable,
342-
"
379+
r#"
343380
fn main() {
344381
let lambda = |x: u32| $0x * 2$0;
345382
}
346-
",
347-
"
383+
"#,
384+
r#"
348385
fn main() {
349386
let lambda = |x: u32| { let $0var_name = x * 2; var_name };
350387
}
351-
",
388+
"#,
352389
);
353390
}
354391

355392
#[test]
356393
fn test_extract_var_in_closure_with_block() {
357394
check_assist(
358395
extract_variable,
359-
"
396+
r#"
360397
fn main() {
361398
let lambda = |x: u32| { $0x * 2$0 };
362399
}
363-
",
364-
"
400+
"#,
401+
r#"
365402
fn main() {
366403
let lambda = |x: u32| { let $0var_name = x * 2; var_name };
367404
}
368-
",
405+
"#,
369406
);
370407
}
371408

0 commit comments

Comments
 (0)