From dcb8dc16ca7de46a1b49f9d8a5e6b51dff6f581d Mon Sep 17 00:00:00 2001 From: Piotr Osiewicz <24362066+osiewicz@users.noreply.github.com> Date: Fri, 14 Jun 2024 13:31:02 +0200 Subject: [PATCH] editor: Update insert_text_format based on resolved completion (#13041) Fixes #12920 VTSLS does not mark snippet completions as such in the initial completion response - not until we resolve them; however, we do not touch initial contents of completion during resolution, which led to us not treating a snippet as such. Release Notes: - Fixed snippet completions sometimes being treated as plain text completions when using VTSLS --- crates/project/src/project.rs | 14 +++++++++++--- 1 file changed, 11 insertions(+), 3 deletions(-) diff --git a/crates/project/src/project.rs b/crates/project/src/project.rs index 1175fa1992..35f01f1325 100644 --- a/crates/project/src/project.rs +++ b/crates/project/src/project.rs @@ -59,9 +59,9 @@ use language::{ use log::error; use lsp::{ CompletionContext, DiagnosticSeverity, DiagnosticTag, DidChangeWatchedFilesRegistrationOptions, - DocumentHighlightKind, Edit, FileSystemWatcher, LanguageServer, LanguageServerBinary, - LanguageServerId, LspRequestFuture, MessageActionItem, OneOf, ServerCapabilities, - ServerHealthStatus, ServerStatus, TextEdit, Uri, + DocumentHighlightKind, Edit, FileSystemWatcher, InsertTextFormat, LanguageServer, + LanguageServerBinary, LanguageServerId, LspRequestFuture, MessageActionItem, OneOf, + ServerCapabilities, ServerHealthStatus, ServerStatus, TextEdit, Uri, }; use lsp_command::*; use node_runtime::NodeRuntime; @@ -6134,6 +6134,14 @@ impl Project { completion.old_range = old_range; } } + if completion_item.insert_text_format == Some(InsertTextFormat::SNIPPET) { + // vtsls might change the type of completion after resolution. + let mut completions = completions.write(); + let completion = &mut completions[completion_index]; + if completion_item.insert_text_format != completion.lsp_completion.insert_text_format { + completion.lsp_completion.insert_text_format = completion_item.insert_text_format; + } + } } #[allow(clippy::too_many_arguments)]