diff options
author | bors[bot] <bors[bot]@users.noreply.github.com> | 2019-01-16 06:20:09 +0000 |
---|---|---|
committer | bors[bot] <bors[bot]@users.noreply.github.com> | 2019-01-16 06:20:09 +0000 |
commit | d75a0368f5048243d6561e42e77835f6f574b321 (patch) | |
tree | 17ffe16abbf568232e50696d8dcfbd798eef7009 | |
parent | 68d320a680b5df802b2c3e7dad5d890e3309ed60 (diff) | |
parent | 67ddd3359817f0a1254005e4c2dc921eed5e7ad9 (diff) |
Merge #536
536: Introduce variable semicolon block expr r=matklad a=yerke
Fix for https://github.com/rust-analyzer/rust-analyzer/issues/504
Feels a bit hacky...
Co-authored-by: Yerkebulan Tulibergenov <[email protected]>
-rw-r--r-- | crates/ra_ide_api_light/src/assists/introduce_variable.rs | 22 | ||||
-rw-r--r-- | crates/ra_syntax/src/ast.rs | 9 |
2 files changed, 30 insertions, 1 deletions
diff --git a/crates/ra_ide_api_light/src/assists/introduce_variable.rs b/crates/ra_ide_api_light/src/assists/introduce_variable.rs index 523ec7034..3e4434c23 100644 --- a/crates/ra_ide_api_light/src/assists/introduce_variable.rs +++ b/crates/ra_ide_api_light/src/assists/introduce_variable.rs | |||
@@ -20,12 +20,16 @@ pub fn introduce_variable<'a>(ctx: AssistCtx) -> Option<Assist> { | |||
20 | 20 | ||
21 | buf.push_str("let var_name = "); | 21 | buf.push_str("let var_name = "); |
22 | expr.syntax().text().push_to(&mut buf); | 22 | expr.syntax().text().push_to(&mut buf); |
23 | let is_full_stmt = if let Some(expr_stmt) = ast::ExprStmt::cast(anchor_stmt) { | 23 | let full_stmt = ast::ExprStmt::cast(anchor_stmt); |
24 | let is_full_stmt = if let Some(expr_stmt) = full_stmt { | ||
24 | Some(expr.syntax()) == expr_stmt.expr().map(|e| e.syntax()) | 25 | Some(expr.syntax()) == expr_stmt.expr().map(|e| e.syntax()) |
25 | } else { | 26 | } else { |
26 | false | 27 | false |
27 | }; | 28 | }; |
28 | if is_full_stmt { | 29 | if is_full_stmt { |
30 | if !full_stmt.unwrap().has_semi() { | ||
31 | buf.push_str(";"); | ||
32 | } | ||
29 | edit.replace(expr.syntax().range(), buf); | 33 | edit.replace(expr.syntax().range(), buf); |
30 | } else { | 34 | } else { |
31 | buf.push_str(";"); | 35 | buf.push_str(";"); |
@@ -141,4 +145,20 @@ fn foo() { | |||
141 | ); | 145 | ); |
142 | } | 146 | } |
143 | 147 | ||
148 | #[test] | ||
149 | fn test_introduce_var_block_expr_second_to_last() { | ||
150 | check_assist_range( | ||
151 | introduce_variable, | ||
152 | " | ||
153 | fn foo() { | ||
154 | <|>{ let x = 0; x }<|> | ||
155 | something_else(); | ||
156 | }", | ||
157 | " | ||
158 | fn foo() { | ||
159 | let <|>var_name = { let x = 0; x }; | ||
160 | something_else(); | ||
161 | }", | ||
162 | ); | ||
163 | } | ||
144 | } | 164 | } |
diff --git a/crates/ra_syntax/src/ast.rs b/crates/ra_syntax/src/ast.rs index 211ba31e5..000cfb981 100644 --- a/crates/ra_syntax/src/ast.rs +++ b/crates/ra_syntax/src/ast.rs | |||
@@ -296,6 +296,15 @@ impl IfExpr { | |||
296 | } | 296 | } |
297 | } | 297 | } |
298 | 298 | ||
299 | impl ExprStmt { | ||
300 | pub fn has_semi(&self) -> bool { | ||
301 | match self.syntax().last_child() { | ||
302 | None => false, | ||
303 | Some(node) => node.kind() == SEMI, | ||
304 | } | ||
305 | } | ||
306 | } | ||
307 | |||
299 | #[derive(Debug, Clone, Copy, PartialEq, Eq)] | 308 | #[derive(Debug, Clone, Copy, PartialEq, Eq)] |
300 | pub enum PathSegmentKind<'a> { | 309 | pub enum PathSegmentKind<'a> { |
301 | Name(&'a NameRef), | 310 | Name(&'a NameRef), |