aboutsummaryrefslogtreecommitdiff
path: root/crates/assists/src/handlers/inline_local_variable.rs
diff options
context:
space:
mode:
Diffstat (limited to 'crates/assists/src/handlers/inline_local_variable.rs')
-rw-r--r--crates/assists/src/handlers/inline_local_variable.rs155
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 @@
1use ide_db::{defs::Definition, search::ReferenceKind}; 1use ide_db::{
2 defs::Definition,
3 search::{FileReference, ReferenceKind},
4};
2use syntax::{ 5use 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"
147fn bar(a: usize) {} 148fn bar(a: usize) {}
148fn foo() { 149fn 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"
181fn bar(a: usize) {} 182fn bar(a: usize) {}
182fn foo() { 183fn 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"
215fn bar(a: usize) {} 216fn bar(a: usize) {}
216fn foo() { 217fn 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"
249fn bar(a: usize): usize { a } 250fn bar(a: usize): usize { a }
250fn foo() { 251fn 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"
283fn foo() { 284fn 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"
315fn foo() { 316fn 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"
348fn foo() { 349fn 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"
360fn foo() { 361fn 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"
378fn foo() { 379fn 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"
398fn foo() { 399fn 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
422fn foo() { 423fn 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"
446fn foo() -> Option<usize> { 447fn 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"
468fn foo() { 469fn 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"
486fn foo() { 487fn 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"
502fn foo() { 503fn 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"
518fn foo() { 519fn 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"
536fn foo() { 537fn 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"
556fn foo() { 557fn 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"
574fn foo() { 575fn 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"
596fn foo() { 597fn 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"
612fn foo() { 613fn 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"
628fn foo() { 629fn 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"
648fn foo() { 649fn 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"
664fn foo() { 665fn 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"
681struct S { foo: i32} 682struct S { foo: i32}
682fn main() { 683fn 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"
702fn foo() { 703fn 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"
715fn main() { 716fn main() {
716 let x = <|>1 + 2; 717 let x = $01 + 2;
717 x * 4; 718 x * 4;
718} 719}
719", 720",