From 329b0f9b8d9ea5cafbfd6c7a8f92a9d13738b841 Mon Sep 17 00:00:00 2001 From: Myriad-Dreamin <35292584+Myriad-Dreamin@users.noreply.github.com> Date: Mon, 6 May 2024 22:00:51 +0800 Subject: [PATCH] Slice the before_window at char boundaries (#4028) Co-authored-by: Laurenz --- crates/typst-ide/src/complete.rs | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/crates/typst-ide/src/complete.rs b/crates/typst-ide/src/complete.rs index c758dd1c0..279e04939 100644 --- a/crates/typst-ide/src/complete.rs +++ b/crates/typst-ide/src/complete.rs @@ -1053,7 +1053,7 @@ impl<'a> CompletionContext<'a> { /// A small window of context before the cursor. fn before_window(&self, size: usize) -> &str { - &self.before[self.cursor.saturating_sub(size)..] + Scanner::new(self.before).from(self.cursor.saturating_sub(size)) } /// Add a prefix and suffix to all applications. @@ -1433,4 +1433,12 @@ mod tests { test("#i", 2, &["int", "if conditional"], &["foo"]); test("#().", 4, &["insert", "remove", "len", "all"], &["foo"]); } + + #[test] + fn test_before_window_char_boundary() { + // Check that the `before_window` doesn't slice into invalid byte + // boundaries. + let s = "😀😀 #text(font: \"\")"; + test(s, s.len() - 2, &[], &[]); + } }