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
return Variables.Where(v => v.OriginalName == originalName); 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) return Methods.Where(method => method.Name == function.Name)
.Cast<Function>(); .Cast<Function>();

2
src/Bridge/Namespace.cs

@ -202,7 +202,7 @@ namespace CppSharp
return Enums.Find(e => e.ItemsByName.ContainsKey(name)); 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) return Functions.Where(fn => fn.Name == function.Name)
.ToList(); .ToList();

12
src/Generator/AST/Utils.cs

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

13
src/Generator/Passes/CheckAmbiguousOverloads.cs

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

Loading…
Cancel
Save