Browse Source

Generated properties from "get_" and "set_" prefixes as well.

Signed-off-by: Dimitar Dobrev <dpldobrev@protonmail.com>
pull/661/head
Dimitar Dobrev 9 years ago
parent
commit
399ffdabe3
  1. 47
      src/Generator/Passes/GetterSetterToPropertyAdvancedPass.cs
  2. 1
      tests/CSharp/CSharp.Tests.cs
  3. 9
      tests/CSharp/CSharp.cpp
  4. 2
      tests/CSharp/CSharp.h

47
src/Generator/Passes/GetterSetterToPropertyAdvancedPass.cs

@ -49,8 +49,9 @@ namespace CppSharp.Passes
{ {
foreach (var setter in settersToUse) foreach (var setter in settersToUse)
{ {
Class type = (Class) setter.Namespace; var type = (Class) setter.Namespace;
StringBuilder nameBuilder = new StringBuilder(setter.Name.Substring(3)); var firstWord = GetFirstWord(setter.Name);
var nameBuilder = new StringBuilder(setter.Name.Substring(firstWord.Length));
if (char.IsLower(setter.Name[0])) if (char.IsLower(setter.Name[0]))
nameBuilder[0] = char.ToLowerInvariant(nameBuilder[0]); nameBuilder[0] = char.ToLowerInvariant(nameBuilder[0]);
string afterSet = nameBuilder.ToString(); string afterSet = nameBuilder.ToString();
@ -201,7 +202,8 @@ namespace CppSharp.Passes
private static string GetPropertyName(string name) 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])) if (char.IsLower(name[0]))
{ {
@ -221,7 +223,8 @@ namespace CppSharp.Passes
private void DistributeMethod(Method method) 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)) method.OriginalReturnType.Type.IsPrimitiveType(PrimitiveType.Void))
{ {
if (method.Parameters.Count == 1) if (method.Parameters.Count == 1)
@ -244,21 +247,37 @@ namespace CppSharp.Passes
(method.OriginalReturnType.Type.IsPrimitiveType(PrimitiveType.Void)) || (method.OriginalReturnType.Type.IsPrimitiveType(PrimitiveType.Void)) ||
method.Parameters.Any(p => p.Kind != ParameterKind.IndirectReturnType)) method.Parameters.Any(p => p.Kind != ParameterKind.IndirectReturnType))
return false; return false;
var result = GetFirstWord(method.Name); var firstWord = GetFirstWord(method.Name);
return (result.Length < method.Name.Length && return (firstWord.Length < method.Name.Length &&
(result == "get" || result == "is" || result == "has")) || Match(firstWord, new[] { "get", "is", "has" })) ||
(result != "to" && result != "new" && !verbs.Contains(result)); (!Match(firstWord, new[] { "to", "new" }) && !verbs.Contains(firstWord));
}
private static bool Match(string prefix, IEnumerable<string> prefixes)
{
return prefixes.Any(p => prefix == p || prefix == p + '_');
} }
private static string GetFirstWord(string name) private static string GetFirstWord(string name)
{ {
List<char> firstVerb = new List<char> var firstWord = new List<char> { char.ToLowerInvariant(name[0]) };
for (int i = 1; i < name.Length; i++)
{ {
char.ToLowerInvariant(name[0]) var c = name[i];
}; if (char.IsLower(c))
firstVerb.AddRange(name.Skip(1).TakeWhile( {
c => char.IsLower(c) || !char.IsLetterOrDigit(c))); firstWord.Add(c);
return new string(firstVerb.ToArray()); continue;
}
if (c == '_')
{
firstWord.Add(c);
break;
}
if (char.IsUpper(c))
break;
}
return new string(firstWord.ToArray());
} }
} }

1
tests/CSharp/CSharp.Tests.cs

@ -36,6 +36,7 @@ public unsafe class CSharpTests : GeneratorTestFixture
{ {
var isNoParams = foo.IsNoParams; var isNoParams = foo.IsNoParams;
foo.SetNoParams(); foo.SetNoParams();
foo.Width = 5;
} }
using (var hasOverride = new HasOverrideOfHasPropertyWithDerivedType()) using (var hasOverride = new HasOverrideOfHasPropertyWithDerivedType())
hasOverride.CauseRenamingError(); hasOverride.CauseRenamingError();

9
tests/CSharp/CSharp.cpp

@ -49,6 +49,15 @@ void Foo::takesStdVector(const std::vector<int>& vector)
{ {
} }
int Foo::width()
{
return 1;
}
void Foo::set_width(int value)
{
}
const int Foo::rename; const int Foo::rename;
int Foo::makeFunctionCall() int Foo::makeFunctionCall()

2
tests/CSharp/CSharp.h

@ -19,6 +19,8 @@ public:
void setNoParams(); void setNoParams();
void foo(int i); void foo(int i);
void takesStdVector(const std::vector<int>& vector); void takesStdVector(const std::vector<int>& vector);
int width();
void set_width(int value);
static const int rename = 5; static const int rename = 5;
static int makeFunctionCall(); static int makeFunctionCall();

Loading…
Cancel
Save