in facebook-clang-plugins/libtooling/ASTExporter.h [693:730]
void ASTExporter<ATDWriter>::VisitDeclContext(const DeclContext *DC) {
if (!DC) {
{
ArrayScope Scope(OF, 0);
}
{ ObjectScope Scope(OF, 0); }
return;
}
{
std::vector<Decl *> declsToDump;
for (auto I : DC->decls()) {
declsToDump.push_back(I);
}
/* Some typedefs are not part of AST. 'instancetype' is one of them.
Export it nevertheless as part of TranslationUnitDecl context. */
// getObjCInstanceType() should return null type when 'instancetype' is not
// known yet - it doesn't work this way due to bug in clang, but keep
// the check for when the bug is fixed.
if (isa<TranslationUnitDecl>(DC) &&
Context.getObjCInstanceType().getTypePtrOrNull()) {
declsToDump.push_back(Context.getObjCInstanceTypeDecl());
}
ArrayScope Scope(OF, declsToDump.size());
for (auto I : declsToDump) {
dumpDecl(I);
}
}
{
bool HasExternalLexicalStorage = DC->hasExternalLexicalStorage();
bool HasExternalVisibleStorage = DC->hasExternalVisibleStorage();
ObjectScope Scope(OF,
0 + HasExternalLexicalStorage +
HasExternalVisibleStorage); // not covered by tests
OF.emitFlag("has_external_lexical_storage", HasExternalLexicalStorage);
OF.emitFlag("has_external_visible_storage", HasExternalVisibleStorage);
}
}