Browse Source

Added support for various walking options in the AST visitor.

pull/1/head
triton 13 years ago
parent
commit
81b92cd1b6
  1. 27
      src/Bridge/ASTVisitor.cs

27
src/Bridge/ASTVisitor.cs

@ -15,6 +15,20 @@ namespace Cxxi
} }
public class AstVisitorOptions
{
public bool VisitClassBases = true;
public bool VisitClassFields = true;
public bool VisitClassProperties = true;
public bool VisitClassMethods = true;
public bool VisitClassEvents = true;
public bool VisitClassVariables = true;
public bool VisitNamespaceEnums = true;
public bool VisitNamespaceTemplates = true;
public bool VisitNamespaceTypedefs = true;
}
/// <summary> /// <summary>
/// Base class for AST visitors. /// Base class for AST visitors.
/// You can override the methods to customize the behaviour, by default /// You can override the methods to customize the behaviour, by default
@ -24,10 +38,12 @@ namespace Cxxi
public abstract class AstVisitor : IAstVisitor<bool>, IAstVisited public abstract class AstVisitor : IAstVisitor<bool>, IAstVisited
{ {
public ISet<object> Visited { get; private set; } public ISet<object> Visited { get; private set; }
public AstVisitorOptions Options { get; private set; }
protected AstVisitor() protected AstVisitor()
{ {
Visited = new HashSet<object>(); Visited = new HashSet<object>();
Options = new AstVisitorOptions();
} }
public bool AlreadyVisited(Type type) public bool AlreadyVisited(Type type)
@ -141,22 +157,28 @@ namespace Cxxi
if (!VisitDeclaration(@class)) if (!VisitDeclaration(@class))
return false; return false;
if (Options.VisitClassBases)
foreach (var baseClass in @class.Bases) foreach (var baseClass in @class.Bases)
if (baseClass.IsClass) if (baseClass.IsClass)
baseClass.Class.Visit(this); VisitClassDecl(baseClass.Class);
if (Options.VisitClassFields)
foreach (var field in @class.Fields) foreach (var field in @class.Fields)
VisitFieldDecl(field); VisitFieldDecl(field);
if (Options.VisitClassProperties)
foreach (var property in @class.Properties) foreach (var property in @class.Properties)
VisitProperty(property); VisitProperty(property);
if (Options.VisitClassMethods)
foreach (var method in @class.Methods) foreach (var method in @class.Methods)
VisitMethodDecl(method); VisitMethodDecl(method);
if (Options.VisitClassEvents)
foreach (var @event in @class.Events) foreach (var @event in @class.Events)
VisitEvent(@event); VisitEvent(@event);
if (Options.VisitClassVariables)
foreach (var variable in @class.Variables) foreach (var variable in @class.Variables)
VisitVariableDecl(variable); VisitVariableDecl(variable);
@ -270,12 +292,15 @@ namespace Cxxi
foreach (var decl in @namespace.Functions) foreach (var decl in @namespace.Functions)
decl.Visit(this); decl.Visit(this);
if (Options.VisitNamespaceEnums)
foreach (var decl in @namespace.Enums) foreach (var decl in @namespace.Enums)
decl.Visit(this); decl.Visit(this);
if (Options.VisitNamespaceTemplates)
foreach (var decl in @namespace.Templates) foreach (var decl in @namespace.Templates)
decl.Visit(this); decl.Visit(this);
if (Options.VisitNamespaceTypedefs)
foreach (var decl in @namespace.Typedefs) foreach (var decl in @namespace.Typedefs)
decl.Visit(this); decl.Visit(this);

Loading…
Cancel
Save