trick/trick_source/codegen/Interface_Code_Gen/VariableVisitor.hh

86 lines
2.6 KiB
C++
Raw Normal View History

2015-02-26 15:02:31 +00:00
#ifndef VARIABLEVISITOR_HH
#define VARIABLEVISITOR_HH
2015-02-26 15:02:31 +00:00
#include <string>
#include <set>
#include "clang/Frontend/CompilerInstance.h"
#include "clang/AST/RecursiveASTVisitor.h"
#include "PrintAttributes.hh"
class CommentSaver ;
class ClassValues ;
class EnumValues ;
class HeaderSearchDirs ;
/**
This class is a recursive AST visitor that is called when a VariableDecl node
is found. We are interested in typedefs of templates. i.e.
tyedef MyTemplateType< short, int, double > my_tt ; and of structs/classes.
This class parses the underlying type and stores the struct/class
a as a separate class from the origin type.
A typedef visitor is usually instantiated by the top level visitor, TranslationUnitVisitor.
@author Alexander S. Lin
@date July 2012
*/
class VariableVisitor : public clang::RecursiveASTVisitor<VariableVisitor> {
public:
VariableVisitor( clang::CompilerInstance & in_ci , CommentSaver & cs ,
HeaderSearchDirs & hsd , PrintAttributes & in_pa , std::set< std::string > & fdc) ;
/* VisitDecl and VisitType are here for debug printing. */
bool VisitDecl(clang::Decl *d) ;
bool VisitType(clang::Type *t) ;
/* These routines are called when nodes of the corresponding types are traversed */
/*
bool VisitConstantArrayType(clang::ConstantArrayType *ct) ;
bool VisitElaboratedType(clang::ElaboratedType *et) ;
bool VisitPointerType(clang::PointerType *pt) ;
bool VisitRecordType(clang::RecordType *rt) ;
bool VisitTypedefDecl(clang::TypedefDecl *td) ;
*/
bool VisitTemplateSpecializationType(clang::TemplateSpecializationType *tst) ;
private:
/** The compiler's source manager. Holds file/line info for everything. */
clang::CompilerInstance & ci ;
/** The header search directories */
HeaderSearchDirs & hsd ;
/** Holds all comments */
CommentSaver & cs ;
/** Attributes printer */
PrintAttributes & pa ;
/** name of the typedef */
std::string typedef_name ;
/** does this typedef include array or pointer dimensions? */
bool has_dims ;
/** name of the typedef */
clang::SourceRange typedef_location ;
/** The DeclContext of the typedef declaration. Used to determine namespaces of typedef */
clang::DeclContext * typedef_decl_context ;
/** Holds the class information found, usually returned to caller of this visitor. */
ClassValues * cval ;
/** Set of fwd declares in the current file this typedef resides in */
std::set< std::string > & fwd_declared_classes ;
} ;
#endif