From d7a3ffa2d80b5a8256490d30666e0b7812543e96 Mon Sep 17 00:00:00 2001 From: Nikita Revenco <154856872+NikitaRevenco@users.noreply.github.com> Date: Sat, 11 Jan 2025 17:43:57 +0000 Subject: [PATCH] refactor: simplify code --- helix-core/src/case_conversion.rs | 35 +++++++++++++++++-------------- 1 file changed, 19 insertions(+), 16 deletions(-) diff --git a/helix-core/src/case_conversion.rs b/helix-core/src/case_conversion.rs index 5fe5bac1a..b7ba1d08d 100644 --- a/helix-core/src/case_conversion.rs +++ b/helix-core/src/case_conversion.rs @@ -13,7 +13,7 @@ pub fn simple_case_conversion( } pub fn smart_case_conversion( - text: impl Iterator, + chars: impl Iterator, buf: &mut Tendril, capitalize_first: bool, separator: Option, @@ -21,34 +21,37 @@ pub fn smart_case_conversion( let mut should_capitalize_current = capitalize_first; let mut prev: Option = None; - for c in text.skip_while(|ch| ch.is_whitespace()) { - if c.is_alphanumeric() { + for current in chars.skip_while(|ch| ch.is_whitespace()) { + let mut maybe_add_separator = || { if let Some(separator) = separator { - if prev.is_some_and(|p| p != separator) - && prev.is_some_and(|p| p.is_lowercase()) - && c.is_uppercase() - { + // We do not want to add a separator when the previous char is not a separator + // For example, snake__case is invalid + if prev.is_some_and(|ch| ch != separator) { buf.push(separator); } } - if prev.is_some_and(|p| p.is_lowercase()) && c.is_uppercase() { + }; + + if current.is_alphanumeric() { + // "camelCase" => transition at 'l' -> 'C' + let has_camel_transition = + current.is_uppercase() && prev.is_some_and(|ch| ch.is_lowercase()); + + if has_camel_transition { + maybe_add_separator(); should_capitalize_current = true; } if should_capitalize_current { - buf.push(c.to_ascii_uppercase()); + buf.push(current.to_ascii_uppercase()); should_capitalize_current = false; } else { - buf.extend(c.to_lowercase()); + buf.push(current.to_ascii_lowercase()); } } else { should_capitalize_current = true; - if let Some(separator) = separator { - if prev.is_some_and(|p| p != separator) { - buf.push(separator); - } - } + maybe_add_separator(); } - prev = Some(c); + prev = Some(current); } *buf = buf.trim_end().into();