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
{ {
foreach (var @base in Bases) foreach (var @base in Bases)
{ {
if (@base.IsClass && @base.Class.IsDeclared) if (@base.IsClass && @base.Class.IsDeclared)
return @base.Class; return @base.Class;
} }
return null; return null;
@ -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) public override IEnumerable<Function> GetOverloads(Function function)
{ {
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);
if (methods.ToList().Count != 0) if (methods.ToList().Count != 0)
return methods; return methods;

152
src/AST/Namespace.cs

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

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

@ -57,5 +57,14 @@ namespace CppSharp.Generator.Tests.AST
} }
Assert.IsTrue(func.Parameters[2].HasDefaultValue, "Parameter.HasDefaultValue"); 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 @@
// Tests assignment of AST.Parameter properties // Tests assignment of AST.Parameter properties
void TestParameterProperties(bool a, const short& b, int* c = nullptr) {}; 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