mirror of https://github.com/mono/CppSharp.git
1 changed files with 150 additions and 0 deletions
@ -0,0 +1,150 @@
@@ -0,0 +1,150 @@
|
||||
using System.Collections.Generic; |
||||
|
||||
namespace Cxxi |
||||
{ |
||||
/// <summary>
|
||||
/// Base class for AST visitors.
|
||||
/// You can override the methods to customize the behaviour, by default
|
||||
/// this will visit all the nodes in a default way that should be useful
|
||||
/// for a lot of applications.
|
||||
/// </summary>
|
||||
public abstract class AstVisitor : ITypeVisitor<bool>, IDeclVisitor<bool> |
||||
{ |
||||
private readonly ISet<object> Visited; |
||||
|
||||
protected AstVisitor() |
||||
{ |
||||
Visited = new HashSet<object>(); |
||||
} |
||||
|
||||
public bool AlreadyVisited(Type type) |
||||
{ |
||||
return !Visited.Add(type); |
||||
} |
||||
|
||||
public bool AlreadyVisited(Declaration decl) |
||||
{ |
||||
return !Visited.Add(decl); |
||||
} |
||||
|
||||
public virtual bool VisitTagType(TagType tag, TypeQualifiers quals) |
||||
{ |
||||
return tag.Declaration.Visit(this); |
||||
} |
||||
|
||||
public virtual bool VisitArrayType(ArrayType array, TypeQualifiers quals) |
||||
{ |
||||
return array.Type.Visit(this, quals); |
||||
} |
||||
|
||||
public virtual bool VisitFunctionType(FunctionType function, TypeQualifiers quals) |
||||
{ |
||||
if (function.ReturnType != null) |
||||
function.ReturnType.Visit(this); |
||||
|
||||
foreach (var param in function.Arguments) |
||||
param.Visit(this); |
||||
|
||||
return true; |
||||
} |
||||
|
||||
public virtual bool VisitPointerType(PointerType pointer, TypeQualifiers quals) |
||||
{ |
||||
if (pointer.Pointee == null) |
||||
return false; |
||||
|
||||
return pointer.Pointee.Visit(this, quals); |
||||
} |
||||
|
||||
public virtual bool VisitMemberPointerType(MemberPointerType member, TypeQualifiers quals) |
||||
{ |
||||
return member.Pointee.Visit(this, quals); |
||||
} |
||||
|
||||
public virtual bool VisitBuiltinType(BuiltinType builtin, TypeQualifiers quals) |
||||
{ |
||||
return true; |
||||
} |
||||
|
||||
public virtual bool VisitTypedefType(TypedefType typedef, TypeQualifiers quals) |
||||
{ |
||||
return typedef.Declaration.Visit(this); |
||||
} |
||||
|
||||
public virtual bool VisitTemplateSpecializationType(TemplateSpecializationType template, TypeQualifiers quals) |
||||
{ |
||||
return template.Template.Visit(this); |
||||
} |
||||
|
||||
public virtual bool VisitDeclaration(Declaration decl, TypeQualifiers quals) |
||||
{ |
||||
return VisitDeclaration(decl); |
||||
} |
||||
|
||||
public virtual bool VisitDeclaration(Declaration decl) |
||||
{ |
||||
return true; |
||||
} |
||||
|
||||
public virtual bool VisitClassDecl(Class @class) |
||||
{ |
||||
if (AlreadyVisited(@class)) |
||||
return true; |
||||
|
||||
return VisitDeclaration(@class); |
||||
} |
||||
|
||||
public virtual bool VisitFieldDecl(Field field) |
||||
{ |
||||
return field.Type.Visit(this); |
||||
} |
||||
|
||||
public virtual bool VisitFunctionDecl(Function function) |
||||
{ |
||||
if (function.ReturnType != null) |
||||
function.ReturnType.Visit(this); |
||||
|
||||
foreach (var param in function.Parameters) |
||||
param.Visit(this); |
||||
|
||||
return true; |
||||
} |
||||
|
||||
public virtual bool VisitMethodDecl(Method method) |
||||
{ |
||||
return VisitFunctionDecl(method); |
||||
} |
||||
|
||||
public virtual bool VisitParameterDecl(Parameter parameter) |
||||
{ |
||||
return parameter.Type.Visit(this); |
||||
} |
||||
|
||||
public virtual bool VisitTypedefDecl(TypedefDecl typedef) |
||||
{ |
||||
if (typedef.Type == null) |
||||
return false; |
||||
return typedef.Type.Visit(this); |
||||
} |
||||
|
||||
public virtual bool VisitEnumDecl(Enumeration @enum) |
||||
{ |
||||
return VisitDeclaration(@enum); |
||||
} |
||||
|
||||
public virtual bool VisitClassTemplateDecl(ClassTemplate template) |
||||
{ |
||||
return template.TemplatedClass.Visit(this); |
||||
} |
||||
|
||||
public virtual bool VisitFunctionTemplateDecl(FunctionTemplate template) |
||||
{ |
||||
return template.TemplatedFunction.Visit(this); |
||||
} |
||||
|
||||
public virtual bool VisitMacroDefinition(MacroDefinition macro) |
||||
{ |
||||
return true; |
||||
} |
||||
} |
||||
} |
Loading…
Reference in new issue