AttrListInfo::AttrListInfo(const Decl *D, IndexingContext &IdxCtx) : SA(IdxCtx), ref_cnt(0) { if (!D->hasAttrs()) return; for (AttrVec::const_iterator AttrI = D->attr_begin(), AttrE = D->attr_end(); AttrI != AttrE; ++AttrI) { const Attr *A = *AttrI; CXCursor C = MakeCXCursor(A, D, IdxCtx.CXTU); CXIdxLoc Loc = IdxCtx.getIndexLoc(A->getLocation()); switch (C.kind) { default: Attrs.push_back(AttrInfo(CXIdxAttr_Unexposed, C, Loc, A)); break; case CXCursor_IBActionAttr: Attrs.push_back(AttrInfo(CXIdxAttr_IBAction, C, Loc, A)); break; case CXCursor_IBOutletAttr: Attrs.push_back(AttrInfo(CXIdxAttr_IBOutlet, C, Loc, A)); break; case CXCursor_IBOutletCollectionAttr: IBCollAttrs.push_back(IBOutletCollectionInfo(C, Loc, A)); break; } } for (unsigned i = 0, e = IBCollAttrs.size(); i != e; ++i) { IBOutletCollectionInfo &IBInfo = IBCollAttrs[i]; CXAttrs.push_back(&IBInfo); const IBOutletCollectionAttr * IBAttr = cast<IBOutletCollectionAttr>(IBInfo.A); SourceLocation InterfaceLocStart = IBAttr->getInterfaceLoc()->getTypeLoc().getLocStart(); IBInfo.IBCollInfo.attrInfo = &IBInfo; IBInfo.IBCollInfo.classLoc = IdxCtx.getIndexLoc(InterfaceLocStart); IBInfo.IBCollInfo.objcClass = 0; IBInfo.IBCollInfo.classCursor = clang_getNullCursor(); QualType Ty = IBAttr->getInterface(); if (const ObjCObjectType *ObjectTy = Ty->getAs<ObjCObjectType>()) { if (const ObjCInterfaceDecl *InterD = ObjectTy->getInterface()) { IdxCtx.getEntityInfo(InterD, IBInfo.ClassInfo, SA); IBInfo.IBCollInfo.objcClass = &IBInfo.ClassInfo; IBInfo.IBCollInfo.classCursor = MakeCursorObjCClassRef(InterD, InterfaceLocStart, IdxCtx.CXTU); } } } for (unsigned i = 0, e = Attrs.size(); i != e; ++i) CXAttrs.push_back(&Attrs[i]); }
IndexingContext::ObjCProtocolListInfo::ObjCProtocolListInfo( const ObjCProtocolList &ProtList, IndexingContext &IdxCtx, ScratchAlloc &SA) { ObjCInterfaceDecl::protocol_loc_iterator LI = ProtList.loc_begin(); for (ObjCInterfaceDecl::protocol_iterator I = ProtList.begin(), E = ProtList.end(); I != E; ++I, ++LI) { SourceLocation Loc = *LI; ObjCProtocolDecl *PD = *I; ProtEntities.push_back(EntityInfo()); IdxCtx.getEntityInfo(PD, ProtEntities.back(), SA); CXIdxObjCProtocolRefInfo ProtInfo = { 0, MakeCursorObjCProtocolRef(PD, Loc, IdxCtx.CXTU), IdxCtx.getIndexLoc(Loc) }; ProtInfos.push_back(ProtInfo); if (IdxCtx.shouldSuppressRefs()) IdxCtx.markEntityOccurrenceInFile(PD, Loc); } for (unsigned i = 0, e = ProtInfos.size(); i != e; ++i) ProtInfos[i].protocol = &ProtEntities[i]; for (unsigned i = 0, e = ProtInfos.size(); i != e; ++i) Prots.push_back(&ProtInfos[i]); }
IndexingContext::CXXBasesListInfo::CXXBasesListInfo(const CXXRecordDecl *D, IndexingContext &IdxCtx, ScratchAlloc &SA) { for (const auto &Base : D->bases()) { BaseEntities.push_back(EntityInfo()); const NamedDecl *BaseD = nullptr; QualType T = Base.getType(); SourceLocation Loc = getBaseLoc(Base); if (const TypedefType *TDT = T->getAs<TypedefType>()) { BaseD = TDT->getDecl(); } else if (const TemplateSpecializationType * TST = T->getAs<TemplateSpecializationType>()) { BaseD = TST->getTemplateName().getAsTemplateDecl(); } else if (const RecordType *RT = T->getAs<RecordType>()) { BaseD = RT->getDecl(); } if (BaseD) IdxCtx.getEntityInfo(BaseD, BaseEntities.back(), SA); CXIdxBaseClassInfo BaseInfo = { nullptr, MakeCursorCXXBaseSpecifier(&Base, IdxCtx.CXTU), IdxCtx.getIndexLoc(Loc) }; BaseInfos.push_back(BaseInfo); } for (unsigned i = 0, e = BaseInfos.size(); i != e; ++i) { if (BaseEntities[i].name && BaseEntities[i].USR) BaseInfos[i].base = &BaseEntities[i]; } for (unsigned i = 0, e = BaseInfos.size(); i != e; ++i) CXBases.push_back(&BaseInfos[i]); }