From e20508f66c7c99d1cfd0a4e731bc21f423cd8e3b Mon Sep 17 00:00:00 2001 From: Piotr Osiewicz <24362066+osiewicz@users.noreply.github.com> Date: Thu, 21 Mar 2024 16:19:21 +0100 Subject: [PATCH] lsp: Add partial support for insert/replace completions (#9634) Most notably, this should do away with completions overriding the whole word around completion trigger text. Fixes: #4816 Release Notes: - Fixed code completions overriding text around the cursor. --- crates/lsp/src/lsp.rs | 1 + crates/project/src/lsp_command.rs | 16 +++++++++++++--- 2 files changed, 14 insertions(+), 3 deletions(-) diff --git a/crates/lsp/src/lsp.rs b/crates/lsp/src/lsp.rs index b1099cda5f..dc3dfd0a81 100644 --- a/crates/lsp/src/lsp.rs +++ b/crates/lsp/src/lsp.rs @@ -590,6 +590,7 @@ impl LanguageServer { "additionalTextEdits".to_string(), ], }), + insert_replace_support: Some(true), ..Default::default() }), completion_list: Some(CompletionListCapability { diff --git a/crates/project/src/lsp_command.rs b/crates/project/src/lsp_command.rs index a76f9d8d4c..2a7d52185b 100644 --- a/crates/project/src/lsp_command.rs +++ b/crates/project/src/lsp_command.rs @@ -1557,9 +1557,19 @@ impl LspCommand for GetCompletions { (range, text) } - Some(lsp::CompletionTextEdit::InsertAndReplace(_)) => { - log::info!("unsupported insert/replace completion"); - return None; + Some(lsp::CompletionTextEdit::InsertAndReplace(edit)) => { + let range = range_from_lsp(edit.insert); + + let start = snapshot.clip_point_utf16(range.start, Bias::Left); + let end = snapshot.clip_point_utf16(range.end, Bias::Left); + if start != range.start.0 || end != range.end.0 { + log::info!("completion out of expected range"); + return None; + } + ( + snapshot.anchor_before(start)..snapshot.anchor_after(end), + edit.new_text.clone(), + ) } };