@@ -108,20 +108,6 @@ impl Completion {
108 let item = item.unwrap();
108 let item = item.unwrap();
110 use helix_lsp::{lsp, util};
110 use helix_lsp::{lsp, util};
111− // determine what to insert: text_edit | insert_text | label
112− let edit = if let Some(edit) = &item.text_edit {
114− lsp::CompletionTextEdit::Edit(edit) => edit.clone(),
115− lsp::CompletionTextEdit::InsertAndReplace(item) => {
116− unimplemented!("completion: insert_and_replace {:?}", item)
120− item.insert_text.as_ref().unwrap_or(&item.label);
122− // lsp::TextEdit::new(); TODO: calculate a TextEdit from insert_text
123− // and we insert at position.
126 // if more text was entered, remove it
112 // if more text was entered, remove it
127 let cursor = doc.selection(view.id).cursor();
113 let cursor = doc.selection(view.id).cursor();
@@ -134,11 +120,27 @@ impl Completion {
136 use helix_lsp::OffsetEncoding;
122 use helix_lsp::OffsetEncoding;
123+ let transaction = if let Some(edit) = &item.text_edit {
124+ let edit = match edit {
125+ lsp::CompletionTextEdit::Edit(edit) => edit.clone(),
126+ lsp::CompletionTextEdit::InsertAndReplace(item) => {
127+ unimplemented!("completion: insert_and_replace {:?}", item)
137− let transaction = util::generate_transaction_from_edits(
130+ util::generate_transaction_from_edits(
138− doc.text(),
131+ doc.text(),
139− vec![edit],
132+ vec![edit],
140− offset_encoding, // TODO: should probably transcode in Client
133+ offset_encoding, // TODO: should probably transcode in Client
136+ let text = item.insert_text.as_ref().unwrap_or(&item.label);
137+ let cursor = doc.selection(view.id).cursor();
138+ Transaction::change(
140+ vec![(cursor, cursor, Some(text.as_str().into()))].into_iter(),
142 doc.apply(&transaction, view.id);
144 doc.apply(&transaction, view.id);
144 // TODO: merge edit with additional_text_edits
146 // TODO: merge edit with additional_text_edits