From 7e6cdabb262316fd2448baa021057eb7505c5d4a Mon Sep 17 00:00:00 2001 From: Smit Barmase Date: Thu, 6 Nov 2025 13:19:46 +0530 Subject: [PATCH] language: Fix completion menu no longer prioritizes relevant items for Typescript and Python (#42065) Closes #41672 Regressed in https://github.com/zed-industries/zed/pull/40242 Release Notes: - Fixed issue where completion menu no longer prioritizes relevant items for TypeScript and Python. --- crates/language/src/language.rs | 6 ++++-- crates/languages/src/python.rs | 8 +++++++- crates/languages/src/typescript.rs | 5 +++-- crates/languages/src/vtsls.rs | 5 +++-- 4 files changed, 17 insertions(+), 7 deletions(-) diff --git a/crates/language/src/language.rs b/crates/language/src/language.rs index 3d777e5ff6f4abcaea211aacdfc4761053b387be..bbca0e43ad76e8f9d23e3c49ce0af21ec970f3d7 100644 --- a/crates/language/src/language.rs +++ b/crates/language/src/language.rs @@ -2324,17 +2324,19 @@ impl CodeLabel { } pub fn plain(text: String, filter_text: Option<&str>) -> Self { - Self::filtered(text, filter_text, Vec::new()) + Self::filtered(text.clone(), text.len(), filter_text, Vec::new()) } pub fn filtered( text: String, + label_len: usize, filter_text: Option<&str>, runs: Vec<(Range, HighlightId)>, ) -> Self { + assert!(label_len <= text.len()); let filter_range = filter_text .and_then(|filter| text.find(filter).map(|ix| ix..ix + filter.len())) - .unwrap_or(0..text.len()); + .unwrap_or(0..label_len); Self::new(text, filter_range, runs) } diff --git a/crates/languages/src/python.rs b/crates/languages/src/python.rs index 7bf667c72440279f7b23d6747bbd3887c410b562..f3f571196a2341a47b5e2ddab9f51c83c1ee528e 100644 --- a/crates/languages/src/python.rs +++ b/crates/languages/src/python.rs @@ -406,6 +406,7 @@ impl LspAdapter for PyrightLspAdapter { language: &Arc, ) -> Option { let label = &item.label; + let label_len = label.len(); let grammar = language.grammar()?; let highlight_id = match item.kind? { lsp::CompletionItemKind::METHOD => grammar.highlight_id_for_name("function.method"), @@ -427,9 +428,10 @@ impl LspAdapter for PyrightLspAdapter { } Some(language::CodeLabel::filtered( text, + label_len, item.filter_text.as_deref(), highlight_id - .map(|id| (0..label.len(), id)) + .map(|id| (0..label_len, id)) .into_iter() .collect(), )) @@ -1467,6 +1469,7 @@ impl LspAdapter for PyLspAdapter { language: &Arc, ) -> Option { let label = &item.label; + let label_len = label.len(); let grammar = language.grammar()?; let highlight_id = match item.kind? { lsp::CompletionItemKind::METHOD => grammar.highlight_id_for_name("function.method")?, @@ -1477,6 +1480,7 @@ impl LspAdapter for PyLspAdapter { }; Some(language::CodeLabel::filtered( label.clone(), + label_len, item.filter_text.as_deref(), vec![(0..label.len(), highlight_id)], )) @@ -1742,6 +1746,7 @@ impl LspAdapter for BasedPyrightLspAdapter { language: &Arc, ) -> Option { let label = &item.label; + let label_len = label.len(); let grammar = language.grammar()?; let highlight_id = match item.kind? { lsp::CompletionItemKind::METHOD => grammar.highlight_id_for_name("function.method"), @@ -1763,6 +1768,7 @@ impl LspAdapter for BasedPyrightLspAdapter { } Some(language::CodeLabel::filtered( text, + label_len, item.filter_text.as_deref(), highlight_id .map(|id| (0..label.len(), id)) diff --git a/crates/languages/src/typescript.rs b/crates/languages/src/typescript.rs index 50688c6f20a7a1e4cdbae01cdc56c09eefde4edf..dfee49bbcf279ae34d9a4f3ee38987878397d810 100644 --- a/crates/languages/src/typescript.rs +++ b/crates/languages/src/typescript.rs @@ -754,7 +754,7 @@ impl LspAdapter for TypeScriptLspAdapter { language: &Arc, ) -> Option { use lsp::CompletionItemKind as Kind; - let len = item.label.len(); + let label_len = item.label.len(); let grammar = language.grammar()?; let highlight_id = match item.kind? { Kind::CLASS | Kind::INTERFACE | Kind::ENUM => grammar.highlight_id_for_name("type"), @@ -779,8 +779,9 @@ impl LspAdapter for TypeScriptLspAdapter { }; Some(language::CodeLabel::filtered( text, + label_len, item.filter_text.as_deref(), - vec![(0..len, highlight_id)], + vec![(0..label_len, highlight_id)], )) } diff --git a/crates/languages/src/vtsls.rs b/crates/languages/src/vtsls.rs index 8cbb9f307f6f4222e0e9a65fe2a6954f97fc7f21..0766be24bab6a220748523c1107d40f5a58f03ae 100644 --- a/crates/languages/src/vtsls.rs +++ b/crates/languages/src/vtsls.rs @@ -178,7 +178,7 @@ impl LspAdapter for VtslsLspAdapter { language: &Arc, ) -> Option { use lsp::CompletionItemKind as Kind; - let len = item.label.len(); + let label_len = item.label.len(); let grammar = language.grammar()?; let highlight_id = match item.kind? { Kind::CLASS | Kind::INTERFACE | Kind::ENUM => grammar.highlight_id_for_name("type"), @@ -203,8 +203,9 @@ impl LspAdapter for VtslsLspAdapter { }; Some(language::CodeLabel::filtered( text, + label_len, item.filter_text.as_deref(), - vec![(0..len, highlight_id)], + vec![(0..label_len, highlight_id)], )) }