Browse Source

Fixed the FindOperator method for classes.

Added AST test case and fixed line endings (LF).
pull/237/head
Elias Holzer 11 years ago
parent
commit
487189ebad
  1. 15
      src/AST/Class.cs
  2. 152
      src/AST/Namespace.cs
  3. 9
      src/Generator.Tests/AST/TestAST.cs
  4. 16
      tests/Native/AST.h

15
src/AST/Class.cs

@ -149,8 +149,8 @@ namespace CppSharp.AST @@ -149,8 +149,8 @@ namespace CppSharp.AST
{
foreach (var @base in Bases)
{
if (@base.IsClass && @base.Class.IsDeclared)
return @base.Class;
if (@base.IsClass && @base.Class.IsDeclared)
return @base.Class;
}
return null;
@ -199,11 +199,16 @@ namespace CppSharp.AST @@ -199,11 +199,16 @@ namespace CppSharp.AST
}
}
public override IEnumerable<Function> FindOperator(CXXOperatorKind kind)
{
return Methods.Where(m => m.OperatorKind == kind);
}
public override IEnumerable<Function> GetOverloads(Function function)
{
if (function.IsOperator)
return Methods.Where(fn => fn.OperatorKind == function.OperatorKind);
if (function.IsOperator)
return Methods.Where(fn => fn.OperatorKind == function.OperatorKind);
var methods = Methods.Where(m => m.Name == function.Name);
if (methods.ToList().Count != 0)
return methods;

152
src/AST/Namespace.cs

@ -25,16 +25,16 @@ namespace CppSharp.AST @@ -25,16 +25,16 @@ namespace CppSharp.AST
public Dictionary<ulong, Declaration> Anonymous;
// True if the context is inside an extern "C" context.
public bool IsExternCContext;
public override string LogicalName
{
get { return IsAnonymous ? "<anonymous>" : base.Name; }
}
public override string LogicalOriginalName
{
get { return IsAnonymous ? "<anonymous>" : base.OriginalName; }
public bool IsExternCContext;
public override string LogicalName
{
get { return IsAnonymous ? "<anonymous>" : base.Name; }
}
public override string LogicalOriginalName
{
get { return IsAnonymous ? "<anonymous>" : base.OriginalName; }
}
protected DeclarationContext()
@ -71,25 +71,25 @@ namespace CppSharp.AST @@ -71,25 +71,25 @@ namespace CppSharp.AST
public Declaration FindAnonymous(ulong key)
{
return Anonymous.ContainsKey(key) ? Anonymous[key] : null;
}
public DeclarationContext FindDeclaration(IEnumerable<string> declarations)
{
DeclarationContext currentDeclaration = this;
foreach (var declaration in declarations)
{
var subDeclaration = currentDeclaration.Namespaces
.Concat<DeclarationContext>(currentDeclaration.Classes)
.FirstOrDefault(e => e.Name.Equals(declaration));
if (subDeclaration == null)
return null;
currentDeclaration = subDeclaration;
}
return currentDeclaration as DeclarationContext;
}
public DeclarationContext FindDeclaration(IEnumerable<string> declarations)
{
DeclarationContext currentDeclaration = this;
foreach (var declaration in declarations)
{
var subDeclaration = currentDeclaration.Namespaces
.Concat<DeclarationContext>(currentDeclaration.Classes)
.FirstOrDefault(e => e.Name.Equals(declaration));
if (subDeclaration == null)
return null;
currentDeclaration = subDeclaration;
}
return currentDeclaration as DeclarationContext;
}
public Namespace FindNamespace(string name)
@ -165,34 +165,34 @@ namespace CppSharp.AST @@ -165,34 +165,34 @@ namespace CppSharp.AST
}
public Function FindFunction(string name, bool createDecl = false)
{
if (string.IsNullOrEmpty(name))
return null;
var entries = name.Split(new string[] { "::" },
StringSplitOptions.RemoveEmptyEntries).ToList();
if (entries.Count <= 1)
{
var function = Functions.Find(e => e.Name.Equals(name));
if (function == null && createDecl)
{
function = new Function() { Name = name, Namespace = this };
Functions.Add(function);
}
return function;
}
var funcName = entries[entries.Count - 1];
var namespaces = entries.Take(entries.Count - 1);
var @namespace = FindNamespace(namespaces);
if (@namespace == null)
return null;
return @namespace.FindFunction(funcName, createDecl);
{
if (string.IsNullOrEmpty(name))
return null;
var entries = name.Split(new string[] { "::" },
StringSplitOptions.RemoveEmptyEntries).ToList();
if (entries.Count <= 1)
{
var function = Functions.Find(e => e.Name.Equals(name));
if (function == null && createDecl)
{
function = new Function() { Name = name, Namespace = this };
Functions.Add(function);
}
return function;
}
var funcName = entries[entries.Count - 1];
var namespaces = entries.Take(entries.Count - 1);
var @namespace = FindNamespace(namespaces);
if (@namespace == null)
return null;
return @namespace.FindFunction(funcName, createDecl);
}
Class CreateClass(string name, bool isComplete)
@ -229,7 +229,7 @@ namespace CppSharp.AST @@ -229,7 +229,7 @@ namespace CppSharp.AST
DeclarationContext declContext = FindDeclaration(namespaces);
if (declContext == null)
{
{
declContext = FindClass(entries[0]);
if (declContext == null)
return null;
@ -320,13 +320,13 @@ namespace CppSharp.AST @@ -320,13 +320,13 @@ namespace CppSharp.AST
return Enums.Find(e => e.ItemsByName.ContainsKey(name));
}
public IEnumerable<Function> FindOperator(CXXOperatorKind kind)
public virtual IEnumerable<Function> FindOperator(CXXOperatorKind kind)
{
return Functions.Where(fn => fn.OperatorKind == kind);
}
public virtual IEnumerable<Function> GetOverloads(Function function)
{
public virtual IEnumerable<Function> GetOverloads(Function function)
{
if (function.IsOperator)
return FindOperator(function.OperatorKind);
return Functions.Where(fn => fn.Name == function.Name);
@ -335,17 +335,17 @@ namespace CppSharp.AST @@ -335,17 +335,17 @@ namespace CppSharp.AST
public bool HasDeclarations
{
get
{
{
Predicate<Declaration> pred = (t => t.IsGenerated);
return Enums.Exists(pred) || HasFunctions || Typedefs.Exists(pred)
|| Classes.Any() || Namespaces.Exists(n => n.HasDeclarations);
|| Classes.Any() || Namespaces.Exists(n => n.HasDeclarations);
}
}
public bool HasFunctions
{
get
{
{
Predicate<Declaration> pred = (t => t.IsGenerated);
return Functions.Exists(pred) || Namespaces.Exists(n => n.HasFunctions);
}
@ -357,18 +357,18 @@ namespace CppSharp.AST @@ -357,18 +357,18 @@ namespace CppSharp.AST
/// <summary>
/// Represents a C++ namespace.
/// </summary>
public class Namespace : DeclarationContext
{
public override string LogicalName
{
get { return IsInline ? string.Empty : base.Name; }
}
public override string LogicalOriginalName
{
get { return IsInline ? string.Empty : base.OriginalName; }
}
public class Namespace : DeclarationContext
{
public override string LogicalName
{
get { return IsInline ? string.Empty : base.Name; }
}
public override string LogicalOriginalName
{
get { return IsInline ? string.Empty : base.OriginalName; }
}
public bool IsInline;
public override T Visit<T>(IDeclVisitor<T> visitor)

9
src/Generator.Tests/AST/TestAST.cs

@ -57,5 +57,14 @@ namespace CppSharp.Generator.Tests.AST @@ -57,5 +57,14 @@ namespace CppSharp.Generator.Tests.AST
}
Assert.IsTrue(func.Parameters[2].HasDefaultValue, "Parameter.HasDefaultValue");
}
[Test]
public void TestASTHelperMethods()
{
var @class = AstContext.FindClass("Math::Complex").FirstOrDefault();
Assert.IsNotNull(@class, "Couldn't find Math::Complex class.");
var plusOperator = @class.FindOperator(CXXOperatorKind.Plus).FirstOrDefault();
Assert.IsNotNull(plusOperator, "Couldn't find operator+ in Math::Complex class.");
}
}
}

16
tests/Native/AST.h

@ -1,2 +1,18 @@ @@ -1,2 +1,18 @@
// Tests assignment of AST.Parameter properties
void TestParameterProperties(bool a, const short& b, int* c = nullptr) {};
// Tests various AST helper methods (like FindClass, FindOperator etc.)
namespace Math
{
struct Complex {
Complex(double r, double i) : re(r), im(i) {}
Complex operator+(Complex &other);
private:
double re, im;
};
// Operator overloaded using a member function
Complex Complex::operator+(Complex &other) {
return Complex(re + other.re, im + other.im);
}
}
Loading…
Cancel
Save