diff options
-rw-r--r-- | crates/ra_assists/src/handlers/introduce_variable.rs | 57 | ||||
-rw-r--r-- | crates/rust-analyzer/src/global_state.rs | 9 | ||||
-rw-r--r-- | crates/rust-analyzer/src/main_loop.rs | 3 |
3 files changed, 53 insertions, 16 deletions
diff --git a/crates/ra_assists/src/handlers/introduce_variable.rs b/crates/ra_assists/src/handlers/introduce_variable.rs index 88b62278f..96affe49d 100644 --- a/crates/ra_assists/src/handlers/introduce_variable.rs +++ b/crates/ra_assists/src/handlers/introduce_variable.rs | |||
@@ -44,12 +44,26 @@ pub(crate) fn introduce_variable(acc: &mut Assists, ctx: &AssistContext) -> Opti | |||
44 | } | 44 | } |
45 | let target = expr.syntax().text_range(); | 45 | let target = expr.syntax().text_range(); |
46 | acc.add(AssistId("introduce_variable"), "Extract into variable", target, move |edit| { | 46 | acc.add(AssistId("introduce_variable"), "Extract into variable", target, move |edit| { |
47 | let field_shorthand = match expr.syntax().parent().and_then(ast::RecordField::cast) { | ||
48 | Some(field) => field.name_ref(), | ||
49 | None => None, | ||
50 | }; | ||
51 | |||
47 | let mut buf = String::new(); | 52 | let mut buf = String::new(); |
48 | 53 | ||
54 | let var_name = match &field_shorthand { | ||
55 | Some(it) => it.to_string(), | ||
56 | None => "var_name".to_string(), | ||
57 | }; | ||
58 | let expr_range = match &field_shorthand { | ||
59 | Some(it) => it.syntax().text_range().cover(expr.syntax().text_range()), | ||
60 | None => expr.syntax().text_range(), | ||
61 | }; | ||
62 | |||
49 | if wrap_in_block { | 63 | if wrap_in_block { |
50 | buf.push_str("{ let var_name = "); | 64 | format_to!(buf, "{{ let {} = ", var_name); |
51 | } else { | 65 | } else { |
52 | buf.push_str("let var_name = "); | 66 | format_to!(buf, "let {} = ", var_name); |
53 | }; | 67 | }; |
54 | format_to!(buf, "{}", expr.syntax()); | 68 | format_to!(buf, "{}", expr.syntax()); |
55 | 69 | ||
@@ -64,13 +78,13 @@ pub(crate) fn introduce_variable(acc: &mut Assists, ctx: &AssistContext) -> Opti | |||
64 | if full_stmt.unwrap().semicolon_token().is_none() { | 78 | if full_stmt.unwrap().semicolon_token().is_none() { |
65 | buf.push_str(";"); | 79 | buf.push_str(";"); |
66 | } | 80 | } |
67 | let offset = expr.syntax().text_range(); | ||
68 | match ctx.config.snippet_cap { | 81 | match ctx.config.snippet_cap { |
69 | Some(cap) => { | 82 | Some(cap) => { |
70 | let snip = buf.replace("let var_name", "let $0var_name"); | 83 | let snip = |
71 | edit.replace_snippet(cap, offset, snip) | 84 | buf.replace(&format!("let {}", var_name), &format!("let $0{}", var_name)); |
85 | edit.replace_snippet(cap, expr_range, snip) | ||
72 | } | 86 | } |
73 | None => edit.replace(offset, buf), | 87 | None => edit.replace(expr_range, buf), |
74 | } | 88 | } |
75 | return; | 89 | return; |
76 | } | 90 | } |
@@ -88,11 +102,12 @@ pub(crate) fn introduce_variable(acc: &mut Assists, ctx: &AssistContext) -> Opti | |||
88 | buf.push_str(text); | 102 | buf.push_str(text); |
89 | } | 103 | } |
90 | 104 | ||
91 | edit.replace(expr.syntax().text_range(), "var_name".to_string()); | 105 | edit.replace(expr_range, var_name.clone()); |
92 | let offset = anchor_stmt.text_range().start(); | 106 | let offset = anchor_stmt.text_range().start(); |
93 | match ctx.config.snippet_cap { | 107 | match ctx.config.snippet_cap { |
94 | Some(cap) => { | 108 | Some(cap) => { |
95 | let snip = buf.replace("let var_name", "let $0var_name"); | 109 | let snip = |
110 | buf.replace(&format!("let {}", var_name), &format!("let $0{}", var_name)); | ||
96 | edit.insert_snippet(cap, offset, snip) | 111 | edit.insert_snippet(cap, offset, snip) |
97 | } | 112 | } |
98 | None => edit.insert(offset, buf), | 113 | None => edit.insert(offset, buf), |
@@ -504,6 +519,32 @@ fn main() { | |||
504 | } | 519 | } |
505 | 520 | ||
506 | #[test] | 521 | #[test] |
522 | fn introduce_var_field_shorthand() { | ||
523 | check_assist( | ||
524 | introduce_variable, | ||
525 | r#" | ||
526 | struct S { | ||
527 | foo: i32 | ||
528 | } | ||
529 | |||
530 | fn main() { | ||
531 | S { foo: <|>1 + 1<|> } | ||
532 | } | ||
533 | "#, | ||
534 | r#" | ||
535 | struct S { | ||
536 | foo: i32 | ||
537 | } | ||
538 | |||
539 | fn main() { | ||
540 | let $0foo = 1 + 1; | ||
541 | S { foo } | ||
542 | } | ||
543 | "#, | ||
544 | ) | ||
545 | } | ||
546 | |||
547 | #[test] | ||
507 | fn test_introduce_var_for_return_not_applicable() { | 548 | fn test_introduce_var_for_return_not_applicable() { |
508 | check_assist_not_applicable(introduce_variable, "fn foo() { <|>return<|>; } "); | 549 | check_assist_not_applicable(introduce_variable, "fn foo() { <|>return<|>; } "); |
509 | } | 550 | } |
diff --git a/crates/rust-analyzer/src/global_state.rs b/crates/rust-analyzer/src/global_state.rs index 17de2a075..a8cc71249 100644 --- a/crates/rust-analyzer/src/global_state.rs +++ b/crates/rust-analyzer/src/global_state.rs | |||
@@ -84,11 +84,7 @@ pub(crate) struct GlobalStateSnapshot { | |||
84 | } | 84 | } |
85 | 85 | ||
86 | impl GlobalState { | 86 | impl GlobalState { |
87 | pub(crate) fn new( | 87 | pub(crate) fn new(sender: Sender<lsp_server::Message>, config: Config) -> GlobalState { |
88 | sender: Sender<lsp_server::Message>, | ||
89 | lru_capacity: Option<usize>, | ||
90 | config: Config, | ||
91 | ) -> GlobalState { | ||
92 | let loader = { | 88 | let loader = { |
93 | let (sender, receiver) = unbounded::<vfs::loader::Message>(); | 89 | let (sender, receiver) = unbounded::<vfs::loader::Message>(); |
94 | let handle = | 90 | let handle = |
@@ -103,12 +99,13 @@ impl GlobalState { | |||
103 | Handle { handle, receiver } | 99 | Handle { handle, receiver } |
104 | }; | 100 | }; |
105 | 101 | ||
102 | let analysis_host = AnalysisHost::new(config.lru_capacity); | ||
106 | GlobalState { | 103 | GlobalState { |
107 | sender, | 104 | sender, |
108 | task_pool, | 105 | task_pool, |
109 | loader, | 106 | loader, |
110 | config, | 107 | config, |
111 | analysis_host: AnalysisHost::new(lru_capacity), | 108 | analysis_host, |
112 | flycheck: None, | 109 | flycheck: None, |
113 | diagnostics: Default::default(), | 110 | diagnostics: Default::default(), |
114 | mem_docs: FxHashSet::default(), | 111 | mem_docs: FxHashSet::default(), |
diff --git a/crates/rust-analyzer/src/main_loop.rs b/crates/rust-analyzer/src/main_loop.rs index d4879283d..d03c68edf 100644 --- a/crates/rust-analyzer/src/main_loop.rs +++ b/crates/rust-analyzer/src/main_loop.rs | |||
@@ -44,8 +44,7 @@ pub fn main_loop(config: Config, connection: Connection) -> Result<()> { | |||
44 | SetThreadPriority(thread, thread_priority_above_normal); | 44 | SetThreadPriority(thread, thread_priority_above_normal); |
45 | } | 45 | } |
46 | 46 | ||
47 | GlobalState::new(connection.sender.clone(), config.lru_capacity, config) | 47 | GlobalState::new(connection.sender.clone(), config).run(connection.receiver) |
48 | .run(connection.receiver) | ||
49 | } | 48 | } |
50 | 49 | ||
51 | enum Event { | 50 | enum Event { |