| 273 | |
| 274 | #[instrument] |
| 275 | fn on_did_change_text_document(&self, req: lsp_types::DidChangeTextDocumentParams) { |
| 276 | let uri = req.text_document.uri; |
| 277 | let changes = req.content_changes; |
| 278 | if let Some(mut file) = self.files.clone().get_mut(&uri) { |
| 279 | let mut rope = file.content.clone(); |
| 280 | for change in changes { |
| 281 | let range = if let Some(range) = change.range { |
| 282 | rope.try_line_to_char(range.start.line as usize).map_or_else( |
| 283 | |_| (0, None), |
| 284 | |start| { |
| 285 | rope.try_line_to_char(range.end.line as usize).map_or_else( |
| 286 | |_| (start + range.start.character as usize, None), |
| 287 | |end| { |
| 288 | (start + range.start.character as usize, Some(end + range.end.character as usize)) |
| 289 | }, |
| 290 | ) |
| 291 | }, |
| 292 | ) |
| 293 | } else { |
| 294 | (0, None) |
| 295 | }; |
| 296 | match range { |
| 297 | (start, None) => { |
| 298 | rope.try_remove(start..).ok(); |
| 299 | rope.try_insert(start, &change.text).ok(); |
| 300 | } |
| 301 | (start, Some(end)) => { |
| 302 | rope.try_remove(start..end).ok(); |
| 303 | rope.try_insert(start, &change.text).ok(); |
| 304 | } |
| 305 | } |
| 306 | } |
| 307 | file.commit(rope) |
| 308 | } |
| 309 | } |
| 310 | } |