diff options
Diffstat (limited to 'crates/ra_assists/src')
-rw-r--r-- | crates/ra_assists/src/handlers/extract_struct_from_enum_variant.rs | 11 | ||||
-rw-r--r-- | crates/ra_assists/src/utils/insert_use.rs | 27 |
2 files changed, 27 insertions, 11 deletions
diff --git a/crates/ra_assists/src/handlers/extract_struct_from_enum_variant.rs b/crates/ra_assists/src/handlers/extract_struct_from_enum_variant.rs index b4e19b3dc..497f887cd 100644 --- a/crates/ra_assists/src/handlers/extract_struct_from_enum_variant.rs +++ b/crates/ra_assists/src/handlers/extract_struct_from_enum_variant.rs | |||
@@ -1,11 +1,10 @@ | |||
1 | use hir::{EnumVariant, Module, ModuleDef, Name}; | 1 | use hir::{EnumVariant, Module, ModuleDef, Name}; |
2 | use ra_db::FileId; | 2 | use ra_db::FileId; |
3 | use ra_fmt::leading_indent; | ||
4 | use ra_ide_db::{defs::Definition, search::Reference, RootDatabase}; | 3 | use ra_ide_db::{defs::Definition, search::Reference, RootDatabase}; |
5 | use rustc_hash::FxHashSet; | 4 | use rustc_hash::FxHashSet; |
6 | use syntax::{ | 5 | use syntax::{ |
7 | algo::find_node_at_offset, | 6 | algo::find_node_at_offset, |
8 | ast::{self, ArgListOwner, AstNode, NameOwner, VisibilityOwner}, | 7 | ast::{self, edit::IndentLevel, ArgListOwner, AstNode, NameOwner, VisibilityOwner}, |
9 | SourceFile, TextRange, TextSize, | 8 | SourceFile, TextRange, TextSize, |
10 | }; | 9 | }; |
11 | 10 | ||
@@ -112,7 +111,7 @@ fn insert_import( | |||
112 | Some(()) | 111 | Some(()) |
113 | } | 112 | } |
114 | 113 | ||
115 | // FIXME: this should use strongly-typed `make`, rather than string manipulation1 | 114 | // FIXME: this should use strongly-typed `make`, rather than string manipulation. |
116 | fn extract_struct_def( | 115 | fn extract_struct_def( |
117 | builder: &mut AssistBuilder, | 116 | builder: &mut AssistBuilder, |
118 | enum_: &ast::Enum, | 117 | enum_: &ast::Enum, |
@@ -127,11 +126,7 @@ fn extract_struct_def( | |||
127 | } else { | 126 | } else { |
128 | "".to_string() | 127 | "".to_string() |
129 | }; | 128 | }; |
130 | let indent = if let Some(indent) = leading_indent(enum_.syntax()) { | 129 | let indent = IndentLevel::from_node(enum_.syntax()); |
131 | indent.to_string() | ||
132 | } else { | ||
133 | "".to_string() | ||
134 | }; | ||
135 | let struct_def = format!( | 130 | let struct_def = format!( |
136 | r#"{}struct {}{}; | 131 | r#"{}struct {}{}; |
137 | 132 | ||
diff --git a/crates/ra_assists/src/utils/insert_use.rs b/crates/ra_assists/src/utils/insert_use.rs index f89c288da..50a62ee82 100644 --- a/crates/ra_assists/src/utils/insert_use.rs +++ b/crates/ra_assists/src/utils/insert_use.rs | |||
@@ -2,13 +2,15 @@ | |||
2 | // FIXME: rewrite according to the plan, outlined in | 2 | // FIXME: rewrite according to the plan, outlined in |
3 | // https://github.com/rust-analyzer/rust-analyzer/issues/3301#issuecomment-592931553 | 3 | // https://github.com/rust-analyzer/rust-analyzer/issues/3301#issuecomment-592931553 |
4 | 4 | ||
5 | use std::iter::successors; | ||
6 | |||
5 | use either::Either; | 7 | use either::Either; |
6 | use hir::{self, ModPath}; | 8 | use hir::{self, ModPath}; |
7 | use syntax::{ | 9 | use syntax::{ |
8 | ast::{self, NameOwner, VisibilityOwner}, | 10 | ast::{self, NameOwner, VisibilityOwner}, |
9 | AstNode, Direction, SmolStr, | 11 | AstNode, AstToken, Direction, SmolStr, |
10 | SyntaxKind::{PATH, PATH_SEGMENT}, | 12 | SyntaxKind::{PATH, PATH_SEGMENT}, |
11 | SyntaxNode, T, | 13 | SyntaxNode, SyntaxToken, T, |
12 | }; | 14 | }; |
13 | use text_edit::TextEditBuilder; | 15 | use text_edit::TextEditBuilder; |
14 | 16 | ||
@@ -442,7 +444,7 @@ fn make_assist_add_new_use( | |||
442 | edit: &mut TextEditBuilder, | 444 | edit: &mut TextEditBuilder, |
443 | ) { | 445 | ) { |
444 | if let Some(anchor) = anchor { | 446 | if let Some(anchor) = anchor { |
445 | let indent = ra_fmt::leading_indent(anchor); | 447 | let indent = leading_indent(anchor); |
446 | let mut buf = String::new(); | 448 | let mut buf = String::new(); |
447 | if after { | 449 | if after { |
448 | buf.push_str("\n"); | 450 | buf.push_str("\n"); |
@@ -524,3 +526,22 @@ fn make_assist_add_nested_import( | |||
524 | edit.insert(end, "}".to_string()); | 526 | edit.insert(end, "}".to_string()); |
525 | } | 527 | } |
526 | } | 528 | } |
529 | |||
530 | /// If the node is on the beginning of the line, calculate indent. | ||
531 | fn leading_indent(node: &SyntaxNode) -> Option<SmolStr> { | ||
532 | for token in prev_tokens(node.first_token()?) { | ||
533 | if let Some(ws) = ast::Whitespace::cast(token.clone()) { | ||
534 | let ws_text = ws.text(); | ||
535 | if let Some(pos) = ws_text.rfind('\n') { | ||
536 | return Some(ws_text[pos + 1..].into()); | ||
537 | } | ||
538 | } | ||
539 | if token.text().contains('\n') { | ||
540 | break; | ||
541 | } | ||
542 | } | ||
543 | return None; | ||
544 | fn prev_tokens(token: SyntaxToken) -> impl Iterator<Item = SyntaxToken> { | ||
545 | successors(token.prev_token(), |token| token.prev_token()) | ||
546 | } | ||
547 | } | ||