aboutsummaryrefslogtreecommitdiff
path: root/crates/ra_ide_db/src/line_index_utils.rs
diff options
context:
space:
mode:
Diffstat (limited to 'crates/ra_ide_db/src/line_index_utils.rs')
-rw-r--r--crates/ra_ide_db/src/line_index_utils.rs51
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
10use ra_syntax::{TextRange, TextUnit}; 10use std::convert::TryInto;
11
12use ra_syntax::{TextRange, TextSize};
11use ra_text_edit::{AtomTextEdit, TextEdit}; 13use ra_text_edit::{AtomTextEdit, TextEdit};
12 14
13use crate::line_index::{LineCol, LineIndex, Utf16Char}; 15use crate::line_index::{LineCol, LineIndex, Utf16Char};
14 16
15pub fn translate_offset_with_edit( 17pub 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)]
86enum Step { 88enum Step {
87 Newline(TextUnit), 89 Newline(TextSize),
88 Utf16Char(TextRange), 90 Utf16Char(TextRange),
89} 91}
90 92
@@ -92,7 +94,7 @@ enum Step {
92struct LineIndexStepIter<'a> { 94struct 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
98impl LineIndexStepIter<'_> { 100impl 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)]
130struct OffsetStepIter<'a> { 132struct OffsetStepIter<'a> {
131 text: &'a str, 133 text: &'a str,
132 offset: TextUnit, 134 offset: TextSize,
133} 135}
134 136
135impl Iterator for OffsetStepIter<'_> { 137impl 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)]
272struct RunningLineCol { 275struct 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
278impl RunningLineCol { 281impl 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}