aboutsummaryrefslogtreecommitdiff
path: root/contrib/llvm-project/llvm/lib/Support/StringExtras.cpp
diff options
context:
space:
mode:
authorDimitry Andric <dim@FreeBSD.org>2023-12-18 20:30:12 +0000
committerDimitry Andric <dim@FreeBSD.org>2024-04-19 21:23:40 +0000
commitbdbe302c3396ceb4dd89d1214485439598f05368 (patch)
treeccf66c6349b23061ed5e9645c21f15fbe718da8b /contrib/llvm-project/llvm/lib/Support/StringExtras.cpp
parente7a1904fe1ced461b2a31f03b6592ae6564a243a (diff)
Diffstat (limited to 'contrib/llvm-project/llvm/lib/Support/StringExtras.cpp')
-rw-r--r--contrib/llvm-project/llvm/lib/Support/StringExtras.cpp17
1 files changed, 9 insertions, 8 deletions
diff --git a/contrib/llvm-project/llvm/lib/Support/StringExtras.cpp b/contrib/llvm-project/llvm/lib/Support/StringExtras.cpp
index 5683d7005584..6ae26267337b 100644
--- a/contrib/llvm-project/llvm/lib/Support/StringExtras.cpp
+++ b/contrib/llvm-project/llvm/lib/Support/StringExtras.cpp
@@ -98,15 +98,16 @@ std::string llvm::convertToSnakeFromCamelCase(StringRef input) {
std::string snakeCase;
snakeCase.reserve(input.size());
- for (char c : input) {
- if (!std::isupper(c)) {
- snakeCase.push_back(c);
- continue;
- }
-
- if (!snakeCase.empty() && snakeCase.back() != '_')
+ auto check = [&input](size_t j, function_ref<bool(int)> predicate) {
+ return j < input.size() && predicate(input[j]);
+ };
+ for (size_t i = 0; i < input.size(); ++i) {
+ snakeCase.push_back(tolower(input[i]));
+ // Handles "runs" of capitals, such as in OPName -> op_name.
+ if (check(i, isupper) && check(i + 1, isupper) && check(i + 2, islower))
+ snakeCase.push_back('_');
+ if ((check(i, islower) || check(i, isdigit)) && check(i + 1, isupper))
snakeCase.push_back('_');
- snakeCase.push_back(llvm::toLower(c));
}
return snakeCase;
}