Browse Source

Fixed some incorrect behavior with nested types in the CheckAmbiguousOverloads pass by fixing GetFunctionOverloads to be dynamically dispatched instead of using some weird manual type checking.

pull/1/head
triton 12 years ago
parent
commit
e57c435426
  1. 2
      src/Bridge/Class.cs
  2. 2
      src/Bridge/Namespace.cs
  3. 12
      src/Generator/AST/Utils.cs
  4. 4
      src/Generator/Generators/CSharp/CSharpTextTemplate.cs
  5. 13
      src/Generator/Passes/CheckAmbiguousOverloads.cs

2
src/Bridge/Class.cs

@ -185,7 +185,7 @@ namespace CppSharp @@ -185,7 +185,7 @@ namespace CppSharp
return Variables.Where(v => v.OriginalName == originalName);
}
public new IEnumerable<Function> GetFunctionOverloads(Function function)
public override IEnumerable<Function> GetFunctionOverloads(Function function)
{
return Methods.Where(method => method.Name == function.Name)
.Cast<Function>();

2
src/Bridge/Namespace.cs

@ -202,7 +202,7 @@ namespace CppSharp @@ -202,7 +202,7 @@ namespace CppSharp
return Enums.Find(e => e.ItemsByName.ContainsKey(name));
}
public IList<Function> GetFunctionOverloads(Function function)
public virtual IEnumerable<Function> GetFunctionOverloads(Function function)
{
return Functions.Where(fn => fn.Name == function.Name)
.ToList();

12
src/Generator/AST/Utils.cs

@ -4,18 +4,6 @@ namespace CppSharp.AST @@ -4,18 +4,6 @@ namespace CppSharp.AST
{
public static class Utils
{
public static IEnumerable<Function> GetFunctionOverloads(Function function,
Class @class = null)
{
var overloads = new List<Function>();
if (@class == null)
{
var @namespace = function.Namespace;
return @namespace.GetFunctionOverloads(function);
}
return @class.GetFunctionOverloads(function);
}
}
}

4
src/Generator/Generators/CSharp/CSharpTextTemplate.cs

@ -134,7 +134,7 @@ namespace CppSharp.Generators.CSharp @@ -134,7 +134,7 @@ namespace CppSharp.Generators.CSharp
{
if (Transform != null)
{
Transform.GenerateStart(this);
//Transform.GenerateStart(this);
return;
}
@ -1448,7 +1448,7 @@ namespace CppSharp.Generators.CSharp @@ -1448,7 +1448,7 @@ namespace CppSharp.Generators.CSharp
identifier = GetOperatorIdentifier(method.OperatorKind);
}
var overloads = AST.Utils.GetFunctionOverloads(function, @class).ToList();
var overloads = function.Namespace.GetFunctionOverloads(function).ToList();
var index = overloads.IndexOf(function);
if (isNativeContext && index >= 0)

13
src/Generator/Passes/CheckAmbiguousOverloads.cs

@ -1,7 +1,6 @@ @@ -1,7 +1,6 @@
using System.Collections.Generic;
using System.Linq;
using CppSharp.Generators;
using CppSharp.Types;
namespace CppSharp.Passes
{
@ -56,7 +55,6 @@ namespace CppSharp.Passes @@ -56,7 +55,6 @@ namespace CppSharp.Passes
public class CheckAmbiguousOverloads : TranslationUnitPass
{
private Class currentClass;
private readonly ISet<Function> visited;
public CheckAmbiguousOverloads()
@ -76,8 +74,6 @@ namespace CppSharp.Passes @@ -76,8 +74,6 @@ namespace CppSharp.Passes
public override bool VisitClassDecl(Class @class)
{
visited.Clear();
currentClass = @class;
return base.VisitClassDecl(@class);
}
@ -101,7 +97,7 @@ namespace CppSharp.Passes @@ -101,7 +97,7 @@ namespace CppSharp.Passes
if (function.Ignore)
return false;
var overloads = AST.Utils.GetFunctionOverloads(function, currentClass);
var overloads = function.Namespace.GetFunctionOverloads(function);
var signatures = overloads.Select(fn => new OverloadSignature(fn)).ToList();
foreach (var sig1 in signatures)
@ -116,12 +112,13 @@ namespace CppSharp.Passes @@ -116,12 +112,13 @@ namespace CppSharp.Passes
if (sig2.Function.Ignore)
continue;
if (!OverloadSignature.IsAmbiguous(sig1, sig2, currentClass))
var @class = function.Namespace as Class;
if (!OverloadSignature.IsAmbiguous(sig1, sig2, @class))
continue;
Driver.Diagnostics.EmitWarning(DiagnosticId.AmbiguousOverload,
"Overload {0}::{1} is ambiguous, renaming automatically",
currentClass.OriginalName, sig1.Function.QualifiedOriginalName);
"Overload {0} is ambiguous, renaming automatically",
sig1.Function.QualifiedOriginalName);
RenameOverload(sig1.Function);
return false;

Loading…
Cancel
Save