in facebook-clang-plugins/libtooling/ASTExporter.h [1910:1987]
void ASTExporter<ATDWriter>::VisitCXXRecordDecl(const CXXRecordDecl *D) {
VisitRecordDecl(D);
if (!D->isCompleteDefinition()) {
// We need to return early here. Otherwise plugin will crash.
// It looks like CXXRecordDecl may be initialized with garbage.
// Not sure what to do when we'll have some non-optional data to generate??
ObjectScope Scope(OF, 0);
return;
}
// getNumBases and getNumVBases are not reliable, extract this info
// directly from what is going to be dumped
SmallVector<CXXBaseSpecifier, 2> nonVBases;
SmallVector<CXXBaseSpecifier, 2> vBases;
for (const auto base : D->bases()) {
if (base.isVirtual()) {
vBases.push_back(base);
} else {
nonVBases.push_back(base);
}
}
bool HasVBases = vBases.size() > 0;
bool HasNonVBases = nonVBases.size() > 0;
unsigned numTransitiveVBases = D->getNumVBases();
bool HasTransitiveVBases = numTransitiveVBases > 0;
bool IsPOD = D->isPOD();
const CXXDestructorDecl *DestructorDecl = D->getDestructor();
const CXXMethodDecl *LambdaCallOperator = D->getLambdaCallOperator();
auto I = D->captures_begin(), E = D->captures_end();
ObjectScope Scope(OF,
0 + HasNonVBases + HasVBases + HasTransitiveVBases + IsPOD +
(bool)DestructorDecl + (bool)LambdaCallOperator +
(I != E));
if (HasNonVBases) {
OF.emitTag("bases");
ArrayScope aScope(OF, nonVBases.size());
for (const auto base : nonVBases) {
dumpQualTypeNoQuals(base.getType());
}
}
if (HasVBases) {
OF.emitTag("vbases");
ArrayScope aScope(OF, vBases.size());
for (const auto base : vBases) {
dumpQualTypeNoQuals(base.getType());
}
}
if (HasTransitiveVBases) {
OF.emitTag("transitive_vbases");
ArrayScope aScope(OF, numTransitiveVBases);
for (const auto base : D->vbases()) {
dumpQualTypeNoQuals(base.getType());
}
}
OF.emitFlag("is_pod", IsPOD);
if (DestructorDecl) {
OF.emitTag("destructor");
dumpDeclRef(*DestructorDecl);
}
if (LambdaCallOperator) {
OF.emitTag("lambda_call_operator");
dumpDeclRef(*LambdaCallOperator);
}
if (I != E) {
OF.emitTag("lambda_captures");
ArrayScope Scope(OF, std::distance(I, E));
for (; I != E; ++I) {
dumpClassLambdaCapture(I);
}
}
}