@@ -28,19 +28,44 @@ pub enum Error {
2828
2929pub mod util {
3030 use super::*;
31+ use helix_core::{RopeSlice, State, Transaction};
3132
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 {
3334 let line = doc.line_to_char(pos.line as usize);
3435 let line_start = doc.char_to_utf16_cu(line);
3536 doc.utf16_cu_to_char(pos.character as usize + line_start)
3637 }
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 {
3839 let line = doc.char_to_line(pos);
3940 let line_start = doc.char_to_utf16_cu(line);
4041 let col = doc.char_to_utf16_cu(pos) - line_start;
4142
4243 lsp::Position::new(line as u32, col as u32)
4344 }
45+
46+ pub fn generate_transaction_from_edits(
47+ state: &State,
48+ edits: Vec<lsp::TextEdit>,
49+ ) -> Transaction {
50+ let doc = state.doc.slice(..);
51+ Transaction::change(
52+ state,
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())
57+ } else {
58+ None
59+ };
60+
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)
64+ }),
65+ )
66+ }
67+
68+ // apply_insert_replace_edit
4469}
4570
4671#[derive(Debug, PartialEq, Clone)]