in facebook-clang-plugins/libtooling/NamePrinter.h [77:108]
void NamePrinter<ATDWriter>::printDeclName(const NamedDecl &D) {
const DeclContext *Ctx = D.getDeclContext();
SmallVector<const NamedDecl *, 8> Contexts;
Contexts.push_back(&D);
// Don't dump full qualifier for variables declared
// inside a function/method/block
// For structs defined inside functions, dump fully qualified name
if (Ctx->isFunctionOrMethod() && !isa<TagDecl>(&D)) {
Ctx = nullptr;
}
while (Ctx && isa<NamedDecl>(Ctx)) {
bool shouldPrintCtx = true;
// skip inline namespaces when printing qualified name
if (const NamespaceDecl *ND = dyn_cast<NamespaceDecl>(Ctx)) {
if (ND->isInline()) {
shouldPrintCtx = false;
}
}
if (shouldPrintCtx) {
Contexts.push_back(cast<NamedDecl>(Ctx));
}
Ctx = Ctx->getParent();
}
ArrayScope aScope(OF, Contexts.size());
// dump list in reverse
for (const Decl *Ctx : Contexts) {
ConstDeclVisitor<NamePrinter<ATDWriter>>::Visit(Ctx);
}
}