From f70f507f612c4728383e546990d4b09a614a1de8 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 e3fb6733dd5176906f0a9a9d208305d67470ba15..1275822228b225dad3ca56c6b7c4ce2796d6679f 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 f676f5a7a6f028c095d52273fb8c616472a35ee5..56edc8844f9c5f607d1c1b9ce8fa776ebd6efd63 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(), )) @@ -1466,6 +1468,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")?, @@ -1476,6 +1479,7 @@ impl LspAdapter for PyLspAdapter { }; Some(language::CodeLabel::filtered( label.clone(), + label_len, item.filter_text.as_deref(), vec![(0..label.len(), highlight_id)], )) @@ -1741,6 +1745,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"), @@ -1762,6 +1767,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 334fd4c4a717d2b0a9890611ff5cc21f3d898aeb..d2ea01202abbef9607e7c9d38a02d0538d46e6b2 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)], )) }