Unnamed repository; edit this file 'description' to name the repository.
Diffstat (limited to 'crates/ide/src/extend_selection.rs')
-rw-r--r--crates/ide/src/extend_selection.rs22
1 files changed, 21 insertions, 1 deletions
diff --git a/crates/ide/src/extend_selection.rs b/crates/ide/src/extend_selection.rs
index b706e959d3..e8d6dc9734 100644
--- a/crates/ide/src/extend_selection.rs
+++ b/crates/ide/src/extend_selection.rs
@@ -210,7 +210,13 @@ fn extend_single_word_in_comment_or_string(
let start_idx = before.rfind(non_word_char)? as u32;
let end_idx = after.find(non_word_char).unwrap_or(after.len()) as u32;
- let from: TextSize = (start_idx + 1).into();
+ // FIXME: use `ceil_char_boundary` from `std::str` when it gets stable
+ // https://github.com/rust-lang/rust/issues/93743
+ fn ceil_char_boundary(text: &str, index: u32) -> u32 {
+ (index..).find(|&index| text.is_char_boundary(index as usize)).unwrap_or(text.len() as u32)
+ }
+
+ let from: TextSize = ceil_char_boundary(text, start_idx + 1).into();
let to: TextSize = (cursor_position + end_idx).into();
let range = TextRange::new(from, to);
@@ -662,4 +668,18 @@ fn main() { let (
],
);
}
+
+ #[test]
+ fn extend_selection_inside_str_with_wide_char() {
+ // should not panic
+ do_check(
+ r#"fn main() { let x = "═$0═══════"; }"#,
+ &[
+ r#""════════""#,
+ r#"let x = "════════";"#,
+ r#"{ let x = "════════"; }"#,
+ r#"fn main() { let x = "════════"; }"#,
+ ],
+ );
+ }
}