diff options
Diffstat (limited to 'crates/ra_ide_db/src/line_index_utils.rs')
-rw-r--r-- | crates/ra_ide_db/src/line_index_utils.rs | 51 |
1 files changed, 27 insertions, 24 deletions
diff --git a/crates/ra_ide_db/src/line_index_utils.rs b/crates/ra_ide_db/src/line_index_utils.rs index 2ebbabdc6..039a12c0d 100644 --- a/crates/ra_ide_db/src/line_index_utils.rs +++ b/crates/ra_ide_db/src/line_index_utils.rs | |||
@@ -1,20 +1,22 @@ | |||
1 | //! Code actions can specify desirable final position of the cursor. | 1 | //! Code actions can specify desirable final position of the cursor. |
2 | //! | 2 | //! |
3 | //! The position is specified as a `TextUnit` in the final file. We need to send | 3 | //! The position is specified as a `TextSize` in the final file. We need to send |
4 | //! it in `(Line, Column)` coordinate though. However, we only have a LineIndex | 4 | //! it in `(Line, Column)` coordinate though. However, we only have a LineIndex |
5 | //! for a file pre-edit! | 5 | //! for a file pre-edit! |
6 | //! | 6 | //! |
7 | //! Code in this module applies this "to (Line, Column) after edit" | 7 | //! Code in this module applies this "to (Line, Column) after edit" |
8 | //! transformation. | 8 | //! transformation. |
9 | 9 | ||
10 | use ra_syntax::{TextRange, TextUnit}; | 10 | use std::convert::TryInto; |
11 | |||
12 | use ra_syntax::{TextRange, TextSize}; | ||
11 | use ra_text_edit::{AtomTextEdit, TextEdit}; | 13 | use ra_text_edit::{AtomTextEdit, TextEdit}; |
12 | 14 | ||
13 | use crate::line_index::{LineCol, LineIndex, Utf16Char}; | 15 | use crate::line_index::{LineCol, LineIndex, Utf16Char}; |
14 | 16 | ||
15 | pub fn translate_offset_with_edit( | 17 | pub fn translate_offset_with_edit( |
16 | line_index: &LineIndex, | 18 | line_index: &LineIndex, |
17 | offset: TextUnit, | 19 | offset: TextSize, |
18 | text_edit: &TextEdit, | 20 | text_edit: &TextEdit, |
19 | ) -> LineCol { | 21 | ) -> LineCol { |
20 | let mut state = Edits::from_text_edit(&text_edit); | 22 | let mut state = Edits::from_text_edit(&text_edit); |
@@ -84,7 +86,7 @@ pub fn translate_offset_with_edit( | |||
84 | 86 | ||
85 | #[derive(Debug, Clone)] | 87 | #[derive(Debug, Clone)] |
86 | enum Step { | 88 | enum Step { |
87 | Newline(TextUnit), | 89 | Newline(TextSize), |
88 | Utf16Char(TextRange), | 90 | Utf16Char(TextRange), |
89 | } | 91 | } |
90 | 92 | ||
@@ -92,7 +94,7 @@ enum Step { | |||
92 | struct LineIndexStepIter<'a> { | 94 | struct LineIndexStepIter<'a> { |
93 | line_index: &'a LineIndex, | 95 | line_index: &'a LineIndex, |
94 | next_newline_idx: usize, | 96 | next_newline_idx: usize, |
95 | utf16_chars: Option<(TextUnit, std::slice::Iter<'a, Utf16Char>)>, | 97 | utf16_chars: Option<(TextSize, std::slice::Iter<'a, Utf16Char>)>, |
96 | } | 98 | } |
97 | 99 | ||
98 | impl LineIndexStepIter<'_> { | 100 | impl LineIndexStepIter<'_> { |
@@ -111,7 +113,7 @@ impl Iterator for LineIndexStepIter<'_> { | |||
111 | .as_mut() | 113 | .as_mut() |
112 | .and_then(|(newline, x)| { | 114 | .and_then(|(newline, x)| { |
113 | let x = x.next()?; | 115 | let x = x.next()?; |
114 | Some(Step::Utf16Char(TextRange::from_to(*newline + x.start, *newline + x.end))) | 116 | Some(Step::Utf16Char(TextRange::new(*newline + x.start, *newline + x.end))) |
115 | }) | 117 | }) |
116 | .or_else(|| { | 118 | .or_else(|| { |
117 | let next_newline = *self.line_index.newlines.get(self.next_newline_idx)?; | 119 | let next_newline = *self.line_index.newlines.get(self.next_newline_idx)?; |
@@ -129,7 +131,7 @@ impl Iterator for LineIndexStepIter<'_> { | |||
129 | #[derive(Debug)] | 131 | #[derive(Debug)] |
130 | struct OffsetStepIter<'a> { | 132 | struct OffsetStepIter<'a> { |
131 | text: &'a str, | 133 | text: &'a str, |
132 | offset: TextUnit, | 134 | offset: TextSize, |
133 | } | 135 | } |
134 | 136 | ||
135 | impl Iterator for OffsetStepIter<'_> { | 137 | impl Iterator for OffsetStepIter<'_> { |
@@ -139,16 +141,17 @@ impl Iterator for OffsetStepIter<'_> { | |||
139 | .text | 141 | .text |
140 | .char_indices() | 142 | .char_indices() |
141 | .filter_map(|(i, c)| { | 143 | .filter_map(|(i, c)| { |
144 | let i: TextSize = i.try_into().unwrap(); | ||
145 | let char_len = TextSize::of(c); | ||
142 | if c == '\n' { | 146 | if c == '\n' { |
143 | let next_offset = self.offset + TextUnit::from_usize(i + 1); | 147 | let next_offset = self.offset + i + char_len; |
144 | let next = Step::Newline(next_offset); | 148 | let next = Step::Newline(next_offset); |
145 | Some((next, next_offset)) | 149 | Some((next, next_offset)) |
146 | } else { | 150 | } else { |
147 | let char_len = TextUnit::of_char(c); | 151 | if !c.is_ascii() { |
148 | if char_len > TextUnit::from_usize(1) { | 152 | let start = self.offset + i; |
149 | let start = self.offset + TextUnit::from_usize(i); | ||
150 | let end = start + char_len; | 153 | let end = start + char_len; |
151 | let next = Step::Utf16Char(TextRange::from_to(start, end)); | 154 | let next = Step::Utf16Char(TextRange::new(start, end)); |
152 | let next_offset = end; | 155 | let next_offset = end; |
153 | Some((next, next_offset)) | 156 | Some((next, next_offset)) |
154 | } else { | 157 | } else { |
@@ -157,7 +160,7 @@ impl Iterator for OffsetStepIter<'_> { | |||
157 | } | 160 | } |
158 | }) | 161 | }) |
159 | .next()?; | 162 | .next()?; |
160 | let next_idx = (next_offset - self.offset).to_usize(); | 163 | let next_idx: usize = (next_offset - self.offset).into(); |
161 | self.text = &self.text[next_idx..]; | 164 | self.text = &self.text[next_idx..]; |
162 | self.offset = next_offset; | 165 | self.offset = next_offset; |
163 | Some(next) | 166 | Some(next) |
@@ -195,7 +198,7 @@ impl<'a> Edits<'a> { | |||
195 | match self.edits.split_first() { | 198 | match self.edits.split_first() { |
196 | Some((next, rest)) => { | 199 | Some((next, rest)) => { |
197 | let delete = self.translate_range(next.delete); | 200 | let delete = self.translate_range(next.delete); |
198 | let diff = next.insert.len() as i64 - next.delete.len().to_usize() as i64; | 201 | let diff = next.insert.len() as i64 - usize::from(next.delete.len()) as i64; |
199 | self.current = Some(TranslatedEdit { delete, insert: &next.insert, diff }); | 202 | self.current = Some(TranslatedEdit { delete, insert: &next.insert, diff }); |
200 | self.edits = rest; | 203 | self.edits = rest; |
201 | } | 204 | } |
@@ -244,15 +247,15 @@ impl<'a> Edits<'a> { | |||
244 | } else { | 247 | } else { |
245 | let start = self.translate(range.start()); | 248 | let start = self.translate(range.start()); |
246 | let end = self.translate(range.end()); | 249 | let end = self.translate(range.end()); |
247 | TextRange::from_to(start, end) | 250 | TextRange::new(start, end) |
248 | } | 251 | } |
249 | } | 252 | } |
250 | 253 | ||
251 | fn translate(&self, x: TextUnit) -> TextUnit { | 254 | fn translate(&self, x: TextSize) -> TextSize { |
252 | if self.acc_diff == 0 { | 255 | if self.acc_diff == 0 { |
253 | x | 256 | x |
254 | } else { | 257 | } else { |
255 | TextUnit::from((x.to_usize() as i64 + self.acc_diff) as u32) | 258 | TextSize::from((usize::from(x) as i64 + self.acc_diff) as u32) |
256 | } | 259 | } |
257 | } | 260 | } |
258 | 261 | ||
@@ -271,29 +274,29 @@ impl<'a> Edits<'a> { | |||
271 | #[derive(Debug)] | 274 | #[derive(Debug)] |
272 | struct RunningLineCol { | 275 | struct RunningLineCol { |
273 | line: u32, | 276 | line: u32, |
274 | last_newline: TextUnit, | 277 | last_newline: TextSize, |
275 | col_adjust: TextUnit, | 278 | col_adjust: TextSize, |
276 | } | 279 | } |
277 | 280 | ||
278 | impl RunningLineCol { | 281 | impl RunningLineCol { |
279 | fn new() -> RunningLineCol { | 282 | fn new() -> RunningLineCol { |
280 | RunningLineCol { line: 0, last_newline: TextUnit::from(0), col_adjust: TextUnit::from(0) } | 283 | RunningLineCol { line: 0, last_newline: TextSize::from(0), col_adjust: TextSize::from(0) } |
281 | } | 284 | } |
282 | 285 | ||
283 | fn to_line_col(&self, offset: TextUnit) -> LineCol { | 286 | fn to_line_col(&self, offset: TextSize) -> LineCol { |
284 | LineCol { | 287 | LineCol { |
285 | line: self.line, | 288 | line: self.line, |
286 | col_utf16: ((offset - self.last_newline) - self.col_adjust).into(), | 289 | col_utf16: ((offset - self.last_newline) - self.col_adjust).into(), |
287 | } | 290 | } |
288 | } | 291 | } |
289 | 292 | ||
290 | fn add_line(&mut self, newline: TextUnit) { | 293 | fn add_line(&mut self, newline: TextSize) { |
291 | self.line += 1; | 294 | self.line += 1; |
292 | self.last_newline = newline; | 295 | self.last_newline = newline; |
293 | self.col_adjust = TextUnit::from(0); | 296 | self.col_adjust = TextSize::from(0); |
294 | } | 297 | } |
295 | 298 | ||
296 | fn adjust_col(&mut self, range: TextRange) { | 299 | fn adjust_col(&mut self, range: TextRange) { |
297 | self.col_adjust += range.len() - TextUnit::from(1); | 300 | self.col_adjust += range.len() - TextSize::from(1); |
298 | } | 301 | } |
299 | } | 302 | } |