[llvm] 767dcc5 - [llvm][Support] fix convertToSnakeFromCamelCase (#68375)

via llvm-commits llvm-commits at lists.llvm.org
Fri Oct 6 14:33:17 PDT 2023


Author: Maksim Levental
Date: 2023-10-06T16:33:13-05:00
New Revision: 767dcc5f77b61a3363f7836661cc208a5bfd1c9c

URL: https://github.com/llvm/llvm-project/commit/767dcc5f77b61a3363f7836661cc208a5bfd1c9c
DIFF: https://github.com/llvm/llvm-project/commit/767dcc5f77b61a3363f7836661cc208a5bfd1c9c.diff

LOG: [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)).

Added: 
    

Modified: 
    llvm/lib/Support/StringExtras.cpp
    llvm/unittests/ADT/StringExtrasTest.cpp

Removed: 
    


################################################################################
diff  --git a/llvm/lib/Support/StringExtras.cpp b/llvm/lib/Support/StringExtras.cpp
index 5683d7005584eb2..6ae26267337b195 100644
--- a/llvm/lib/Support/StringExtras.cpp
+++ b/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;
 }

diff  --git a/llvm/unittests/ADT/StringExtrasTest.cpp b/llvm/unittests/ADT/StringExtrasTest.cpp
index 6f4eb0b85ba54f6..1fb1fea6577911d 100644
--- a/llvm/unittests/ADT/StringExtrasTest.cpp
+++ b/llvm/unittests/ADT/StringExtrasTest.cpp
@@ -184,6 +184,13 @@ TEST(StringExtrasTest, ConvertToSnakeFromCamelCase) {
 
   testConvertToSnakeCase("OpName", "op_name");
   testConvertToSnakeCase("opName", "op_name");
+  testConvertToSnakeCase("OPName", "op_name");
+  testConvertToSnakeCase("Intel_OCL_BI", "intel_ocl_bi");
+  testConvertToSnakeCase("I32Attr", "i32_attr");
+  testConvertToSnakeCase("opNAME", "op_name");
+  testConvertToSnakeCase("opNAMe", "op_na_me");
+  testConvertToSnakeCase("opnameE", "opname_e");
+  testConvertToSnakeCase("OPNameOPName", "op_name_op_name");
   testConvertToSnakeCase("_OpName", "_op_name");
   testConvertToSnakeCase("Op_Name", "op_name");
   testConvertToSnakeCase("", "");


        


More information about the llvm-commits mailing list