|
@@ -48,37 +48,45 @@ namespace Google.ProtocolBuffers
|
|
|
{
|
|
|
public static string UnderscoresToPascalCase(string input)
|
|
|
{
|
|
|
- return UnderscoresToPascalOrCamelCase(input, true);
|
|
|
+ string name = UnderscoresToUpperCase(input);
|
|
|
+
|
|
|
+ // Pascal case always begins with upper-case letter
|
|
|
+ if (Char.IsLower(name[0]))
|
|
|
+ {
|
|
|
+ char[] chars = name.ToCharArray();
|
|
|
+ chars[0] = char.ToUpper(chars[0]);
|
|
|
+ return new string(chars);
|
|
|
+ }
|
|
|
+ return name;
|
|
|
}
|
|
|
|
|
|
public static string UnderscoresToCamelCase(string input)
|
|
|
{
|
|
|
- return UnderscoresToPascalOrCamelCase(input, false);
|
|
|
+ string name = UnderscoresToUpperCase(input);
|
|
|
+
|
|
|
+ // Camel case always begins with lower-case letter
|
|
|
+ if (Char.IsUpper(name[0]))
|
|
|
+ {
|
|
|
+ char[] chars = name.ToCharArray();
|
|
|
+ chars[0] = char.ToLower(chars[0]);
|
|
|
+ return new string(chars);
|
|
|
+ }
|
|
|
+ return name;
|
|
|
}
|
|
|
|
|
|
/// <summary>
|
|
|
- /// Converts a string to Pascal or Camel case. The first letter is capitalized or
|
|
|
- /// lower-cased depending on <paramref name="pascal"/> is true.
|
|
|
- /// After the first letter, any punctuation is removed but triggers capitalization
|
|
|
- /// of the next letter. Digits are preserved but trigger capitalization of the next
|
|
|
- /// letter.
|
|
|
- /// All capitalisation is done in the invariant culture.
|
|
|
+ /// Capitalizes any characters following an '_' or a number '0' - '9' and removes
|
|
|
+ /// all non alpha-numberic characters. If the resulting string begins with a number
|
|
|
+ /// an '_' will be prefixed.
|
|
|
/// </summary>
|
|
|
- private static string UnderscoresToPascalOrCamelCase(string input, bool pascal)
|
|
|
+ private static string UnderscoresToUpperCase(string input)
|
|
|
{
|
|
|
- string name = Transform(input, pascal ? UnderlineToPascal : UnderlineToCamel, x => x.Value.TrimStart('_').ToUpper());
|
|
|
+ string name = Transform(input, UnderlineCharacter, x => x.Value.ToUpper());
|
|
|
+ name = Transform(name, InvalidCharacters, x => String.Empty);
|
|
|
|
|
|
if (name.Length == 0)
|
|
|
throw new ArgumentException(String.Format("The field name '{0}' is invalid.", input));
|
|
|
|
|
|
- // Pascal case always begins with lower-case letter
|
|
|
- if (!pascal && Char.IsUpper(name[0]))
|
|
|
- {
|
|
|
- char[] chars = name.ToCharArray();
|
|
|
- chars[0] = char.ToLower(chars[0]);
|
|
|
- return new string(chars);
|
|
|
- }
|
|
|
-
|
|
|
// Fields can not start with a number
|
|
|
if (Char.IsNumber(name[0]))
|
|
|
name = '_' + name;
|
|
@@ -110,14 +118,14 @@ namespace Google.ProtocolBuffers
|
|
|
}
|
|
|
|
|
|
/// <summary>
|
|
|
- /// Similar to UnderlineToCamel, but also matches the first character if it is lower-case
|
|
|
+ /// All characters that are not alpha-numberic
|
|
|
/// </summary>
|
|
|
- private static Regex UnderlineToPascal = new Regex(@"(?:(?:^|[0-9_])[a-z])|_");
|
|
|
+ private static Regex InvalidCharacters = new Regex(@"[^a-zA-Z0-9]+");
|
|
|
|
|
|
/// <summary>
|
|
|
/// Matches lower-case character that follow either an underscore, or a number
|
|
|
/// </summary>
|
|
|
- private static Regex UnderlineToCamel = new Regex(@"(?:[0-9_][a-z])|_");
|
|
|
+ private static Regex UnderlineCharacter = new Regex(@"[0-9_][a-z]");
|
|
|
|
|
|
/// <summary>
|
|
|
/// Used for text-template transformation where a regex match is replaced in the input string.
|