aboutsummaryrefslogtreecommitdiff
path: root/crates/ra_assists/src/handlers/inline_local_variable.rs
diff options
context:
space:
mode:
Diffstat (limited to 'crates/ra_assists/src/handlers/inline_local_variable.rs')
-rw-r--r--crates/ra_assists/src/handlers/inline_local_variable.rs29
1 files changed, 18 insertions, 11 deletions
diff --git a/crates/ra_assists/src/handlers/inline_local_variable.rs b/crates/ra_assists/src/handlers/inline_local_variable.rs
index eb5112343..3bfcba8ff 100644
--- a/crates/ra_assists/src/handlers/inline_local_variable.rs
+++ b/crates/ra_assists/src/handlers/inline_local_variable.rs
@@ -1,3 +1,4 @@
1use ra_ide_db::defs::Definition;
1use ra_syntax::{ 2use ra_syntax::{
2 ast::{self, AstNode, AstToken}, 3 ast::{self, AstNode, AstToken},
3 TextRange, 4 TextRange,
@@ -37,6 +38,15 @@ pub(crate) fn inline_local_variable(ctx: AssistCtx) -> Option<Assist> {
37 return None; 38 return None;
38 } 39 }
39 let initializer_expr = let_stmt.initializer()?; 40 let initializer_expr = let_stmt.initializer()?;
41
42 let def = ctx.sema.to_def(&bind_pat)?;
43 let def = Definition::Local(def);
44 let refs = def.find_usages(ctx.db, None);
45 if refs.is_empty() {
46 tested_by!(test_not_applicable_if_variable_unused);
47 return None;
48 };
49
40 let delete_range = if let Some(whitespace) = let_stmt 50 let delete_range = if let Some(whitespace) = let_stmt
41 .syntax() 51 .syntax()
42 .next_sibling_or_token() 52 .next_sibling_or_token()
@@ -49,16 +59,14 @@ pub(crate) fn inline_local_variable(ctx: AssistCtx) -> Option<Assist> {
49 } else { 59 } else {
50 let_stmt.syntax().text_range() 60 let_stmt.syntax().text_range()
51 }; 61 };
52 let refs = ctx.sema.find_all_refs(&bind_pat);
53 if refs.is_empty() {
54 return None;
55 };
56 62
57 let mut wrap_in_parens = vec![true; refs.len()]; 63 let mut wrap_in_parens = vec![true; refs.len()];
58 64
59 for (i, desc) in refs.iter().enumerate() { 65 for (i, desc) in refs.iter().enumerate() {
60 let usage_node = 66 let usage_node = ctx
61 ctx.covering_node_for_range(desc.range).ancestors().find_map(ast::PathExpr::cast)?; 67 .covering_node_for_range(desc.file_range.range)
68 .ancestors()
69 .find_map(ast::PathExpr::cast)?;
62 let usage_parent_option = usage_node.syntax().parent().and_then(ast::Expr::cast); 70 let usage_parent_option = usage_node.syntax().parent().and_then(ast::Expr::cast);
63 let usage_parent = match usage_parent_option { 71 let usage_parent = match usage_parent_option {
64 Some(u) => u, 72 Some(u) => u,
@@ -103,11 +111,9 @@ pub(crate) fn inline_local_variable(ctx: AssistCtx) -> Option<Assist> {
103 move |edit: &mut ActionBuilder| { 111 move |edit: &mut ActionBuilder| {
104 edit.delete(delete_range); 112 edit.delete(delete_range);
105 for (desc, should_wrap) in refs.iter().zip(wrap_in_parens) { 113 for (desc, should_wrap) in refs.iter().zip(wrap_in_parens) {
106 if should_wrap { 114 let replacement =
107 edit.replace(desc.range, init_in_paren.clone()) 115 if should_wrap { init_in_paren.clone() } else { init_str.clone() };
108 } else { 116 edit.replace(desc.file_range.range, replacement)
109 edit.replace(desc.range, init_str.clone())
110 }
111 } 117 }
112 edit.set_cursor(delete_range.start()) 118 edit.set_cursor(delete_range.start())
113 }, 119 },
@@ -657,6 +663,7 @@ fn foo() {
657 663
658 #[test] 664 #[test]
659 fn test_not_applicable_if_variable_unused() { 665 fn test_not_applicable_if_variable_unused() {
666 covers!(test_not_applicable_if_variable_unused);
660 check_assist_not_applicable( 667 check_assist_not_applicable(
661 inline_local_variable, 668 inline_local_variable,
662 r" 669 r"