From 5baf6590a4dd01ff67bcf928ebac81eb1df56626 Mon Sep 17 00:00:00 2001 From: Vitaly Slobodin Date: Tue, 28 Oct 2025 21:09:06 +0100 Subject: [PATCH] fix: improve completion highlights --- src/language_servers/ruby_lsp.rs | 52 ++++++++++++++++++++++-------- src/language_servers/solargraph.rs | 49 +++++++++++++++++----------- 2 files changed, 69 insertions(+), 32 deletions(-) diff --git a/src/language_servers/ruby_lsp.rs b/src/language_servers/ruby_lsp.rs index 2f99f53..1ec3dfc 100644 --- a/src/language_servers/ruby_lsp.rs +++ b/src/language_servers/ruby_lsp.rs @@ -16,33 +16,59 @@ impl RubyLsp { } pub fn label_for_completion(&self, completion: zed::lsp::Completion) -> Option { - let highlight_name = match completion.kind? { + let zed::lsp::Completion { + label, + kind, + label_details, + .. + } = completion; + let kind = kind?; + + let highlight_scope = match kind { zed::lsp::CompletionKind::Class | zed::lsp::CompletionKind::Module => "type", + zed::lsp::CompletionKind::Constant if label == "nil" => "constant.builtin", + zed::lsp::CompletionKind::Constant + if label.starts_with("__") && label.ends_with("__") => + { + "constant.builtin" + } zed::lsp::CompletionKind::Constant => "constant", - zed::lsp::CompletionKind::Method => "function.method", - zed::lsp::CompletionKind::Reference => "function.method", + zed::lsp::CompletionKind::Method + | zed::lsp::CompletionKind::Reference + | zed::lsp::CompletionKind::Function => "function.method", + zed::lsp::CompletionKind::Constructor => "function.method", zed::lsp::CompletionKind::Keyword => "keyword", + zed::lsp::CompletionKind::Field if label.starts_with("@@") => "variable.special", + zed::lsp::CompletionKind::Field if label.starts_with('@') => "variable.special", + zed::lsp::CompletionKind::Field if label == "self" || label == "super" => { + "variable.special" + } + zed::lsp::CompletionKind::Variable => "variable", + zed::lsp::CompletionKind::Property => "property", _ => return None, }; - let len = completion.label.len(); + let label_len = label.len(); let mut spans = vec![zed::CodeLabelSpan::literal( - completion.label, - Some(highlight_name.to_string()), + label, + Some(highlight_scope.to_string()), )]; - if let Some(detail) = completion - .label_details - .and_then(|label_details| label_details.detail) - { - spans.push(zed::CodeLabelSpan::literal(" ", None)); - spans.push(zed::CodeLabelSpan::literal(detail, None)); + if let Some(label_details) = label_details { + if let Some(detail) = label_details.detail { + spans.push(zed::CodeLabelSpan::literal(detail, None)); + } + + if let Some(description) = label_details.description { + spans.push(zed::CodeLabelSpan::literal(" ", None)); + spans.push(zed::CodeLabelSpan::literal(description, None)); + } } Some(zed::CodeLabel { code: Default::default(), spans, - filter_range: (0..len).into(), + filter_range: (0..label_len).into(), }) } diff --git a/src/language_servers/solargraph.rs b/src/language_servers/solargraph.rs index 658b8af..d53d4a4 100644 --- a/src/language_servers/solargraph.rs +++ b/src/language_servers/solargraph.rs @@ -20,34 +20,45 @@ impl Solargraph { } pub fn label_for_completion(&self, completion: zed::lsp::Completion) -> Option { - let highlight_name = match completion.kind? { + let zed::lsp::Completion { + label, + kind, + detail, + .. + } = completion; + let kind = kind?; + + let highlight_scope = match kind { zed::lsp::CompletionKind::Class | zed::lsp::CompletionKind::Module => "type", + zed::lsp::CompletionKind::Constant if label == "nil" => "constant.builtin", + zed::lsp::CompletionKind::Constant + if label.starts_with("__") && label.ends_with("__") => + { + "constant.builtin" + } zed::lsp::CompletionKind::Constant => "constant", - zed::lsp::CompletionKind::Method => "function.method", - zed::lsp::CompletionKind::Keyword => { - if completion.label.starts_with(':') { - "string.special.symbol" - } else { - "keyword" - } + zed::lsp::CompletionKind::Method | zed::lsp::CompletionKind::Function => { + "function.method" } - zed::lsp::CompletionKind::Variable => { - if completion.label.starts_with('@') { - "property" - } else { - return None; - } + zed::lsp::CompletionKind::Constructor => "function.method", + zed::lsp::CompletionKind::Keyword if label.starts_with(':') => "string.special.symbol", + zed::lsp::CompletionKind::Keyword => "keyword", + zed::lsp::CompletionKind::Field if label.starts_with("@@") => "variable.special", + zed::lsp::CompletionKind::Field if label.starts_with('@') => "variable.special", + zed::lsp::CompletionKind::Field if label == "self" || label == "super" => { + "variable.special" } + zed::lsp::CompletionKind::Variable => "variable", + zed::lsp::CompletionKind::Property => "property", _ => return None, }; - let len = completion.label.len(); - let name_span = - zed::CodeLabelSpan::literal(completion.label, Some(highlight_name.to_string())); + let label_len = label.len(); + let name_span = zed::CodeLabelSpan::literal(label, Some(highlight_scope.to_string())); Some(zed::CodeLabel { code: Default::default(), - spans: if let Some(detail) = completion.detail { + spans: if let Some(detail) = detail { vec![ name_span, zed::CodeLabelSpan::literal(" ", None), @@ -56,7 +67,7 @@ impl Solargraph { } else { vec![name_span] }, - filter_range: (0..len).into(), + filter_range: (0..label_len).into(), }) }