Skip to content

Commit c5c49d3

Browse files
authored
builtin: fix assert 'JVM_PUBLIC_ACC'.camel_to_snake() == 'jvm_public_acc' (#21722)
1 parent 2b0938d commit c5c49d3

File tree

2 files changed

+21
-8
lines changed

2 files changed

+21
-8
lines changed

vlib/builtin/string.v

Lines changed: 20 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -2647,34 +2647,46 @@ pub fn (s string) camel_to_snake() string {
26472647
if s.len == 0 {
26482648
return ''
26492649
}
2650-
lower_first_char := if s[0] >= `A` && s[0] <= `Z` { s[0] + 32 } else { s[0] }
26512650
if s.len == 1 {
2652-
return lower_first_char.ascii_str()
2651+
return s.to_lower()
26532652
}
26542653
mut b := unsafe { malloc_noscan(2 * s.len + 1) }
2655-
second_char := if s[1] >= `A` && s[1] <= `Z` { `_` } else { s[1] }
2654+
mut prev_is_upper := false
2655+
first_char, second_char := if s[0] >= `A` && s[0] <= `Z` {
2656+
lower_first_c := if s[0] >= `A` && s[0] <= `Z` { s[0] + 32 } else { s[0] }
2657+
lower_second_c := if s[1] >= `A` && s[1] <= `Z` {
2658+
prev_is_upper = true
2659+
s[1] + 32
2660+
} else {
2661+
s[1]
2662+
}
2663+
lower_first_c, lower_second_c
2664+
} else {
2665+
lower_first_c := s[0]
2666+
second_c := if s[1] >= `A` && s[1] <= `Z` { u8(`_`) } else { s[1] }
2667+
lower_first_c, second_c
2668+
}
26562669
unsafe {
2657-
b[0] = lower_first_char
2670+
b[0] = first_char
26582671
b[1] = second_char
26592672
}
2673+
mut pos := 2
26602674
mut prev_char := second_char
2661-
mut prev_is_upper := false
26622675
mut lower_c := `_`
26632676
mut c_is_upper := false
2664-
mut pos := 1
26652677
for i in pos .. s.len {
26662678
c := s[i]
26672679
c_is_upper = c >= `A` && c <= `Z`
26682680
lower_c = if c_is_upper { c + 32 } else { c }
2669-
if prev_is_upper == false && c_is_upper {
2681+
if !prev_is_upper && c_is_upper {
26702682
// aB => a_b, if prev has `_`, then do not add `_`
26712683
unsafe {
26722684
if b[pos - 1] != `_` {
26732685
b[pos] = `_`
26742686
pos++
26752687
}
26762688
}
2677-
} else if prev_is_upper && c_is_upper == false && c != `_` {
2689+
} else if prev_is_upper && !c_is_upper && c != `_` {
26782690
// Ba => _ba, if prev has `_`, then do not add `_`
26792691
unsafe {
26802692
if b[pos - 2] != `_` {

vlib/builtin/string_test.v

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1528,6 +1528,7 @@ fn test_camel_to_snake() {
15281528
assert 'aaBbCcDD'.camel_to_snake() == 'aa_bb_cc_dd'
15291529
assert 'BBaa'.camel_to_snake() == 'b_baa'
15301530
assert 'aa_BB'.camel_to_snake() == 'aa_bb'
1531+
assert 'JVM_PUBLIC_ACC'.camel_to_snake() == 'jvm_public_acc'
15311532
}
15321533

15331534
fn test_snake_to_camel() {

0 commit comments

Comments
 (0)