Browse Source

Merge pull request #282 from ddobrev/master

Fixed the renaming pass to account for overloads of functions
pull/283/head
João Matos 11 years ago
parent
commit
1e4553c6b6
  1. 4
      src/AST/Class.cs
  2. 2
      src/AST/ClassExtensions.cs
  3. 8
      src/Generator.Tests/Passes/TestPasses.cs
  4. 1
      src/Generator/Passes/GenerateAbstractImplementationsPass.cs
  5. 32
      src/Generator/Passes/RenamePass.cs
  6. 7
      tests/CSharpTemp/CSharpTemp.h

4
src/AST/Class.cs

@ -213,8 +213,8 @@ namespace CppSharp.AST
if (function.IsOperator) if (function.IsOperator)
return Methods.Where(fn => fn.OperatorKind == function.OperatorKind); return Methods.Where(fn => fn.OperatorKind == function.OperatorKind);
var methods = Methods.Where(m => m.Name == function.Name); var methods = Methods.Where(m => m.Name == function.Name).ToList();
if (methods.ToList().Count != 0) if (methods.Count != 0)
return methods; return methods;
return base.GetOverloads(function); return base.GetOverloads(function);

2
src/AST/ClassExtensions.cs

@ -52,7 +52,6 @@ namespace CppSharp.AST
where where
method.Name == @override.Name && method.Name == @override.Name &&
method.ReturnType == @override.ReturnType && method.ReturnType == @override.ReturnType &&
method.Parameters.Count == @override.Parameters.Count &&
method.Parameters.SequenceEqual(@override.Parameters, method.Parameters.SequenceEqual(@override.Parameters,
new ParameterTypeComparer()) new ParameterTypeComparer())
select method).FirstOrDefault() select method).FirstOrDefault()
@ -69,7 +68,6 @@ namespace CppSharp.AST
from property in @base.Class.Properties from property in @base.Class.Properties
where where
property.Name == @override.Name && property.Name == @override.Name &&
property.Parameters.Count == @override.Parameters.Count &&
property.Parameters.SequenceEqual(@override.Parameters, property.Parameters.SequenceEqual(@override.Parameters,
new ParameterTypeComparer()) new ParameterTypeComparer())
select property).FirstOrDefault() select property).FirstOrDefault()

8
src/Generator.Tests/Passes/TestPasses.cs

@ -1,7 +1,7 @@
using System.Linq; using CppSharp.AST;
using CppSharp; using CppSharp.Generators.CSharp;
using System.Linq;
using CppSharp.Passes; using CppSharp.Passes;
using CppSharp.AST;
using NUnit.Framework; using NUnit.Framework;
namespace CppSharp.Generator.Tests.Passes namespace CppSharp.Generator.Tests.Passes
@ -70,6 +70,8 @@ namespace CppSharp.Generator.Tests.Passes
[Test] [Test]
public void TestCaseRenamePass() public void TestCaseRenamePass()
{ {
Type.TypePrinterDelegate += type => type.Visit(new CSharpTypePrinter(Driver)).Type;
var c = AstContext.Class("TestRename"); var c = AstContext.Class("TestRename");
var method = c.Method("lowerCaseMethod"); var method = c.Method("lowerCaseMethod");

1
src/Generator/Passes/GenerateAbstractImplementationsPass.cs

@ -105,7 +105,6 @@ namespace CppSharp.Passes
var @abstract = abstractMethods[i]; var @abstract = abstractMethods[i];
if (overriddenMethods.Find(m => m.Name == @abstract.Name && if (overriddenMethods.Find(m => m.Name == @abstract.Name &&
m.ReturnType == @abstract.ReturnType && m.ReturnType == @abstract.ReturnType &&
m.Parameters.Count == @abstract.Parameters.Count &&
m.Parameters.SequenceEqual(@abstract.Parameters, paramTypeCmp)) != null) m.Parameters.SequenceEqual(@abstract.Parameters, paramTypeCmp)) != null)
{ {
abstractMethods.RemoveAt(i); abstractMethods.RemoveAt(i);

32
src/Generator/Passes/RenamePass.cs

@ -13,6 +13,19 @@ namespace CppSharp.Passes
/// </summary> /// </summary>
public abstract class RenamePass : TranslationUnitPass public abstract class RenamePass : TranslationUnitPass
{ {
public class ParameterMappedTypeComparer : IEqualityComparer<Parameter>
{
public bool Equals(Parameter x, Parameter y)
{
return x.QualifiedType.ToString() == y.QualifiedType.ToString();
}
public int GetHashCode(Parameter obj)
{
return obj.Type.GetHashCode();
}
}
public RenameTargets Targets = RenameTargets.Any; public RenameTargets Targets = RenameTargets.Any;
protected RenamePass() protected RenamePass()
@ -90,6 +103,13 @@ namespace CppSharp.Passes
declarations.AddRange(decl.Namespace.Classes.Where(c => !c.IsIncomplete)); declarations.AddRange(decl.Namespace.Classes.Where(c => !c.IsIncomplete));
declarations.AddRange(decl.Namespace.Enums); declarations.AddRange(decl.Namespace.Enums);
declarations.AddRange(decl.Namespace.Events); declarations.AddRange(decl.Namespace.Events);
var function = decl as Function;
if (function != null)
{
// account for overloads
declarations.AddRange(GetFunctionsWithTheSameParams(function));
}
else
declarations.AddRange(decl.Namespace.Functions); declarations.AddRange(decl.Namespace.Functions);
declarations.AddRange(decl.Namespace.Variables); declarations.AddRange(decl.Namespace.Variables);
declarations.AddRange(from typedefDecl in decl.Namespace.Typedefs declarations.AddRange(from typedefDecl in decl.Namespace.Typedefs
@ -108,6 +128,18 @@ namespace CppSharp.Passes
return ((Class) method.Namespace).GetPropertyByName(newName) != null; return ((Class) method.Namespace).GetPropertyByName(newName) != null;
} }
private static IEnumerable<Function> GetFunctionsWithTheSameParams(Function function)
{
var method = function as Method;
if (method != null)
{
return ((Class) method.Namespace).Methods.Where(
m => m.Parameters.SequenceEqual(function.Parameters, new ParameterMappedTypeComparer()));
}
return function.Namespace.Functions.Where(
f => f.Parameters.SequenceEqual(function.Parameters, new ParameterMappedTypeComparer()));
}
public override bool VisitEnumItem(Enumeration.Item item) public override bool VisitEnumItem(Enumeration.Item item)
{ {
if (!Targets.HasFlag(RenameTargets.EnumItem)) if (!Targets.HasFlag(RenameTargets.EnumItem))

7
tests/CSharpTemp/CSharpTemp.h

@ -158,3 +158,10 @@ public:
int A; int A;
float B; float B;
}; };
class DLL_API TestRenaming
{
public:
void name();
void Name();
};

Loading…
Cancel
Save