diff --git a/src/Generator.Tests/Passes/TestPasses.cs b/src/Generator.Tests/Passes/TestPasses.cs index 2b2905c4..da3b036f 100644 --- a/src/Generator.Tests/Passes/TestPasses.cs +++ b/src/Generator.Tests/Passes/TestPasses.cs @@ -121,7 +121,7 @@ namespace CppSharp.Generator.Tests.Passes Assert.That(@enum.Name, Is.EqualTo("ScreamingEnum")); Assert.That(enumItem.Name, Is.EqualTo("SnakeValue")); - AssertConversion("test_123", "Test123"); + AssertConversion("test_123_123", "Test123_123"); AssertConversion("SCREAMING", "Screaming"); AssertConversion("Not_Screaming", "NotScreaming"); AssertConversion("Still_Not___Screaming", "StillNot___Screaming"); @@ -131,11 +131,14 @@ namespace CppSharp.Generator.Tests.Passes AssertConversion("_d_", "_d_"); AssertConversion("MyCool2d_string", "MyCool2dString"); AssertConversion("MyCool2_d_String", "MyCool2D_String"); + AssertConversion("MyCoolD_d_String", "MyCoolD_dString"); AssertConversion("MyC_de_cool", "MyC_deCool"); AssertConversion("m_d_d_d", "M_dD_d"); + AssertConversion("m_d_d_d", "mD_dD", RenameCasePattern.LowerCamelCase); AssertConversion("__m_d_d_d", "__mD_dD"); AssertConversion("mProperty", "MProperty"); AssertConversion("mProperty", "mProperty", RenameCasePattern.LowerCamelCase); + AssertConversion("m_property", "mProperty", RenameCasePattern.LowerCamelCase); void AssertConversion(string input, string output, RenameCasePattern pattern = RenameCasePattern.UpperCamelCase) => Assert.That(CaseRenamePass.ConvertCaseString(new Class { Name = input }, pattern), diff --git a/src/Generator/Passes/RenamePass.cs b/src/Generator/Passes/RenamePass.cs index 244c0885..6c75812a 100644 --- a/src/Generator/Passes/RenamePass.cs +++ b/src/Generator/Passes/RenamePass.cs @@ -410,8 +410,12 @@ namespace CppSharp.Passes char? next = i < decl.Name.Length - 1 ? decl.Name[i + 1] : null; if (c == '_' - && next != null && i - 1 != startIndex + && next != null + // Prevent two capitals in a row caused by later uppercasing of first char. + && (i - 1 != startIndex || pattern == RenameCasePattern.LowerCamelCase) + // Ignore multiple underscores in a row. && prev != '_' && next != '_' + // Don't join digits. && (IsLetter(prev) || IsLetter(next)) && !justHadSeparator) { @@ -423,7 +427,7 @@ namespace CppSharp.Passes // CamelCase separator. justHadSeparator = IsLower(prev) && IsUpper(c); - sb.Append(!IsUpper(prev) ? c : char.ToLowerInvariant(c)); + sb.Append(IsUpper(prev) ? char.ToLowerInvariant(c) : c); // Nullable helper functions. bool IsLetter(char? ch) => IsUpper(ch) || IsLower(ch);