From 12cd712b53a3cfd825d826c8962382c5c7ff3f9b Mon Sep 17 00:00:00 2001 From: Julia Date: Fri, 6 Jan 2023 22:46:32 -0500 Subject: [PATCH] Require start autocomplete query byte to match a completion word start byte --- crates/editor/src/editor.rs | 34 ++++++++++++++++++++++++++++++++++ 1 file changed, 34 insertions(+) diff --git a/crates/editor/src/editor.rs b/crates/editor/src/editor.rs index d8ee49866b404d4d1d12efbd540b467096485d81..354a2be97d52a151f8c7b3ce9737994f88950918 100644 --- a/crates/editor/src/editor.rs +++ b/crates/editor/src/editor.rs @@ -827,6 +827,40 @@ impl CompletionsMenu { }) .collect() }; + + //Remove all candidates where the query's start does not match the start of any word in the candidate + if let Some(query) = query { + if let Some(&start) = query.as_bytes().get(0) { + let start = start.to_ascii_lowercase(); + matches.retain(|m| { + let bytes = m.string.as_bytes(); + let mut index = 0; + + std::iter::from_fn(move || { + let start_index = index; + while index < bytes.len() { + let current_upper = bytes[index].is_ascii_uppercase(); + let has_more = index + 1 < bytes.len(); + let next_upper = has_more && bytes[index + 1].is_ascii_uppercase(); + + index += 1; + if !current_upper && next_upper { + return Some(&m.string[start_index..index]); + } + } + + index = bytes.len(); + if start_index < bytes.len() { + return Some(&m.string[start_index..]); + } + None + }) + .flat_map(|w| w.split_inclusive('_')) + .any(|w| w.as_bytes().first().map(|&b| b.to_ascii_lowercase()) == Some(start)) + }); + } + } + matches.sort_unstable_by_key(|mat| { let completion = &self.completions[mat.candidate_id]; (