]> git.lizzy.rs Git - rust.git/commitdiff
Improve string helpers functions
authorIgor Aleksanov <popzxc@yandex.ru>
Sat, 3 Oct 2020 13:45:16 +0000 (16:45 +0300)
committerIgor Aleksanov <popzxc@yandex.ru>
Mon, 12 Oct 2020 07:59:54 +0000 (10:59 +0300)
crates/hir_ty/src/diagnostics/decl_check/str_helpers.rs
crates/stdx/src/lib.rs

index 3d8f1b5f2d146d992fe9365f9d836386d1867ace..953d0276fbf038be422a5eea2c64359189d25ef4 100644 (file)
@@ -61,7 +61,9 @@ fn is_upper_snake_case(ident: &str) -> bool {
 
 fn is_camel_case(ident: &str) -> bool {
     // We assume that the string is either snake case or camel case.
-    ident.chars().all(|c| c != '_')
+    // `_` is allowed only at the beginning or in the end of identifier, not between characters.
+    ident.trim_matches('_').chars().all(|c| c != '_')
+        && ident.chars().find(|c| c.is_alphabetic()).map(|c| c.is_ascii_uppercase()).unwrap_or(true)
 }
 
 #[cfg(test)]
@@ -80,13 +82,18 @@ fn check<F: Fn(&str) -> Option<String>>(fun: F, input: &str, expect: Expect) {
     fn test_to_lower_snake_case() {
         check(to_lower_snake_case, "lower_snake_case", expect![[""]]);
         check(to_lower_snake_case, "UPPER_SNAKE_CASE", expect![["upper_snake_case"]]);
+        check(to_lower_snake_case, "Weird_Case", expect![["weird_case"]]);
         check(to_lower_snake_case, "CamelCase", expect![["camel_case"]]);
     }
 
     #[test]
     fn test_to_camel_case() {
         check(to_camel_case, "CamelCase", expect![[""]]);
+        check(to_camel_case, "CamelCase_", expect![[""]]);
+        check(to_camel_case, "_CamelCase", expect![[""]]);
         check(to_camel_case, "lower_snake_case", expect![["LowerSnakeCase"]]);
         check(to_camel_case, "UPPER_SNAKE_CASE", expect![["UpperSnakeCase"]]);
+        check(to_camel_case, "Weird_Case", expect![["WeirdCase"]]);
+        check(to_camel_case, "name", expect![["Name"]]);
     }
 }
index 011935cade9caebce60ff64f8e0f94f3ff3009e2..522a9c1abdf385b5df0ead8a42373d303d016856 100644 (file)
@@ -32,8 +32,12 @@ pub fn to_lower_snake_case(s: &str) -> String {
     let mut buf = String::with_capacity(s.len());
     let mut prev = false;
     for c in s.chars() {
+        // `&& prev` is required to not insert `_` before the first symbol.
         if c.is_ascii_uppercase() && prev {
-            buf.push('_')
+            // This check is required to not translate `Weird_Case` into `weird__case`.
+            if buf.chars().last() != Some('_') {
+                buf.push('_')
+            }
         }
         prev = true;