From 37409c71788bdcc70df9a433fccb4aa4932c31be Mon Sep 17 00:00:00 2001 From: Dimitar Dobrev Date: Fri, 9 Nov 2018 03:03:41 +0200 Subject: [PATCH] Optimized the walking of the ASt by simplifying its search. Signed-off-by: Dimitar Dobrev --- src/AST/Namespace.cs | 50 ++++-------------------------- src/Generator.Tests/AST/TestAST.cs | 6 ++-- 2 files changed, 10 insertions(+), 46 deletions(-) diff --git a/src/AST/Namespace.cs b/src/AST/Namespace.cs index 539738e8..98e8c0b8 100644 --- a/src/AST/Namespace.cs +++ b/src/AST/Namespace.cs @@ -107,25 +107,6 @@ namespace CppSharp.AST return Anonymous.ContainsKey(key) ? Anonymous[key] : null; } - public DeclarationContext FindDeclaration(IEnumerable declarations) - { - DeclarationContext currentDeclaration = this; - - foreach (var declaration in declarations) - { - var subDeclaration = currentDeclaration.Namespaces - .Concat(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 { 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, diff --git a/src/Generator.Tests/AST/TestAST.cs b/src/Generator.Tests/AST/TestAST.cs index 4602b664..ee9ec9ae 100644 --- a/src/Generator.Tests/AST/TestAST.cs +++ b/src/Generator.Tests/AST/TestAST.cs @@ -66,11 +66,13 @@ namespace CppSharp.Generator.Tests.AST [Test] public void TestASTHelperMethods() { - var @class = AstContext.FindClass("Math::Complex").FirstOrDefault(); + var @namespace = AstContext.FindDecl("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); }