|
|
@ -399,6 +399,16 @@ impl Component for Completion {
|
|
|
|
.expect("cursor must be in view");
|
|
|
|
.expect("cursor must be in view");
|
|
|
|
let cursor_pos = coords.row as u16;
|
|
|
|
let cursor_pos = coords.row as u16;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
let markdowned = |lang: &str, detail: Option<&str>, doc: Option<&str>| {
|
|
|
|
|
|
|
|
let md = match (detail, doc) {
|
|
|
|
|
|
|
|
(Some(detail), Some(doc)) => format!("```{lang}\n{detail}\n```\n{doc}"),
|
|
|
|
|
|
|
|
(Some(detail), None) => format!("```{lang}\n{detail}\n```"),
|
|
|
|
|
|
|
|
(None, Some(doc)) => doc.to_string(),
|
|
|
|
|
|
|
|
(None, None) => String::new(),
|
|
|
|
|
|
|
|
};
|
|
|
|
|
|
|
|
Markdown::new(md, cx.editor.syn_loader.clone())
|
|
|
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
let mut markdown_doc = match &option.documentation {
|
|
|
|
let mut markdown_doc = match &option.documentation {
|
|
|
|
Some(lsp::Documentation::String(contents))
|
|
|
|
Some(lsp::Documentation::String(contents))
|
|
|
|
| Some(lsp::Documentation::MarkupContent(lsp::MarkupContent {
|
|
|
|
| Some(lsp::Documentation::MarkupContent(lsp::MarkupContent {
|
|
|
@ -406,42 +416,18 @@ impl Component for Completion {
|
|
|
|
value: contents,
|
|
|
|
value: contents,
|
|
|
|
})) => {
|
|
|
|
})) => {
|
|
|
|
// TODO: convert to wrapped text
|
|
|
|
// TODO: convert to wrapped text
|
|
|
|
Markdown::new(
|
|
|
|
markdowned(language, option.detail.as_deref(), Some(contents))
|
|
|
|
format!(
|
|
|
|
|
|
|
|
"```{}\n{}\n```\n{}",
|
|
|
|
|
|
|
|
language,
|
|
|
|
|
|
|
|
option.detail.as_deref().unwrap_or_default(),
|
|
|
|
|
|
|
|
contents
|
|
|
|
|
|
|
|
),
|
|
|
|
|
|
|
|
cx.editor.syn_loader.clone(),
|
|
|
|
|
|
|
|
)
|
|
|
|
|
|
|
|
}
|
|
|
|
}
|
|
|
|
Some(lsp::Documentation::MarkupContent(lsp::MarkupContent {
|
|
|
|
Some(lsp::Documentation::MarkupContent(lsp::MarkupContent {
|
|
|
|
kind: lsp::MarkupKind::Markdown,
|
|
|
|
kind: lsp::MarkupKind::Markdown,
|
|
|
|
value: contents,
|
|
|
|
value: contents,
|
|
|
|
})) => {
|
|
|
|
})) => {
|
|
|
|
// TODO: set language based on doc scope
|
|
|
|
// TODO: set language based on doc scope
|
|
|
|
if let Some(detail) = &option.detail.as_deref() {
|
|
|
|
markdowned(language, option.detail.as_deref(), Some(contents))
|
|
|
|
Markdown::new(
|
|
|
|
|
|
|
|
format!("```{}\n{}\n```\n{}", language, detail, contents),
|
|
|
|
|
|
|
|
cx.editor.syn_loader.clone(),
|
|
|
|
|
|
|
|
)
|
|
|
|
|
|
|
|
} else {
|
|
|
|
|
|
|
|
Markdown::new(contents.to_string(), cx.editor.syn_loader.clone())
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|
|
|
|
}
|
|
|
|
None if option.detail.is_some() => {
|
|
|
|
None if option.detail.is_some() => {
|
|
|
|
// TODO: copied from above
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// TODO: set language based on doc scope
|
|
|
|
// TODO: set language based on doc scope
|
|
|
|
Markdown::new(
|
|
|
|
markdowned(language, option.detail.as_deref(), None)
|
|
|
|
format!(
|
|
|
|
|
|
|
|
"```{}\n{}\n```",
|
|
|
|
|
|
|
|
language,
|
|
|
|
|
|
|
|
option.detail.as_deref().unwrap_or_default(),
|
|
|
|
|
|
|
|
),
|
|
|
|
|
|
|
|
cx.editor.syn_loader.clone(),
|
|
|
|
|
|
|
|
)
|
|
|
|
|
|
|
|
}
|
|
|
|
}
|
|
|
|
None => return,
|
|
|
|
None => return,
|
|
|
|
};
|
|
|
|
};
|
|
|
|