CXXRecordDecl *Utils::rootBaseClass(CXXRecordDecl *derived) { if (!derived || derived->getNumBases() == 0) return derived; CXXBaseSpecifier *base = derived->bases_begin(); CXXRecordDecl *record = base->getType()->getAsCXXRecordDecl(); return record ? rootBaseClass(record) : derived; }
// This type checking could be sped up via dynamic programming. static bool IsPartOfAST(const CXXRecordDecl *R) { if (IsClangStmt(R) || IsClangType(R) || IsClangDecl(R) || isClangAttr(R)) return true; for (CXXRecordDecl::base_class_const_iterator I = R->bases_begin(), E = R->bases_end(); I!=E; ++I) { CXXBaseSpecifier BS = *I; QualType T = BS.getType(); if (const RecordType *baseT = T->getAs<RecordType>()) { CXXRecordDecl *baseD = cast<CXXRecordDecl>(baseT->getDecl()); if (IsPartOfAST(baseD)) return true; } } return false; }
bool RemoveBaseClass::isTheBaseClass(const CXXBaseSpecifier &Specifier) { const Type *Ty = TheBaseClass->getTypeForDecl(); return Context->hasSameType(Specifier.getType(), Ty->getCanonicalTypeInternal()); }