diff options
Diffstat (limited to 'crates/ra_ide/src/typing.rs')
-rw-r--r-- | crates/ra_ide/src/typing.rs | 31 |
1 files changed, 13 insertions, 18 deletions
diff --git a/crates/ra_ide/src/typing.rs b/crates/ra_ide/src/typing.rs index 2a8b4327f..cd48cad93 100644 --- a/crates/ra_ide/src/typing.rs +++ b/crates/ra_ide/src/typing.rs | |||
@@ -17,15 +17,16 @@ mod on_enter; | |||
17 | 17 | ||
18 | use ra_db::{FilePosition, SourceDatabase}; | 18 | use ra_db::{FilePosition, SourceDatabase}; |
19 | use ra_fmt::leading_indent; | 19 | use ra_fmt::leading_indent; |
20 | use ra_ide_db::RootDatabase; | 20 | use ra_ide_db::{source_change::SingleFileChange, RootDatabase}; |
21 | use ra_syntax::{ | 21 | use ra_syntax::{ |
22 | algo::find_node_at_offset, | 22 | algo::find_node_at_offset, |
23 | ast::{self, AstToken}, | 23 | ast::{self, AstToken}, |
24 | AstNode, SourceFile, TextRange, TextSize, | 24 | AstNode, SourceFile, TextRange, TextSize, |
25 | }; | 25 | }; |
26 | |||
26 | use ra_text_edit::TextEdit; | 27 | use ra_text_edit::TextEdit; |
27 | 28 | ||
28 | use crate::{source_change::SingleFileChange, SourceChange}; | 29 | use crate::SourceChange; |
29 | 30 | ||
30 | pub(crate) use on_enter::on_enter; | 31 | pub(crate) use on_enter::on_enter; |
31 | 32 | ||
@@ -81,7 +82,6 @@ fn on_eq_typed(file: &SourceFile, offset: TextSize) -> Option<SingleFileChange> | |||
81 | Some(SingleFileChange { | 82 | Some(SingleFileChange { |
82 | label: "add semicolon".to_string(), | 83 | label: "add semicolon".to_string(), |
83 | edit: TextEdit::insert(offset, ";".to_string()), | 84 | edit: TextEdit::insert(offset, ";".to_string()), |
84 | cursor_position: None, | ||
85 | }) | 85 | }) |
86 | } | 86 | } |
87 | 87 | ||
@@ -110,7 +110,6 @@ fn on_dot_typed(file: &SourceFile, offset: TextSize) -> Option<SingleFileChange> | |||
110 | Some(SingleFileChange { | 110 | Some(SingleFileChange { |
111 | label: "reindent dot".to_string(), | 111 | label: "reindent dot".to_string(), |
112 | edit: TextEdit::replace(TextRange::new(offset - current_indent_len, offset), target_indent), | 112 | edit: TextEdit::replace(TextRange::new(offset - current_indent_len, offset), target_indent), |
113 | cursor_position: Some(offset + target_indent_len - current_indent_len + TextSize::of('.')), | ||
114 | }) | 113 | }) |
115 | } | 114 | } |
116 | 115 | ||
@@ -129,7 +128,6 @@ fn on_arrow_typed(file: &SourceFile, offset: TextSize) -> Option<SingleFileChang | |||
129 | Some(SingleFileChange { | 128 | Some(SingleFileChange { |
130 | label: "add space after return type".to_string(), | 129 | label: "add space after return type".to_string(), |
131 | edit: TextEdit::insert(after_arrow, " ".to_string()), | 130 | edit: TextEdit::insert(after_arrow, " ".to_string()), |
132 | cursor_position: Some(after_arrow), | ||
133 | }) | 131 | }) |
134 | } | 132 | } |
135 | 133 | ||
@@ -139,26 +137,23 @@ mod tests { | |||
139 | 137 | ||
140 | use super::*; | 138 | use super::*; |
141 | 139 | ||
142 | fn do_type_char(char_typed: char, before: &str) -> Option<(String, SingleFileChange)> { | 140 | fn do_type_char(char_typed: char, before: &str) -> Option<String> { |
143 | let (offset, before) = extract_offset(before); | 141 | let (offset, before) = extract_offset(before); |
144 | let edit = TextEdit::insert(offset, char_typed.to_string()); | 142 | let edit = TextEdit::insert(offset, char_typed.to_string()); |
145 | let before = edit.apply(&before); | 143 | let mut before = before.to_string(); |
144 | edit.apply(&mut before); | ||
146 | let parse = SourceFile::parse(&before); | 145 | let parse = SourceFile::parse(&before); |
147 | on_char_typed_inner(&parse.tree(), offset, char_typed) | 146 | on_char_typed_inner(&parse.tree(), offset, char_typed).map(|it| { |
148 | .map(|it| (it.edit.apply(&before), it)) | 147 | it.edit.apply(&mut before); |
148 | before.to_string() | ||
149 | }) | ||
149 | } | 150 | } |
150 | 151 | ||
151 | fn type_char(char_typed: char, before: &str, after: &str) { | 152 | fn type_char(char_typed: char, before: &str, after: &str) { |
152 | let (actual, file_change) = do_type_char(char_typed, before) | 153 | let actual = do_type_char(char_typed, before) |
153 | .unwrap_or_else(|| panic!("typing `{}` did nothing", char_typed)); | 154 | .unwrap_or_else(|| panic!("typing `{}` did nothing", char_typed)); |
154 | 155 | ||
155 | if after.contains("<|>") { | 156 | assert_eq_text!(after, &actual); |
156 | let (offset, after) = extract_offset(after); | ||
157 | assert_eq_text!(&after, &actual); | ||
158 | assert_eq!(file_change.cursor_position, Some(offset)) | ||
159 | } else { | ||
160 | assert_eq_text!(after, &actual); | ||
161 | } | ||
162 | } | 157 | } |
163 | 158 | ||
164 | fn type_char_noop(char_typed: char, before: &str) { | 159 | fn type_char_noop(char_typed: char, before: &str) { |
@@ -346,6 +341,6 @@ fn foo() { | |||
346 | 341 | ||
347 | #[test] | 342 | #[test] |
348 | fn adds_space_after_return_type() { | 343 | fn adds_space_after_return_type() { |
349 | type_char('>', "fn foo() -<|>{ 92 }", "fn foo() -><|> { 92 }") | 344 | type_char('>', "fn foo() -<|>{ 92 }", "fn foo() -> { 92 }") |
350 | } | 345 | } |
351 | } | 346 | } |