From 399ffdabe36818b920fd7a32a23fb83fb1d79199 Mon Sep 17 00:00:00 2001 From: Dimitar Dobrev Date: Wed, 6 Jul 2016 02:30:13 +0300 Subject: [PATCH] Generated properties from "get_" and "set_" prefixes as well. Signed-off-by: Dimitar Dobrev --- .../GetterSetterToPropertyAdvancedPass.cs | 49 +++++++++++++------ tests/CSharp/CSharp.Tests.cs | 1 + tests/CSharp/CSharp.cpp | 9 ++++ tests/CSharp/CSharp.h | 2 + 4 files changed, 46 insertions(+), 15 deletions(-) diff --git a/src/Generator/Passes/GetterSetterToPropertyAdvancedPass.cs b/src/Generator/Passes/GetterSetterToPropertyAdvancedPass.cs index 5402b6e6..1dc770bb 100644 --- a/src/Generator/Passes/GetterSetterToPropertyAdvancedPass.cs +++ b/src/Generator/Passes/GetterSetterToPropertyAdvancedPass.cs @@ -49,8 +49,9 @@ namespace CppSharp.Passes { foreach (var setter in settersToUse) { - Class type = (Class) setter.Namespace; - StringBuilder nameBuilder = new StringBuilder(setter.Name.Substring(3)); + var type = (Class) setter.Namespace; + var firstWord = GetFirstWord(setter.Name); + var nameBuilder = new StringBuilder(setter.Name.Substring(firstWord.Length)); if (char.IsLower(setter.Name[0])) nameBuilder[0] = char.ToLowerInvariant(nameBuilder[0]); string afterSet = nameBuilder.ToString(); @@ -201,7 +202,8 @@ namespace CppSharp.Passes private static string GetPropertyName(string name) { - if (GetFirstWord(name) == "get" && name != "get") + var firstWord = GetFirstWord(name); + if (Match(firstWord, new[] { "get" }) && name != firstWord) { if (char.IsLower(name[0])) { @@ -221,7 +223,8 @@ namespace CppSharp.Passes private void DistributeMethod(Method method) { - if (GetFirstWord(method.Name) == "set" && method.Name.Length > 3 && + var firstWord = GetFirstWord(method.Name); + if (Match(firstWord, new[] { "set" }) && method.Name.Length > firstWord.Length && method.OriginalReturnType.Type.IsPrimitiveType(PrimitiveType.Void)) { if (method.Parameters.Count == 1) @@ -244,21 +247,37 @@ namespace CppSharp.Passes (method.OriginalReturnType.Type.IsPrimitiveType(PrimitiveType.Void)) || method.Parameters.Any(p => p.Kind != ParameterKind.IndirectReturnType)) return false; - var result = GetFirstWord(method.Name); - return (result.Length < method.Name.Length && - (result == "get" || result == "is" || result == "has")) || - (result != "to" && result != "new" && !verbs.Contains(result)); + var firstWord = GetFirstWord(method.Name); + return (firstWord.Length < method.Name.Length && + Match(firstWord, new[] { "get", "is", "has" })) || + (!Match(firstWord, new[] { "to", "new" }) && !verbs.Contains(firstWord)); + } + + private static bool Match(string prefix, IEnumerable prefixes) + { + return prefixes.Any(p => prefix == p || prefix == p + '_'); } private static string GetFirstWord(string name) { - List firstVerb = new List - { - char.ToLowerInvariant(name[0]) - }; - firstVerb.AddRange(name.Skip(1).TakeWhile( - c => char.IsLower(c) || !char.IsLetterOrDigit(c))); - return new string(firstVerb.ToArray()); + var firstWord = new List { char.ToLowerInvariant(name[0]) }; + for (int i = 1; i < name.Length; i++) + { + var c = name[i]; + if (char.IsLower(c)) + { + firstWord.Add(c); + continue; + } + if (c == '_') + { + firstWord.Add(c); + break; + } + if (char.IsUpper(c)) + break; + } + return new string(firstWord.ToArray()); } } diff --git a/tests/CSharp/CSharp.Tests.cs b/tests/CSharp/CSharp.Tests.cs index d91b4f1a..42ceed1f 100644 --- a/tests/CSharp/CSharp.Tests.cs +++ b/tests/CSharp/CSharp.Tests.cs @@ -36,6 +36,7 @@ public unsafe class CSharpTests : GeneratorTestFixture { var isNoParams = foo.IsNoParams; foo.SetNoParams(); + foo.Width = 5; } using (var hasOverride = new HasOverrideOfHasPropertyWithDerivedType()) hasOverride.CauseRenamingError(); diff --git a/tests/CSharp/CSharp.cpp b/tests/CSharp/CSharp.cpp index 7c993ec1..e45490b6 100644 --- a/tests/CSharp/CSharp.cpp +++ b/tests/CSharp/CSharp.cpp @@ -49,6 +49,15 @@ void Foo::takesStdVector(const std::vector& vector) { } +int Foo::width() +{ + return 1; +} + +void Foo::set_width(int value) +{ +} + const int Foo::rename; int Foo::makeFunctionCall() diff --git a/tests/CSharp/CSharp.h b/tests/CSharp/CSharp.h index 5b66fa65..e76fe8ba 100644 --- a/tests/CSharp/CSharp.h +++ b/tests/CSharp/CSharp.h @@ -19,6 +19,8 @@ public: void setNoParams(); void foo(int i); void takesStdVector(const std::vector& vector); + int width(); + void set_width(int value); static const int rename = 5; static int makeFunctionCall();