Browse Source

Add `IgnoreConversionToProperty(pattern)` and `ForceConversionToProperty(pattern)`.

pull/1028/head
Rokas Kupstys 9 years ago
parent
commit
a03a0ea0c5
  1. 5
      src/AST/Method.cs
  2. 50
      src/Generator/Library.cs
  3. 5
      src/Generator/Passes/GetterSetterToPropertyPass.cs

5
src/AST/Method.cs

@ -105,6 +105,7 @@ namespace CppSharp.AST
SynthKind = method.SynthKind; SynthKind = method.SynthKind;
AdjustedOffset = method.AdjustedOffset; AdjustedOffset = method.AdjustedOffset;
OverriddenMethods.AddRange(method.OverriddenMethods); OverriddenMethods.AddRange(method.OverriddenMethods);
ConvertToProperty = method.ConvertToProperty;
} }
public Method(Function function) public Method(Function function)
@ -172,6 +173,8 @@ namespace CppSharp.AST
public List<Method> OverriddenMethods { get; } = new List<Method>(); public List<Method> OverriddenMethods { get; } = new List<Method>();
public bool ConvertToProperty { get; set; }
public Method GetRootBaseMethod() public Method GetRootBaseMethod()
{ {
return BaseMethod == null || BaseMethod.BaseMethod == null ? return BaseMethod == null || BaseMethod.BaseMethod == null ?
@ -185,4 +188,4 @@ namespace CppSharp.AST
private bool? isOverride; private bool? isOverride;
} }
} }

50
src/Generator/Library.cs

@ -4,6 +4,7 @@ using System.Globalization;
using System.Linq; using System.Linq;
using System.Text.RegularExpressions; using System.Text.RegularExpressions;
using CppSharp.AST; using CppSharp.AST;
using CppSharp.Passes;
namespace CppSharp namespace CppSharp
{ {
@ -351,6 +352,53 @@ namespace CppSharp
} }
} }
private static IEnumerable<Class> GetClasses(DeclarationContext decl)
{
foreach (var @class in decl.Classes)
{
yield return @class;
foreach (var class2 in GetClasses(@class))
yield return class2;
}
foreach (var ns in decl.Namespaces)
{
foreach (var @class in GetClasses(ns))
yield return @class;
}
}
public static void IgnoreConversionToProperty(this ASTContext context, string pattern)
{
foreach (var unit in context.TranslationUnits)
{
foreach (var @class in GetClasses(unit))
{
foreach (var method in @class.Methods)
{
if (Regex.Match(method.QualifiedLogicalOriginalName, pattern).Success)
method.ExcludeFromPasses.Add(typeof(GetterSetterToPropertyPass));
}
}
}
}
public static void ForceConversionToProperty(this ASTContext context, string pattern)
{
foreach (var unit in context.TranslationUnits)
{
foreach (var @class in GetClasses(unit))
{
foreach (var method in @class.Methods)
{
if (Regex.Match(method.QualifiedLogicalOriginalName, pattern).Success)
method.ConvertToProperty = true;
}
}
}
}
#endregion #endregion
#region Module Helpers #region Module Helpers
@ -379,4 +427,4 @@ namespace CppSharp
#endregion #endregion
} }
} }

5
src/Generator/Passes/GetterSetterToPropertyPass.cs

@ -25,7 +25,8 @@ namespace CppSharp.Passes
{ {
this.useHeuristics = useHeuristics; this.useHeuristics = useHeuristics;
foreach (var method in @class.Methods.Where( foreach (var method in @class.Methods.Where(
m => !m.IsConstructor && !m.IsDestructor && !m.IsOperator && m.IsGenerated)) m => !m.IsConstructor && !m.IsDestructor && !m.IsOperator && m.IsGenerated &&
!m.ExcludeFromPasses.Contains(typeof(GetterSetterToPropertyPass))))
DistributeMethod(method); DistributeMethod(method);
} }
@ -261,7 +262,7 @@ namespace CppSharp.Passes
} }
else else
{ {
if (IsGetter(method)) if (method.ConvertToProperty || IsGetter(method))
getters.Add(method); getters.Add(method);
if (method.Parameters.All(p => p.Kind == ParameterKind.IndirectReturnType)) if (method.Parameters.All(p => p.Kind == ParameterKind.IndirectReturnType))
nonSetters.Add(method); nonSetters.Add(method);

Loading…
Cancel
Save