in facebook-clang-plugins/libtooling/ASTExporter.h [2151:2180]
void ASTExporter<ATDWriter>::VisitClassTemplateDecl(
const ClassTemplateDecl *D) {
ASTExporter<ATDWriter>::VisitRedeclarableTemplateDecl(D);
std::vector<const ClassTemplateSpecializationDecl *> DeclsToDump;
if (D == D->getCanonicalDecl()) {
// dump specializations once
for (const auto *spec : D->specializations()) {
switch (spec->getTemplateSpecializationKind()) {
case TSK_Undeclared:
case TSK_ImplicitInstantiation:
DeclsToDump.push_back(spec);
break;
case TSK_ExplicitSpecialization:
case TSK_ExplicitInstantiationDeclaration:
case TSK_ExplicitInstantiationDefinition:
// these specializations will be dumped elsewhere
break;
}
}
}
bool ShouldDumpSpecializations = !DeclsToDump.empty();
ObjectScope Scope(OF, 0 + ShouldDumpSpecializations);
if (ShouldDumpSpecializations) {
OF.emitTag("specializations");
ArrayScope aScope(OF, DeclsToDump.size());
for (const auto *spec : DeclsToDump) {
dumpDecl(spec);
}
}
}