aboutsummaryrefslogtreecommitdiff
path: root/crates/ra_ide/src/typing.rs
diff options
context:
space:
mode:
Diffstat (limited to 'crates/ra_ide/src/typing.rs')
-rw-r--r--crates/ra_ide/src/typing.rs31
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
18use ra_db::{FilePosition, SourceDatabase}; 18use ra_db::{FilePosition, SourceDatabase};
19use ra_fmt::leading_indent; 19use ra_fmt::leading_indent;
20use ra_ide_db::RootDatabase; 20use ra_ide_db::{source_change::SingleFileChange, RootDatabase};
21use ra_syntax::{ 21use 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
26use ra_text_edit::TextEdit; 27use ra_text_edit::TextEdit;
27 28
28use crate::{source_change::SingleFileChange, SourceChange}; 29use crate::SourceChange;
29 30
30pub(crate) use on_enter::on_enter; 31pub(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}