diff options
Diffstat (limited to 'crates/assists/src/handlers/inline_local_variable.rs')
-rw-r--r-- | crates/assists/src/handlers/inline_local_variable.rs | 155 |
1 files changed, 78 insertions, 77 deletions
diff --git a/crates/assists/src/handlers/inline_local_variable.rs b/crates/assists/src/handlers/inline_local_variable.rs index 587eb5feb..dc798daaa 100644 --- a/crates/assists/src/handlers/inline_local_variable.rs +++ b/crates/assists/src/handlers/inline_local_variable.rs | |||
@@ -1,4 +1,7 @@ | |||
1 | use ide_db::{defs::Definition, search::ReferenceKind}; | 1 | use ide_db::{ |
2 | defs::Definition, | ||
3 | search::{FileReference, ReferenceKind}, | ||
4 | }; | ||
2 | use syntax::{ | 5 | use syntax::{ |
3 | ast::{self, AstNode, AstToken}, | 6 | ast::{self, AstNode, AstToken}, |
4 | TextRange, | 7 | TextRange, |
@@ -16,7 +19,7 @@ use crate::{ | |||
16 | // | 19 | // |
17 | // ``` | 20 | // ``` |
18 | // fn main() { | 21 | // fn main() { |
19 | // let x<|> = 1 + 2; | 22 | // let x$0 = 1 + 2; |
20 | // x * 4; | 23 | // x * 4; |
21 | // } | 24 | // } |
22 | // ``` | 25 | // ``` |
@@ -44,8 +47,8 @@ pub(crate) fn inline_local_variable(acc: &mut Assists, ctx: &AssistContext) -> O | |||
44 | 47 | ||
45 | let def = ctx.sema.to_def(&bind_pat)?; | 48 | let def = ctx.sema.to_def(&bind_pat)?; |
46 | let def = Definition::Local(def); | 49 | let def = Definition::Local(def); |
47 | let refs = def.usages(&ctx.sema).all(); | 50 | let usages = def.usages(&ctx.sema).all(); |
48 | if refs.is_empty() { | 51 | if usages.is_empty() { |
49 | mark::hit!(test_not_applicable_if_variable_unused); | 52 | mark::hit!(test_not_applicable_if_variable_unused); |
50 | return None; | 53 | return None; |
51 | }; | 54 | }; |
@@ -63,48 +66,45 @@ pub(crate) fn inline_local_variable(acc: &mut Assists, ctx: &AssistContext) -> O | |||
63 | let_stmt.syntax().text_range() | 66 | let_stmt.syntax().text_range() |
64 | }; | 67 | }; |
65 | 68 | ||
66 | let mut wrap_in_parens = vec![true; refs.len()]; | 69 | let wrap_in_parens = usages |
67 | 70 | .references | |
68 | for (i, desc) in refs.iter().enumerate() { | 71 | .values() |
69 | let usage_node = ctx | 72 | .flatten() |
70 | .covering_node_for_range(desc.file_range.range) | 73 | .map(|&FileReference { range, .. }| { |
71 | .ancestors() | 74 | let usage_node = |
72 | .find_map(ast::PathExpr::cast)?; | 75 | ctx.covering_node_for_range(range).ancestors().find_map(ast::PathExpr::cast)?; |
73 | let usage_parent_option = usage_node.syntax().parent().and_then(ast::Expr::cast); | 76 | let usage_parent_option = usage_node.syntax().parent().and_then(ast::Expr::cast); |
74 | let usage_parent = match usage_parent_option { | 77 | let usage_parent = match usage_parent_option { |
75 | Some(u) => u, | 78 | Some(u) => u, |
76 | None => { | 79 | None => return Ok(false), |
77 | wrap_in_parens[i] = false; | 80 | }; |
78 | continue; | 81 | |
79 | } | 82 | Ok(!matches!((&initializer_expr, usage_parent), |
80 | }; | 83 | (ast::Expr::CallExpr(_), _) |
81 | 84 | | (ast::Expr::IndexExpr(_), _) | |
82 | wrap_in_parens[i] = match (&initializer_expr, usage_parent) { | 85 | | (ast::Expr::MethodCallExpr(_), _) |
83 | (ast::Expr::CallExpr(_), _) | 86 | | (ast::Expr::FieldExpr(_), _) |
84 | | (ast::Expr::IndexExpr(_), _) | 87 | | (ast::Expr::TryExpr(_), _) |
85 | | (ast::Expr::MethodCallExpr(_), _) | 88 | | (ast::Expr::RefExpr(_), _) |
86 | | (ast::Expr::FieldExpr(_), _) | 89 | | (ast::Expr::Literal(_), _) |
87 | | (ast::Expr::TryExpr(_), _) | 90 | | (ast::Expr::TupleExpr(_), _) |
88 | | (ast::Expr::RefExpr(_), _) | 91 | | (ast::Expr::ArrayExpr(_), _) |
89 | | (ast::Expr::Literal(_), _) | 92 | | (ast::Expr::ParenExpr(_), _) |
90 | | (ast::Expr::TupleExpr(_), _) | 93 | | (ast::Expr::PathExpr(_), _) |
91 | | (ast::Expr::ArrayExpr(_), _) | 94 | | (ast::Expr::BlockExpr(_), _) |
92 | | (ast::Expr::ParenExpr(_), _) | 95 | | (ast::Expr::EffectExpr(_), _) |
93 | | (ast::Expr::PathExpr(_), _) | 96 | | (_, ast::Expr::CallExpr(_)) |
94 | | (ast::Expr::BlockExpr(_), _) | 97 | | (_, ast::Expr::TupleExpr(_)) |
95 | | (ast::Expr::EffectExpr(_), _) | 98 | | (_, ast::Expr::ArrayExpr(_)) |
96 | | (_, ast::Expr::CallExpr(_)) | 99 | | (_, ast::Expr::ParenExpr(_)) |
97 | | (_, ast::Expr::TupleExpr(_)) | 100 | | (_, ast::Expr::ForExpr(_)) |
98 | | (_, ast::Expr::ArrayExpr(_)) | 101 | | (_, ast::Expr::WhileExpr(_)) |
99 | | (_, ast::Expr::ParenExpr(_)) | 102 | | (_, ast::Expr::BreakExpr(_)) |
100 | | (_, ast::Expr::ForExpr(_)) | 103 | | (_, ast::Expr::ReturnExpr(_)) |
101 | | (_, ast::Expr::WhileExpr(_)) | 104 | | (_, ast::Expr::MatchExpr(_)) |
102 | | (_, ast::Expr::BreakExpr(_)) | 105 | )) |
103 | | (_, ast::Expr::ReturnExpr(_)) | 106 | }) |
104 | | (_, ast::Expr::MatchExpr(_)) => false, | 107 | .collect::<Result<Vec<_>, _>>()?; |
105 | _ => true, | ||
106 | }; | ||
107 | } | ||
108 | 108 | ||
109 | let init_str = initializer_expr.syntax().text().to_string(); | 109 | let init_str = initializer_expr.syntax().text().to_string(); |
110 | let init_in_paren = format!("({})", &init_str); | 110 | let init_in_paren = format!("({})", &init_str); |
@@ -116,15 +116,16 @@ pub(crate) fn inline_local_variable(acc: &mut Assists, ctx: &AssistContext) -> O | |||
116 | target, | 116 | target, |
117 | move |builder| { | 117 | move |builder| { |
118 | builder.delete(delete_range); | 118 | builder.delete(delete_range); |
119 | for (desc, should_wrap) in refs.iter().zip(wrap_in_parens) { | 119 | for (reference, should_wrap) in usages.references.values().flatten().zip(wrap_in_parens) |
120 | { | ||
120 | let replacement = | 121 | let replacement = |
121 | if should_wrap { init_in_paren.clone() } else { init_str.clone() }; | 122 | if should_wrap { init_in_paren.clone() } else { init_str.clone() }; |
122 | match desc.kind { | 123 | match reference.kind { |
123 | ReferenceKind::FieldShorthandForLocal => { | 124 | ReferenceKind::FieldShorthandForLocal => { |
124 | mark::hit!(inline_field_shorthand); | 125 | mark::hit!(inline_field_shorthand); |
125 | builder.insert(desc.file_range.range.end(), format!(": {}", replacement)) | 126 | builder.insert(reference.range.end(), format!(": {}", replacement)) |
126 | } | 127 | } |
127 | _ => builder.replace(desc.file_range.range, replacement), | 128 | _ => builder.replace(reference.range, replacement), |
128 | } | 129 | } |
129 | } | 130 | } |
130 | }, | 131 | }, |
@@ -146,7 +147,7 @@ mod tests { | |||
146 | r" | 147 | r" |
147 | fn bar(a: usize) {} | 148 | fn bar(a: usize) {} |
148 | fn foo() { | 149 | fn foo() { |
149 | let a<|> = 1; | 150 | let a$0 = 1; |
150 | a + 1; | 151 | a + 1; |
151 | if a > 10 { | 152 | if a > 10 { |
152 | } | 153 | } |
@@ -180,7 +181,7 @@ fn foo() { | |||
180 | r" | 181 | r" |
181 | fn bar(a: usize) {} | 182 | fn bar(a: usize) {} |
182 | fn foo() { | 183 | fn foo() { |
183 | let a<|> = 1 + 1; | 184 | let a$0 = 1 + 1; |
184 | a + 1; | 185 | a + 1; |
185 | if a > 10 { | 186 | if a > 10 { |
186 | } | 187 | } |
@@ -214,7 +215,7 @@ fn foo() { | |||
214 | r" | 215 | r" |
215 | fn bar(a: usize) {} | 216 | fn bar(a: usize) {} |
216 | fn foo() { | 217 | fn foo() { |
217 | let a<|> = bar(1); | 218 | let a$0 = bar(1); |
218 | a + 1; | 219 | a + 1; |
219 | if a > 10 { | 220 | if a > 10 { |
220 | } | 221 | } |
@@ -248,7 +249,7 @@ fn foo() { | |||
248 | r" | 249 | r" |
249 | fn bar(a: usize): usize { a } | 250 | fn bar(a: usize): usize { a } |
250 | fn foo() { | 251 | fn foo() { |
251 | let a<|> = bar(1) as u64; | 252 | let a$0 = bar(1) as u64; |
252 | a + 1; | 253 | a + 1; |
253 | if a > 10 { | 254 | if a > 10 { |
254 | } | 255 | } |
@@ -281,7 +282,7 @@ fn foo() { | |||
281 | inline_local_variable, | 282 | inline_local_variable, |
282 | r" | 283 | r" |
283 | fn foo() { | 284 | fn foo() { |
284 | let a<|> = { 10 + 1 }; | 285 | let a$0 = { 10 + 1 }; |
285 | a + 1; | 286 | a + 1; |
286 | if a > 10 { | 287 | if a > 10 { |
287 | } | 288 | } |
@@ -313,7 +314,7 @@ fn foo() { | |||
313 | inline_local_variable, | 314 | inline_local_variable, |
314 | r" | 315 | r" |
315 | fn foo() { | 316 | fn foo() { |
316 | let a<|> = ( 10 + 1 ); | 317 | let a$0 = ( 10 + 1 ); |
317 | a + 1; | 318 | a + 1; |
318 | if a > 10 { | 319 | if a > 10 { |
319 | } | 320 | } |
@@ -346,7 +347,7 @@ fn foo() { | |||
346 | inline_local_variable, | 347 | inline_local_variable, |
347 | r" | 348 | r" |
348 | fn foo() { | 349 | fn foo() { |
349 | let mut a<|> = 1 + 1; | 350 | let mut a$0 = 1 + 1; |
350 | a + 1; | 351 | a + 1; |
351 | }", | 352 | }", |
352 | ); | 353 | ); |
@@ -358,7 +359,7 @@ fn foo() { | |||
358 | inline_local_variable, | 359 | inline_local_variable, |
359 | r" | 360 | r" |
360 | fn foo() { | 361 | fn foo() { |
361 | let a<|> = bar(10 + 1); | 362 | let a$0 = bar(10 + 1); |
362 | let b = a * 10; | 363 | let b = a * 10; |
363 | let c = a as usize; | 364 | let c = a as usize; |
364 | }", | 365 | }", |
@@ -377,7 +378,7 @@ fn foo() { | |||
377 | r" | 378 | r" |
378 | fn foo() { | 379 | fn foo() { |
379 | let x = vec![1, 2, 3]; | 380 | let x = vec![1, 2, 3]; |
380 | let a<|> = x[0]; | 381 | let a$0 = x[0]; |
381 | let b = a * 10; | 382 | let b = a * 10; |
382 | let c = a as usize; | 383 | let c = a as usize; |
383 | }", | 384 | }", |
@@ -397,7 +398,7 @@ fn foo() { | |||
397 | r" | 398 | r" |
398 | fn foo() { | 399 | fn foo() { |
399 | let bar = vec![1]; | 400 | let bar = vec![1]; |
400 | let a<|> = bar.len(); | 401 | let a$0 = bar.len(); |
401 | let b = a * 10; | 402 | let b = a * 10; |
402 | let c = a as usize; | 403 | let c = a as usize; |
403 | }", | 404 | }", |
@@ -421,7 +422,7 @@ struct Bar { | |||
421 | 422 | ||
422 | fn foo() { | 423 | fn foo() { |
423 | let bar = Bar { foo: 1 }; | 424 | let bar = Bar { foo: 1 }; |
424 | let a<|> = bar.foo; | 425 | let a$0 = bar.foo; |
425 | let b = a * 10; | 426 | let b = a * 10; |
426 | let c = a as usize; | 427 | let c = a as usize; |
427 | }", | 428 | }", |
@@ -445,7 +446,7 @@ fn foo() { | |||
445 | r" | 446 | r" |
446 | fn foo() -> Option<usize> { | 447 | fn foo() -> Option<usize> { |
447 | let bar = Some(1); | 448 | let bar = Some(1); |
448 | let a<|> = bar?; | 449 | let a$0 = bar?; |
449 | let b = a * 10; | 450 | let b = a * 10; |
450 | let c = a as usize; | 451 | let c = a as usize; |
451 | None | 452 | None |
@@ -467,7 +468,7 @@ fn foo() -> Option<usize> { | |||
467 | r" | 468 | r" |
468 | fn foo() { | 469 | fn foo() { |
469 | let bar = 10; | 470 | let bar = 10; |
470 | let a<|> = &bar; | 471 | let a$0 = &bar; |
471 | let b = a * 10; | 472 | let b = a * 10; |
472 | }", | 473 | }", |
473 | r" | 474 | r" |
@@ -484,7 +485,7 @@ fn foo() { | |||
484 | inline_local_variable, | 485 | inline_local_variable, |
485 | r" | 486 | r" |
486 | fn foo() { | 487 | fn foo() { |
487 | let a<|> = (10, 20); | 488 | let a$0 = (10, 20); |
488 | let b = a[0]; | 489 | let b = a[0]; |
489 | }", | 490 | }", |
490 | r" | 491 | r" |
@@ -500,7 +501,7 @@ fn foo() { | |||
500 | inline_local_variable, | 501 | inline_local_variable, |
501 | r" | 502 | r" |
502 | fn foo() { | 503 | fn foo() { |
503 | let a<|> = [1, 2, 3]; | 504 | let a$0 = [1, 2, 3]; |
504 | let b = a.len(); | 505 | let b = a.len(); |
505 | }", | 506 | }", |
506 | r" | 507 | r" |
@@ -516,7 +517,7 @@ fn foo() { | |||
516 | inline_local_variable, | 517 | inline_local_variable, |
517 | r" | 518 | r" |
518 | fn foo() { | 519 | fn foo() { |
519 | let a<|> = (10 + 20); | 520 | let a$0 = (10 + 20); |
520 | let b = a * 10; | 521 | let b = a * 10; |
521 | let c = a as usize; | 522 | let c = a as usize; |
522 | }", | 523 | }", |
@@ -535,7 +536,7 @@ fn foo() { | |||
535 | r" | 536 | r" |
536 | fn foo() { | 537 | fn foo() { |
537 | let d = 10; | 538 | let d = 10; |
538 | let a<|> = d; | 539 | let a$0 = d; |
539 | let b = a * 10; | 540 | let b = a * 10; |
540 | let c = a as usize; | 541 | let c = a as usize; |
541 | }", | 542 | }", |
@@ -554,7 +555,7 @@ fn foo() { | |||
554 | inline_local_variable, | 555 | inline_local_variable, |
555 | r" | 556 | r" |
556 | fn foo() { | 557 | fn foo() { |
557 | let a<|> = { 10 }; | 558 | let a$0 = { 10 }; |
558 | let b = a * 10; | 559 | let b = a * 10; |
559 | let c = a as usize; | 560 | let c = a as usize; |
560 | }", | 561 | }", |
@@ -572,7 +573,7 @@ fn foo() { | |||
572 | inline_local_variable, | 573 | inline_local_variable, |
573 | r" | 574 | r" |
574 | fn foo() { | 575 | fn foo() { |
575 | let a<|> = 10 + 20; | 576 | let a$0 = 10 + 20; |
576 | let b = a * 10; | 577 | let b = a * 10; |
577 | let c = (a, 20); | 578 | let c = (a, 20); |
578 | let d = [a, 10]; | 579 | let d = [a, 10]; |
@@ -594,7 +595,7 @@ fn foo() { | |||
594 | inline_local_variable, | 595 | inline_local_variable, |
595 | r" | 596 | r" |
596 | fn foo() { | 597 | fn foo() { |
597 | let a<|> = vec![10, 20]; | 598 | let a$0 = vec![10, 20]; |
598 | for i in a {} | 599 | for i in a {} |
599 | }", | 600 | }", |
600 | r" | 601 | r" |
@@ -610,7 +611,7 @@ fn foo() { | |||
610 | inline_local_variable, | 611 | inline_local_variable, |
611 | r" | 612 | r" |
612 | fn foo() { | 613 | fn foo() { |
613 | let a<|> = 1 > 0; | 614 | let a$0 = 1 > 0; |
614 | while a {} | 615 | while a {} |
615 | }", | 616 | }", |
616 | r" | 617 | r" |
@@ -626,7 +627,7 @@ fn foo() { | |||
626 | inline_local_variable, | 627 | inline_local_variable, |
627 | r" | 628 | r" |
628 | fn foo() { | 629 | fn foo() { |
629 | let a<|> = 1 + 1; | 630 | let a$0 = 1 + 1; |
630 | loop { | 631 | loop { |
631 | break a; | 632 | break a; |
632 | } | 633 | } |
@@ -646,7 +647,7 @@ fn foo() { | |||
646 | inline_local_variable, | 647 | inline_local_variable, |
647 | r" | 648 | r" |
648 | fn foo() { | 649 | fn foo() { |
649 | let a<|> = 1 > 0; | 650 | let a$0 = 1 > 0; |
650 | return a; | 651 | return a; |
651 | }", | 652 | }", |
652 | r" | 653 | r" |
@@ -662,7 +663,7 @@ fn foo() { | |||
662 | inline_local_variable, | 663 | inline_local_variable, |
663 | r" | 664 | r" |
664 | fn foo() { | 665 | fn foo() { |
665 | let a<|> = 1 > 0; | 666 | let a$0 = 1 > 0; |
666 | match a {} | 667 | match a {} |
667 | }", | 668 | }", |
668 | r" | 669 | r" |
@@ -680,7 +681,7 @@ fn foo() { | |||
680 | r" | 681 | r" |
681 | struct S { foo: i32} | 682 | struct S { foo: i32} |
682 | fn main() { | 683 | fn main() { |
683 | let <|>foo = 92; | 684 | let $0foo = 92; |
684 | S { foo } | 685 | S { foo } |
685 | } | 686 | } |
686 | ", | 687 | ", |
@@ -700,7 +701,7 @@ fn main() { | |||
700 | inline_local_variable, | 701 | inline_local_variable, |
701 | r" | 702 | r" |
702 | fn foo() { | 703 | fn foo() { |
703 | let <|>a = 0; | 704 | let $0a = 0; |
704 | } | 705 | } |
705 | ", | 706 | ", |
706 | ) | 707 | ) |
@@ -713,7 +714,7 @@ fn foo() { | |||
713 | inline_local_variable, | 714 | inline_local_variable, |
714 | r" | 715 | r" |
715 | fn main() { | 716 | fn main() { |
716 | let x = <|>1 + 2; | 717 | let x = $01 + 2; |
717 | x * 4; | 718 | x * 4; |
718 | } | 719 | } |
719 | ", | 720 | ", |