in facebook-clang-plugins/libtooling/ASTExporter.h [1712:1753]
void ASTExporter<ATDWriter>::VisitVarDecl(const VarDecl *D) {
ASTExporter<ATDWriter>::VisitDeclaratorDecl(D);
bool IsGlobal = D->hasGlobalStorage(); // including static function variables
bool IsExtern = D->hasExternalStorage();
bool IsStatic = false; // static variables
if (D->getStorageClass() == SC_Static) {
IsStatic = true;
}
bool IsStaticLocal = D->isStaticLocal(); // static function variables
bool IsStaticDataMember = D->isStaticDataMember();
bool IsConstexpr = D->isConstexpr();
bool HasInit = D->hasInit();
const Expr *initExpr = D->getInit();
bool IsInitICE = HasInit && !initExpr->isValueDependent() &&
!initExpr->getType().isNull() &&
D->hasICEInitializer(D->getASTContext());
const ParmVarDecl *ParmDecl = dyn_cast<ParmVarDecl>(D);
bool HasParmIndex = (bool)ParmDecl;
bool isInitExprCXX11ConstantExpr = false;
ObjectScope Scope(OF,
IsGlobal + IsExtern + IsStatic + IsStaticLocal +
IsStaticDataMember + IsConstexpr + IsInitICE + HasInit +
HasParmIndex + isInitExprCXX11ConstantExpr);
OF.emitFlag("is_global", IsGlobal);
OF.emitFlag("is_extern", IsExtern);
OF.emitFlag("is_static", IsStatic);
OF.emitFlag("is_static_local", IsStaticLocal);
OF.emitFlag("is_static_data_member", IsStaticDataMember);
OF.emitFlag("is_constexpr", IsConstexpr);
OF.emitFlag("is_init_ice", IsInitICE);
if (HasInit) {
OF.emitTag("init_expr");
dumpStmt(D->getInit());
OF.emitFlag("is_init_expr_cxx11_constant", isInitExprCXX11ConstantExpr);
}
if (HasParmIndex) {
OF.emitTag("parm_index_in_function");
OF.emitInteger(ParmDecl->getFunctionScopeIndex());
}
}