void ASTExporter::VisitVarDecl()

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());
  }
}