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(), + ) } };