Properly normalize completion labels with multi-byte characters (#25150)

Closes https://github.com/zed-industries/zed/issues/25142

Release Notes:

- Fixed panics on completion with multi-byte characters input
This commit is contained in:
Kirill Bulatov 2025-02-19 14:11:10 +02:00 committed by GitHub
parent d4414efd6f
commit 094430e5a2
No known key found for this signature in database
GPG key ID: B5690EEEBB952194

View file

@ -8944,7 +8944,7 @@ fn ensure_uniform_list_compatible_label(label: &mut CodeLabel) {
}
_ => {
new_text.push(c);
new_idx += 1;
new_idx += c.len_utf8();
last_char_was_space = false;
}
}
@ -9015,8 +9015,13 @@ fn ensure_uniform_list_compatible_label(label: &mut CodeLabel) {
}
#[cfg(test)]
#[test]
fn test_glob_literal_prefix() {
mod tests {
use language::HighlightId;
use super::*;
#[test]
fn test_glob_literal_prefix() {
assert_eq!(glob_literal_prefix(Path::new("**/*.js")), Path::new(""));
assert_eq!(
glob_literal_prefix(Path::new("node_modules/**/*.js")),
@ -9047,4 +9052,23 @@ fn test_glob_literal_prefix() {
Path::new("foo/bar/baz.js")
);
}
}
#[test]
fn test_multi_len_chars_normalization() {
let mut label = CodeLabel {
text: "myElˇ (parameter) myElˇ: {\n foo: string;\n}".to_string(),
runs: vec![(0..6, HighlightId(1))],
filter_range: 0..6,
};
ensure_uniform_list_compatible_label(&mut label);
assert_eq!(
label,
CodeLabel {
text: "myElˇ (parameter) myElˇ: { foo: string; }".to_string(),
runs: vec![(0..6, HighlightId(1))],
filter_range: 0..6,
}
);
}
}