@@ -108,20 +108,6 @@ impl Completion {
108108 let item = item.unwrap();
109109
110110 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 {
113− match edit {
114− lsp::CompletionTextEdit::Edit(edit) => edit.clone(),
115− lsp::CompletionTextEdit::InsertAndReplace(item) => {
116− unimplemented!("completion: insert_and_replace {:?}", item)
117− }
118− }
119− } else {
120− item.insert_text.as_ref().unwrap_or(&item.label);
121− unimplemented!();
122− // lsp::TextEdit::new(); TODO: calculate a TextEdit from insert_text
123− // and we insert at position.
124− };
125111
126112 // if more text was entered, remove it
127113 let cursor = doc.selection(view.id).cursor();
@@ -134,11 +120,27 @@ impl Completion {
134120 }
135121
136122 use helix_lsp::OffsetEncoding;
137− let transaction = util::generate_transaction_from_edits(
138− doc.text(),
139− vec![edit],
140− offset_encoding, // TODO: should probably transcode in Client
141− );
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)
128+ }
129+ };
130+ util::generate_transaction_from_edits(
131+ doc.text(),
132+ vec![edit],
133+ offset_encoding, // TODO: should probably transcode in Client
134+ )
135+ } else {
136+ let text = item.insert_text.as_ref().unwrap_or(&item.label);
137+ let cursor = doc.selection(view.id).cursor();
138+ Transaction::change(
139+ doc.text(),
140+ vec![(cursor, cursor, Some(text.as_str().into()))].into_iter(),
141+ )
142+ };
143+
142144 doc.apply(&transaction, view.id);
143145
144146 // TODO: merge edit with additional_text_edits