pub(super) fn find_keyword_pos(decl: &str, keyword: &str) -> Option<usize> {
let lower = decl.to_lowercase();
let mut start = 0;
while let Some(pos) = lower[start..].find(keyword) {
let abs_pos = start + pos;
let before_ok = abs_pos == 0 || !decl.as_bytes()[abs_pos - 1].is_ascii_alphanumeric();
let after_pos = abs_pos + keyword.len();
let after_ok =
after_pos >= decl.len() || !decl.as_bytes()[after_pos].is_ascii_alphanumeric();
if before_ok && after_ok {
return Some(abs_pos);
}
start = abs_pos + keyword.len();
}
None
}
pub(super) fn find_matching_paren(s: &str) -> Option<usize> {
let mut depth = 0i32;
for (i, c) in s.char_indices() {
match c {
'(' => depth += 1,
')' => {
if depth == 0 {
return Some(i);
}
depth -= 1;
}
_ => {}
}
}
None
}
pub(super) fn split_params(params_str: &str) -> Vec<&str> {
let mut result = Vec::new();
let mut depth = 0i32;
let mut start = 0;
let bytes = params_str.as_bytes();
for (i, &b) in bytes.iter().enumerate() {
match b {
b'(' | b'<' | b'[' | b'{' => depth += 1,
b')' | b'>' | b']' | b'}' => depth -= 1,
b',' if depth == 0 => {
result.push(¶ms_str[start..i]);
start = i + 1;
}
_ => {}
}
}
result.push(¶ms_str[start..]);
result
}