Skip to content

Commit 767dcc5

Browse files
authored
[llvm][Support] fix convertToSnakeFromCamelCase (#68375)
Currently runs of caps aren't handled correctly so e.g. something like `Intel_OCL_BI` is snake cased to `intel_o_c_l_b_i` (previously discussed on this [phabricator patch](https://reviews.llvm.org/rG92233062c17590d3157bdc6db430fcdfc54312fe)).
1 parent b53ff43 commit 767dcc5

File tree

2 files changed

+16
-8
lines changed

2 files changed

+16
-8
lines changed

llvm/lib/Support/StringExtras.cpp

+9-8
Original file line numberDiff line numberDiff line change
@@ -98,15 +98,16 @@ std::string llvm::convertToSnakeFromCamelCase(StringRef input) {
9898

9999
std::string snakeCase;
100100
snakeCase.reserve(input.size());
101-
for (char c : input) {
102-
if (!std::isupper(c)) {
103-
snakeCase.push_back(c);
104-
continue;
105-
}
106-
107-
if (!snakeCase.empty() && snakeCase.back() != '_')
101+
auto check = [&input](size_t j, function_ref<bool(int)> predicate) {
102+
return j < input.size() && predicate(input[j]);
103+
};
104+
for (size_t i = 0; i < input.size(); ++i) {
105+
snakeCase.push_back(tolower(input[i]));
106+
// Handles "runs" of capitals, such as in OPName -> op_name.
107+
if (check(i, isupper) && check(i + 1, isupper) && check(i + 2, islower))
108+
snakeCase.push_back('_');
109+
if ((check(i, islower) || check(i, isdigit)) && check(i + 1, isupper))
108110
snakeCase.push_back('_');
109-
snakeCase.push_back(llvm::toLower(c));
110111
}
111112
return snakeCase;
112113
}

llvm/unittests/ADT/StringExtrasTest.cpp

+7
Original file line numberDiff line numberDiff line change
@@ -184,6 +184,13 @@ TEST(StringExtrasTest, ConvertToSnakeFromCamelCase) {
184184

185185
testConvertToSnakeCase("OpName", "op_name");
186186
testConvertToSnakeCase("opName", "op_name");
187+
testConvertToSnakeCase("OPName", "op_name");
188+
testConvertToSnakeCase("Intel_OCL_BI", "intel_ocl_bi");
189+
testConvertToSnakeCase("I32Attr", "i32_attr");
190+
testConvertToSnakeCase("opNAME", "op_name");
191+
testConvertToSnakeCase("opNAMe", "op_na_me");
192+
testConvertToSnakeCase("opnameE", "opname_e");
193+
testConvertToSnakeCase("OPNameOPName", "op_name_op_name");
187194
testConvertToSnakeCase("_OpName", "_op_name");
188195
testConvertToSnakeCase("Op_Name", "op_name");
189196
testConvertToSnakeCase("", "");

0 commit comments

Comments
 (0)