Completion word start filtering which is codepoint aware

This commit is contained in:
Julia 2023-01-07 15:34:28 -05:00
parent 12cd712b53
commit a46ca32356

View file

@ -830,33 +830,41 @@ impl CompletionsMenu {
//Remove all candidates where the query's start does not match the start of any word in the candidate //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(query) = query {
if let Some(&start) = query.as_bytes().get(0) { if let Some(query_start) = query.chars().next() {
let start = start.to_ascii_lowercase(); matches.retain(|string_match| {
matches.retain(|m| { let text = &string_match.string;
let bytes = m.string.as_bytes();
let mut index = 0; let mut index = 0;
let mut codepoints = text.char_indices().peekable();
std::iter::from_fn(move || { std::iter::from_fn(move || {
let start_index = index; let start_index = index;
while index < bytes.len() { while let Some((new_index, codepoint)) = codepoints.next() {
let current_upper = bytes[index].is_ascii_uppercase(); index = new_index + codepoint.len_utf8();
let has_more = index + 1 < bytes.len(); let current_upper = codepoint.is_uppercase();
let next_upper = has_more && bytes[index + 1].is_ascii_uppercase(); let next_upper = codepoints
.peek()
.map(|(_, c)| c.is_uppercase())
.unwrap_or(false);
index += 1;
if !current_upper && next_upper { if !current_upper && next_upper {
return Some(&m.string[start_index..index]); return Some(&text[start_index..index]);
} }
} }
index = bytes.len(); index = text.len();
if start_index < bytes.len() { if start_index < text.len() {
return Some(&m.string[start_index..]); return Some(&text[start_index..]);
} }
None None
}) })
.flat_map(|w| w.split_inclusive('_')) .flat_map(|word| word.split_inclusive('_'))
.any(|w| w.as_bytes().first().map(|&b| b.to_ascii_lowercase()) == Some(start)) .any(|word| {
word.chars()
.flat_map(|codepoint| codepoint.to_lowercase())
.zip(query_start.to_lowercase())
.all(|(word_cp, query_cp)| word_cp == query_cp)
})
}); });
} }
} }