Use more LSP data when falling back to regular completions label (#23909)
Closes https://github.com/zed-industries/zed/issues/23590 Closes https://x.com/steeve/status/1865129235536568555 Before: <img width="773" alt="before" src="https://github.com/user-attachments/assets/129a8d12-9298-4bf5-8f2d-b3292c2562bf" /> After: <img width="768" alt="after" src="https://github.com/user-attachments/assets/e0516fb3-b02a-48be-8923-63bba05fdb69" /> The list obviously needs some solution for the cut-off part of the completion label, but this is the reality for all extensions' completions too, so one step at a time. Release Notes: - Improved default completion label fallback
This commit is contained in:
parent
48dba9a9d9
commit
9e4555797d
3 changed files with 62 additions and 12 deletions
|
@ -1750,6 +1750,58 @@ impl Grammar {
|
|||
}
|
||||
|
||||
impl CodeLabel {
|
||||
pub fn fallback_for_completion(
|
||||
item: &lsp::CompletionItem,
|
||||
language: Option<&Language>,
|
||||
) -> Self {
|
||||
let highlight_id = item.kind.and_then(|kind| {
|
||||
let grammar = language?.grammar()?;
|
||||
use lsp::CompletionItemKind as Kind;
|
||||
match kind {
|
||||
Kind::CLASS => grammar.highlight_id_for_name("type"),
|
||||
Kind::CONSTANT => grammar.highlight_id_for_name("constant"),
|
||||
Kind::CONSTRUCTOR => grammar.highlight_id_for_name("constructor"),
|
||||
Kind::ENUM => grammar
|
||||
.highlight_id_for_name("enum")
|
||||
.or_else(|| grammar.highlight_id_for_name("type")),
|
||||
Kind::FIELD => grammar.highlight_id_for_name("property"),
|
||||
Kind::FUNCTION => grammar.highlight_id_for_name("function"),
|
||||
Kind::INTERFACE => grammar.highlight_id_for_name("type"),
|
||||
Kind::METHOD => grammar
|
||||
.highlight_id_for_name("function.method")
|
||||
.or_else(|| grammar.highlight_id_for_name("function")),
|
||||
Kind::OPERATOR => grammar.highlight_id_for_name("operator"),
|
||||
Kind::PROPERTY => grammar.highlight_id_for_name("property"),
|
||||
Kind::STRUCT => grammar.highlight_id_for_name("type"),
|
||||
Kind::VARIABLE => grammar.highlight_id_for_name("variable"),
|
||||
Kind::KEYWORD => grammar.highlight_id_for_name("keyword"),
|
||||
_ => None,
|
||||
}
|
||||
});
|
||||
|
||||
let label = &item.label;
|
||||
let label_length = label.len();
|
||||
let runs = highlight_id
|
||||
.map(|highlight_id| vec![(0..label_length, highlight_id)])
|
||||
.unwrap_or_default();
|
||||
let text = if let Some(detail) = &item.detail {
|
||||
format!("{label} {detail}")
|
||||
} else if let Some(description) = item
|
||||
.label_details
|
||||
.as_ref()
|
||||
.and_then(|label_details| label_details.description.as_ref())
|
||||
{
|
||||
format!("{label} {description}")
|
||||
} else {
|
||||
label.clone()
|
||||
};
|
||||
Self {
|
||||
text,
|
||||
runs,
|
||||
filter_range: 0..label_length,
|
||||
}
|
||||
}
|
||||
|
||||
pub fn plain(text: String, filter_text: Option<&str>) -> Self {
|
||||
let mut result = Self {
|
||||
runs: Vec::new(),
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue