Unnamed repository; edit this file 'description' to name the repository.
Diffstat (limited to 'crates/ide-db/src/syntax_helpers/suggest_name.rs')
-rw-r--r--crates/ide-db/src/syntax_helpers/suggest_name.rs14
1 files changed, 12 insertions, 2 deletions
diff --git a/crates/ide-db/src/syntax_helpers/suggest_name.rs b/crates/ide-db/src/syntax_helpers/suggest_name.rs
index 5d1e876ea2..3a785fbe80 100644
--- a/crates/ide-db/src/syntax_helpers/suggest_name.rs
+++ b/crates/ide-db/src/syntax_helpers/suggest_name.rs
@@ -89,6 +89,12 @@ const USELESS_METHODS: &[&str] = &[
///
/// assert_eq!(generator.suggest_name("b2"), "b2");
/// assert_eq!(generator.suggest_name("b"), "b3");
+///
+/// // Multi-byte UTF-8 identifiers (e.g. CJK) are handled correctly
+/// assert_eq!(generator.suggest_name("日本語"), "日本語");
+/// assert_eq!(generator.suggest_name("日本語"), "日本語1");
+/// assert_eq!(generator.suggest_name("données3"), "données3");
+/// assert_eq!(generator.suggest_name("données"), "données4");
/// ```
#[derive(Debug, Default)]
pub struct NameGenerator {
@@ -262,11 +268,15 @@ impl NameGenerator {
/// Remove the numeric suffix from the name
///
/// # Examples
- /// `a1b2c3` -> `a1b2c`
+ /// `a1b2c3` -> (`a1b2c`, Some(3))
fn split_numeric_suffix(name: &str) -> (&str, Option<usize>) {
let pos =
name.rfind(|c: char| !c.is_numeric()).expect("Name cannot be empty or all-numeric");
- let (prefix, suffix) = name.split_at(pos + 1);
+ // `rfind` returns the byte offset of the matched character, which may be
+ // multi-byte (e.g. CJK identifiers). Use `ceil_char_boundary` to advance
+ // past the full character to the next valid split point.
+ let split = name.ceil_char_boundary(pos + 1);
+ let (prefix, suffix) = name.split_at(split);
(prefix, suffix.parse().ok())
}
}