Skip to content

Commit 84ac205

Browse files
committed
[llvm][Support] fix convertToSnakeFromCamelCase
1 parent f1dbfcc commit 84ac205

File tree

2 files changed

+12
-11
lines changed

2 files changed

+12
-11
lines changed

llvm/lib/Support/StringExtras.cpp

Lines changed: 7 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@
1212

1313
#include "llvm/ADT/StringExtras.h"
1414
#include "llvm/ADT/SmallVector.h"
15+
#include "llvm/Support/Regex.h"
1516
#include "llvm/Support/raw_ostream.h"
1617
#include <cctype>
1718

@@ -96,18 +97,13 @@ std::string llvm::convertToSnakeFromCamelCase(StringRef input) {
9697
if (input.empty())
9798
return "";
9899

99-
std::string snakeCase;
100-
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() != '_')
108-
snakeCase.push_back('_');
109-
snakeCase.push_back(llvm::toLower(c));
100+
std::string snakeCase = input.str();
101+
for (int i = 0; i < 10; ++i) {
102+
snakeCase = llvm::Regex("([A-Z]+)([A-Z][a-z])").sub("\\1_\\2", snakeCase);
103+
snakeCase = llvm::Regex("([a-z0-9])([A-Z])").sub("\\1_\\2", snakeCase);
110104
}
105+
std::transform(snakeCase.begin(), snakeCase.end(), snakeCase.begin(),
106+
[](unsigned char c) { return std::tolower(c); });
111107
return snakeCase;
112108
}
113109

llvm/unittests/ADT/StringExtrasTest.cpp

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -184,6 +184,11 @@ TEST(StringExtrasTest, ConvertToSnakeFromCamelCase) {
184184

185185
testConvertToSnakeCase("OpName", "op_name");
186186
testConvertToSnakeCase("opName", "op_name");
187+
testConvertToSnakeCase("OPName", "op_name");
188+
testConvertToSnakeCase("opNAME", "op_name");
189+
testConvertToSnakeCase("opNAMe", "op_na_me");
190+
testConvertToSnakeCase("opnameE", "opname_e");
191+
testConvertToSnakeCase("OPNameOPName", "op_name_op_name");
187192
testConvertToSnakeCase("_OpName", "_op_name");
188193
testConvertToSnakeCase("Op_Name", "op_name");
189194
testConvertToSnakeCase("", "");

0 commit comments

Comments
 (0)