@@ -28,19 +28,44 @@ pub enum Error {
29pub mod util {
29pub mod util {
30 use super::*;
30 use super::*;
31+ use helix_core::{RopeSlice, State, Transaction};
32− pub fn lsp_pos_to_pos(doc: &helix_core::RopeSlice, pos: lsp::Position) -> usize {
33+ pub fn lsp_pos_to_pos(doc: &RopeSlice, pos: lsp::Position) -> usize {
33 let line = doc.line_to_char(pos.line as usize);
34 let line = doc.line_to_char(pos.line as usize);
34 let line_start = doc.char_to_utf16_cu(line);
35 let line_start = doc.char_to_utf16_cu(line);
35 doc.utf16_cu_to_char(pos.character as usize + line_start)
36 doc.utf16_cu_to_char(pos.character as usize + line_start)
37− pub fn pos_to_lsp_pos(doc: &helix_core::RopeSlice, pos: usize) -> lsp::Position {
38+ pub fn pos_to_lsp_pos(doc: &RopeSlice, pos: usize) -> lsp::Position {
38 let line = doc.char_to_line(pos);
39 let line = doc.char_to_line(pos);
39 let line_start = doc.char_to_utf16_cu(line);
40 let line_start = doc.char_to_utf16_cu(line);
40 let col = doc.char_to_utf16_cu(pos) - line_start;
41 let col = doc.char_to_utf16_cu(pos) - line_start;
42 lsp::Position::new(line as u32, col as u32)
43 lsp::Position::new(line as u32, col as u32)
46+ pub fn generate_transaction_from_edits(
48+ edits: Vec<lsp::TextEdit>,
50+ let doc = state.doc.slice(..);
53+ edits.into_iter().map(|edit| {
54+ // simplify "" into None for cleaner changesets
55+ let replacement = if !edit.new_text.is_empty() {
56+ Some(edit.new_text.into())
61+ let start = lsp_pos_to_pos(&doc, edit.range.start);
62+ let end = lsp_pos_to_pos(&doc, edit.range.end);
63+ (start, end, replacement)
68+ // apply_insert_replace_edit
46#[derive(Debug, PartialEq, Clone)]
71#[derive(Debug, PartialEq, Clone)]