diff options
Diffstat (limited to 'contrib/llvm-project/llvm/lib/Support/StringExtras.cpp')
| -rw-r--r-- | contrib/llvm-project/llvm/lib/Support/StringExtras.cpp | 17 |
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; } |
