|
12 | 12 |
|
13 | 13 | #include "llvm/ADT/StringExtras.h"
|
14 | 14 | #include "llvm/ADT/SmallVector.h"
|
| 15 | +#include "llvm/Support/ErrorHandling.h" |
15 | 16 | #include "llvm/Support/Regex.h"
|
16 | 17 | #include "llvm/Support/raw_ostream.h"
|
17 | 18 | #include <cctype>
|
@@ -100,14 +101,23 @@ std::string llvm::convertToSnakeFromCamelCase(StringRef input) {
|
100 | 101 | llvm::Regex trailingCap = llvm::Regex("([A-Z]+)([A-Z][a-z])");
|
101 | 102 | llvm::Regex leadingCap = llvm::Regex("([a-z0-9])([A-Z])");
|
102 | 103 |
|
103 |
| - std::string snakeCase = input.str(); |
104 |
| - for (int i = 0; i < 10; ++i) { |
105 |
| - snakeCase = trailingCap.sub("\\1_\\2", snakeCase); |
106 |
| - snakeCase = leadingCap.sub("\\1_\\2", snakeCase); |
107 |
| - } |
108 |
| - std::transform(snakeCase.begin(), snakeCase.end(), snakeCase.begin(), |
| 104 | + std::string curr = input.str(); |
| 105 | + std::string prev = input.str(); |
| 106 | + size_t iters = 0; |
| 107 | + do { |
| 108 | + prev = curr; |
| 109 | + curr = trailingCap.sub("\\1_\\2", prev); |
| 110 | + curr = leadingCap.sub("\\1_\\2", curr); |
| 111 | + } while (curr != prev && ++iters < input.size()); |
| 112 | + |
| 113 | + if (iters == input.size()) |
| 114 | + llvm::report_fatal_error( |
| 115 | + input + Twine(" couldn't be converted to snake case after ") + |
| 116 | + Twine(iters) + Twine("iterations.")); |
| 117 | + |
| 118 | + std::transform(curr.begin(), curr.end(), curr.begin(), |
109 | 119 | [](unsigned char c) { return std::tolower(c); });
|
110 |
| - return snakeCase; |
| 120 | + return curr; |
111 | 121 | }
|
112 | 122 |
|
113 | 123 | std::string llvm::convertToCamelFromSnakeCase(StringRef input,
|
|
0 commit comments