unsigned clang_isVirtualBase(CXCursor C) { if (C.kind != CXCursor_CXXBaseSpecifier) return 0; CXXBaseSpecifier *B = getCursorCXXBaseSpecifier(C); return B->isVirtual(); }
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; }
enum CX_CXXAccessSpecifier clang_getCXXAccessSpecifier(CXCursor C) { if (C.kind != CXCursor_CXXBaseSpecifier) return CX_CXXInvalidAccessSpecifier; CXXBaseSpecifier *B = getCursorCXXBaseSpecifier(C); switch (B->getAccessSpecifier()) { case AS_public: return CX_CXXPublic; case AS_protected: return CX_CXXProtected; case AS_private: return CX_CXXPrivate; case AS_none: return CX_CXXInvalidAccessSpecifier; } // FIXME: Clang currently thinks this is reachable. return CX_CXXInvalidAccessSpecifier; }
// 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; }
SourceLocation CXIndexDataConsumer::CXXBasesListInfo::getBaseLoc( const CXXBaseSpecifier &Base) const { SourceLocation Loc = Base.getSourceRange().getBegin(); TypeLoc TL; if (Base.getTypeSourceInfo()) TL = Base.getTypeSourceInfo()->getTypeLoc(); if (TL.isNull()) return Loc; if (QualifiedTypeLoc QL = TL.getAs<QualifiedTypeLoc>()) TL = QL.getUnqualifiedLoc(); if (ElaboratedTypeLoc EL = TL.getAs<ElaboratedTypeLoc>()) return EL.getNamedTypeLoc().getBeginLoc(); if (DependentNameTypeLoc DL = TL.getAs<DependentNameTypeLoc>()) return DL.getNameLoc(); if (DependentTemplateSpecializationTypeLoc DTL = TL.getAs<DependentTemplateSpecializationTypeLoc>()) return DTL.getTemplateNameLoc(); return Loc; }
SourceLocation IndexingContext::CXXBasesListInfo::getBaseLoc( const CXXBaseSpecifier &Base) const { SourceLocation Loc = Base.getSourceRange().getBegin(); TypeLoc TL; if (Base.getTypeSourceInfo()) TL = Base.getTypeSourceInfo()->getTypeLoc(); if (TL.isNull()) return Loc; if (const QualifiedTypeLoc *QL = dyn_cast<QualifiedTypeLoc>(&TL)) TL = QL->getUnqualifiedLoc(); if (const ElaboratedTypeLoc *EL = dyn_cast<ElaboratedTypeLoc>(&TL)) return EL->getNamedTypeLoc().getBeginLoc(); if (const DependentNameTypeLoc *DL = dyn_cast<DependentNameTypeLoc>(&TL)) return DL->getNameLoc(); if (const DependentTemplateSpecializationTypeLoc * DTL = dyn_cast<DependentTemplateSpecializationTypeLoc>(&TL)) return DTL->getTemplateNameLoc(); return Loc; }
bool Diff<CXXBaseSpecifier>(const CXXBaseSpecifier &old_element, const CXXBaseSpecifier &new_element) { // Can be specialized for future changes in the format. return (DiffBasicTypeAbi(old_element.basic_abi().type_abi(), new_element.basic_abi().type_abi()) || old_element.basic_abi().access() != new_element.basic_abi().access() || old_element.is_virtual() != new_element.is_virtual()); }
bool RemoveBaseClass::isTheBaseClass(const CXXBaseSpecifier &Specifier) { const Type *Ty = TheBaseClass->getTypeForDecl(); return Context->hasSameType(Specifier.getType(), Ty->getCanonicalTypeInternal()); }