in facebook-clang-plugins/libtooling/NamePrinter.h [131:159]
void NamePrinter<ATDWriter>::VisitTagDecl(const TagDecl *D) {
// heavily inspired by clang's TypePrinter::printTag() function
SmallString<64> Buf;
llvm::raw_svector_ostream StrOS(Buf);
if (const IdentifierInfo *II = D->getIdentifier()) {
StrOS << II->getName();
} else if (TypedefNameDecl *Typedef = D->getTypedefNameForAnonDecl()) {
StrOS << Typedef->getIdentifier()->getName();
} else {
if (isa<CXXRecordDecl>(D) && cast<CXXRecordDecl>(D)->isLambda()) {
StrOS << "lambda";
} else {
StrOS << "anonymous_" << D->getKindName();
}
PresumedLoc PLoc = SM.getPresumedLoc(D->getLocation());
if (PLoc.isValid()) {
StrOS << "_" << PLoc.getFilename() << ':' << PLoc.getLine() << ':'
<< PLoc.getColumn();
}
}
if (const ClassTemplateSpecializationDecl *Spec =
dyn_cast<ClassTemplateSpecializationDecl>(D)) {
ArrayRef<TemplateArgument> Args;
const TemplateArgumentList &TemplateArgs = Spec->getTemplateArgs();
Args = TemplateArgs.asArray();
printTemplateArgList(StrOS, Args);
}
OF.emitString(StrOS.str().str());
}