@@ -399,6 +399,16 @@ impl Component for Completion {
399 .expect("cursor must be in view");
399 .expect("cursor must be in view");
400 let cursor_pos = coords.row as u16;
400 let cursor_pos = coords.row as u16;
402+ let markdowned = |lang: &str, detail: Option<&str>, doc: Option<&str>| {
403+ let md = match (detail, doc) {
404+ (Some(detail), Some(doc)) => format!("```{lang}\n{detail}\n```\n{doc}"),
405+ (Some(detail), None) => format!("```{lang}\n{detail}\n```"),
406+ (None, Some(doc)) => doc.to_string(),
407+ (None, None) => String::new(),
409+ Markdown::new(md, cx.editor.syn_loader.clone())
402 let mut markdown_doc = match &option.documentation {
412 let mut markdown_doc = match &option.documentation {
403 Some(lsp::Documentation::String(contents))
413 Some(lsp::Documentation::String(contents))
404 | Some(lsp::Documentation::MarkupContent(lsp::MarkupContent {
414 | Some(lsp::Documentation::MarkupContent(lsp::MarkupContent {
@@ -406,42 +416,18 @@ impl Component for Completion {
406 value: contents,
416 value: contents,
408 // TODO: convert to wrapped text
418 // TODO: convert to wrapped text
411− "```{}\n{}\n```\n{}",
413− option.detail.as_deref().unwrap_or_default(),
419+ markdowned(language, option.detail.as_deref(), Some(contents))
416− cx.editor.syn_loader.clone(),
419 Some(lsp::Documentation::MarkupContent(lsp::MarkupContent {
421 Some(lsp::Documentation::MarkupContent(lsp::MarkupContent {
420 kind: lsp::MarkupKind::Markdown,
422 kind: lsp::MarkupKind::Markdown,
421 value: contents,
423 value: contents,
423 // TODO: set language based on doc scope
425 // TODO: set language based on doc scope
424− if let Some(detail) = &option.detail.as_deref() {
426+ markdowned(language, option.detail.as_deref(), Some(contents))
426− format!("```{}\n{}\n```\n{}", language, detail, contents),
427− cx.editor.syn_loader.clone(),
430− Markdown::new(contents.to_string(), cx.editor.syn_loader.clone())
433 None if option.detail.is_some() => {
428 None if option.detail.is_some() => {
434− // TODO: copied from above
436 // TODO: set language based on doc scope
429 // TODO: set language based on doc scope
441− option.detail.as_deref().unwrap_or_default(),
430+ markdowned(language, option.detail.as_deref(), None)
443− cx.editor.syn_loader.clone(),
446 None => return,
432 None => return,