Browse Source

Optimized the walking of the ASt by simplifying its search.

Signed-off-by: Dimitar Dobrev <dpldobrev@protonmail.com>
pull/1099/merge
Dimitar Dobrev 7 years ago committed by João Matos
parent
commit
37409c7178
  1. 50
      src/AST/Namespace.cs
  2. 6
      src/Generator.Tests/AST/TestAST.cs

50
src/AST/Namespace.cs

@ -107,25 +107,6 @@ namespace CppSharp.AST @@ -107,25 +107,6 @@ namespace CppSharp.AST
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 Namespace FindNamespace(string name)
{
var namespaces = name.Split(new string[] { "::" },
@ -259,31 +240,12 @@ namespace CppSharp.AST @@ -259,31 +240,12 @@ namespace CppSharp.AST
{
if (string.IsNullOrEmpty(name)) return null;
var entries = name.Split(new[] { "::" },
StringSplitOptions.RemoveEmptyEntries).ToList();
if (entries.Count <= 1)
{
var @class = Classes.Find(c => c.Name.Equals(name, stringComparison)) ??
Namespaces.Select(n => n.FindClass(name, stringComparison)).FirstOrDefault(c => c != null);
if (@class != null)
return @class.CompleteDeclaration == null ?
@class : (Class) @class.CompleteDeclaration;
return null;
}
var className = entries[entries.Count - 1];
var namespaces = entries.Take(entries.Count - 1);
DeclarationContext declContext = FindDeclaration(namespaces);
if (declContext == null)
{
declContext = FindClass(entries[0]);
if (declContext == null)
return null;
}
return declContext.FindClass(className);
var @class = Classes.Find(c => c.Name.Equals(name, stringComparison)) ??
Namespaces.Select(n => n.FindClass(name, stringComparison)).FirstOrDefault(c => c != null);
if (@class != null)
return @class.CompleteDeclaration == null ?
@class : (Class) @class.CompleteDeclaration;
return null;
}
public Class FindClass(string name, bool isComplete,

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

@ -66,11 +66,13 @@ namespace CppSharp.Generator.Tests.AST @@ -66,11 +66,13 @@ namespace CppSharp.Generator.Tests.AST
[Test]
public void TestASTHelperMethods()
{
var @class = AstContext.FindClass("Math::Complex").FirstOrDefault();
var @namespace = AstContext.FindDecl<Namespace>("Math").FirstOrDefault();
Assert.IsNotNull(@namespace, "Couldn't find Math namespace.");
var @class = @namespace.FindClass("Complex");
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.");
var typedef = AstContext.FindTypedef("Math::Single").FirstOrDefault();
var typedef = @namespace.FindTypedef("Single");
Assert.IsNotNull(typedef);
}

Loading…
Cancel
Save