diff --git a/crates/editor/src/code_context_menus.rs b/crates/editor/src/code_context_menus.rs index 98eb15c42b..379412557f 100644 --- a/crates/editor/src/code_context_menus.rs +++ b/crates/editor/src/code_context_menus.rs @@ -510,22 +510,25 @@ impl CompletionsMenu { let completion_label = StyledText::new(completion.label.text.clone()) .with_default_highlights(&style.text, highlights); - let documentation_label = if let Some( - CompletionDocumentation::SingleLine(text), - ) = documentation - { - if text.trim().is_empty() { - None - } else { - Some( - Label::new(text.clone()) - .ml_4() - .size(LabelSize::Small) - .color(Color::Muted), - ) + + let documentation_label = match documentation { + Some(CompletionDocumentation::SingleLine(text)) + | Some(CompletionDocumentation::SingleLineAndMultiLinePlainText { + single_line: text, + .. + }) => { + if text.trim().is_empty() { + None + } else { + Some( + Label::new(text.clone()) + .ml_4() + .size(LabelSize::Small) + .color(Color::Muted), + ) + } } - } else { - None + _ => None, }; let start_slot = completion @@ -597,6 +600,10 @@ impl CompletionsMenu { .as_ref()? { CompletionDocumentation::MultiLinePlainText(text) => div().child(text.clone()), + CompletionDocumentation::SingleLineAndMultiLinePlainText { + plain_text: Some(text), + .. + } => div().child(text.clone()), CompletionDocumentation::MultiLineMarkdown(parsed) if !parsed.is_empty() => { let markdown = self.markdown_element.get_or_insert_with(|| { cx.new(|cx| { @@ -627,6 +634,11 @@ impl CompletionsMenu { CompletionDocumentation::MultiLineMarkdown(_) => return None, CompletionDocumentation::SingleLine(_) => return None, CompletionDocumentation::Undocumented => return None, + CompletionDocumentation::SingleLineAndMultiLinePlainText { + plain_text: None, .. + } => { + return None; + } }; Some( diff --git a/crates/editor/src/editor.rs b/crates/editor/src/editor.rs index 7d675aa5af..e0870ca012 100644 --- a/crates/editor/src/editor.rs +++ b/crates/editor/src/editor.rs @@ -19872,9 +19872,15 @@ fn snippet_completions( filter_range: 0..matching_prefix.len(), }, icon_path: None, - documentation: snippet.description.clone().map(|description| { - CompletionDocumentation::SingleLine(description.into()) - }), + documentation: Some( + CompletionDocumentation::SingleLineAndMultiLinePlainText { + single_line: snippet.name.clone().into(), + plain_text: snippet + .description + .clone() + .map(|description| description.into()), + }, + ), insert_text_mode: None, confirm: None, }) diff --git a/crates/project/src/lsp_store.rs b/crates/project/src/lsp_store.rs index 960d9516f9..7102f8bc5e 100644 --- a/crates/project/src/lsp_store.rs +++ b/crates/project/src/lsp_store.rs @@ -9897,6 +9897,11 @@ pub enum CompletionDocumentation { MultiLinePlainText(SharedString), /// Markdown documentation. MultiLineMarkdown(SharedString), + /// Both single line and multiple lines of plain text documentation. + SingleLineAndMultiLinePlainText { + single_line: SharedString, + plain_text: Option, + }, } impl From for CompletionDocumentation { diff --git a/crates/snippet_provider/src/lib.rs b/crates/snippet_provider/src/lib.rs index 2404f3f86a..5f1c677082 100644 --- a/crates/snippet_provider/src/lib.rs +++ b/crates/snippet_provider/src/lib.rs @@ -34,10 +34,11 @@ fn file_stem_to_key(stem: &str) -> SnippetKind { fn file_to_snippets(file_contents: VsSnippetsFile) -> Vec> { let mut snippets = vec![]; - for (prefix, snippet) in file_contents.snippets { + for (name, snippet) in file_contents.snippets { + let snippet_name = name.clone(); let prefixes = snippet .prefix - .map_or_else(move || vec![prefix], |prefixes| prefixes.into()); + .map_or_else(move || vec![snippet_name], |prefixes| prefixes.into()); let description = snippet .description .map(|description| description.to_string()); @@ -49,6 +50,7 @@ fn file_to_snippets(file_contents: VsSnippetsFile) -> Vec> { body, prefix: prefixes, description, + name, })); } snippets @@ -59,6 +61,7 @@ pub struct Snippet { pub prefix: Vec, pub body: String, pub description: Option, + pub name: String, } async fn process_updates(