Browse Source

Extend finding of functions to also get overloads

Signed-off-by: Dimitar Dobrev <dpldobrev@protonmail.com>
pull/1635/head
Dimitar Dobrev 4 years ago
parent
commit
15a55483ff
  1. 3
      src/AST/ASTContext.cs
  2. 22
      src/AST/Namespace.cs
  3. 2
      src/Generator/Library.cs

3
src/AST/ASTContext.cs

@ -92,8 +92,7 @@ namespace CppSharp.AST
/// Finds an existing function in the library modules. /// Finds an existing function in the library modules.
public IEnumerable<Function> FindFunction(string name) public IEnumerable<Function> FindFunction(string name)
{ {
return TranslationUnits.Select(module => module.FindFunction(name)) return TranslationUnits.SelectMany(module => module.FindFunction(name));
.Where(type => type != null);
} }
/// Finds an existing typedef in the library modules. /// Finds an existing typedef in the library modules.

22
src/AST/Namespace.cs

@ -160,33 +160,33 @@ namespace CppSharp.AST
return Enums.FirstOrDefault(f => f.OriginalPtr == ptr); return Enums.FirstOrDefault(f => f.OriginalPtr == ptr);
} }
public Function FindFunction(string name, bool createDecl = false) public IEnumerable<Function> FindFunction(string name, bool createDecl = false)
{ {
if (string.IsNullOrEmpty(name)) if (string.IsNullOrEmpty(name))
return null; return Enumerable.Empty<Function>();
var entries = name.Split(new string[] { "::" }, var entries = name.Split(new string[] { "::" },
StringSplitOptions.RemoveEmptyEntries).ToList(); StringSplitOptions.RemoveEmptyEntries).ToList();
if (entries.Count <= 1) if (entries.Count <= 1)
{ {
var function = Functions.FirstOrDefault(e => e.Name.Equals(name)); var functions = Functions.Where(e => e.Name.Equals(name));
if (function == null && createDecl) if (!functions.Any() && createDecl)
{ {
function = new Function() { Name = name, Namespace = this }; var function = new Function() { Name = name, Namespace = this };
Declarations.Add(function); Declarations.Add(function);
} }
return function; return functions;
} }
var funcName = entries[entries.Count - 1]; var funcName = entries[^1];
var namespaces = entries.Take(entries.Count - 1); var namespaces = entries.Take(entries.Count - 1);
var @namespace = FindNamespace(namespaces); var @namespace = FindNamespace(namespaces);
if (@namespace == null) if (@namespace == null)
return null; return Enumerable.Empty<Function>();
return @namespace.FindFunction(funcName, createDecl); return @namespace.FindFunction(funcName, createDecl);
} }
@ -201,14 +201,12 @@ namespace CppSharp.AST
Class CreateClass(string name, bool isComplete) Class CreateClass(string name, bool isComplete)
{ {
var @class = new Class return new Class
{ {
Name = name, Name = name,
Namespace = this, Namespace = this,
IsIncomplete = !isComplete IsIncomplete = !isComplete
}; };
return @class;
} }
public Class FindClass(string name, public Class FindClass(string name,
@ -316,7 +314,7 @@ namespace CppSharp.AST
public T FindType<T>(string name) where T : Declaration public T FindType<T>(string name) where T : Declaration
{ {
var type = FindEnum(name) var type = FindEnum(name)
?? FindFunction(name) ?? FindFunction(name).FirstOrDefault()
?? (Declaration)FindClass(name) ?? (Declaration)FindClass(name)
?? FindTypedef(name); ?? FindTypedef(name);

2
src/Generator/Library.cs

@ -533,7 +533,7 @@ namespace CppSharp
public static IEnumerable<Function> FindFunction(this ASTContext context, string name) public static IEnumerable<Function> FindFunction(this ASTContext context, string name)
{ {
return context.TranslationUnits return context.TranslationUnits
.Select(module => module.FindFunction(name)) .SelectMany(module => module.FindFunction(name))
.Where(function => function != null); .Where(function => function != null);
} }

Loading…
Cancel
Save