IndexingContext.cpp revision 2957e6f8c4c2e58a4b9cb639949fea801970fe36
14e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis//===- CIndexHigh.cpp - Higher level API functions ------------------------===// 24e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis// 34e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis// The LLVM Compiler Infrastructure 44e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis// 54e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis// This file is distributed under the University of Illinois Open Source 64e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis// License. See LICENSE.TXT for details. 74e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis// 84e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis//===----------------------------------------------------------------------===// 94e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis 104e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis#include "IndexingContext.h" 114e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis#include "CXTranslationUnit.h" 124e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis#include "CIndexDiagnostic.h" 134e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis 144e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis#include "clang/Frontend/ASTUnit.h" 152957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis#include "clang/AST/DeclCXX.h" 16b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis#include "clang/AST/DeclTemplate.h" 174e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis 184e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidisusing namespace clang; 194e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidisusing namespace cxindex; 204e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidisusing namespace cxcursor; 214e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis 226ec43adc39006a7fce94188956d0239bd54c0363Argyrios KyrtzidisIndexingContext::ObjCProtocolListInfo::ObjCProtocolListInfo( 236ec43adc39006a7fce94188956d0239bd54c0363Argyrios Kyrtzidis const ObjCProtocolList &ProtList, 246ec43adc39006a7fce94188956d0239bd54c0363Argyrios Kyrtzidis IndexingContext &IdxCtx, 256ec43adc39006a7fce94188956d0239bd54c0363Argyrios Kyrtzidis StrAdapter &SA) { 266ec43adc39006a7fce94188956d0239bd54c0363Argyrios Kyrtzidis ObjCInterfaceDecl::protocol_loc_iterator LI = ProtList.loc_begin(); 276ec43adc39006a7fce94188956d0239bd54c0363Argyrios Kyrtzidis for (ObjCInterfaceDecl::protocol_iterator 286ec43adc39006a7fce94188956d0239bd54c0363Argyrios Kyrtzidis I = ProtList.begin(), E = ProtList.end(); I != E; ++I, ++LI) { 296ec43adc39006a7fce94188956d0239bd54c0363Argyrios Kyrtzidis SourceLocation Loc = *LI; 306ec43adc39006a7fce94188956d0239bd54c0363Argyrios Kyrtzidis ObjCProtocolDecl *PD = *I; 312957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis ProtEntities.push_back(EntityInfo()); 326ec43adc39006a7fce94188956d0239bd54c0363Argyrios Kyrtzidis IdxCtx.getEntityInfo(PD, ProtEntities.back(), SA); 336ec43adc39006a7fce94188956d0239bd54c0363Argyrios Kyrtzidis CXIdxObjCProtocolRefInfo ProtInfo = { 0, 346ec43adc39006a7fce94188956d0239bd54c0363Argyrios Kyrtzidis MakeCursorObjCProtocolRef(PD, Loc, IdxCtx.CXTU), 356ec43adc39006a7fce94188956d0239bd54c0363Argyrios Kyrtzidis IdxCtx.getIndexLoc(Loc) }; 366ec43adc39006a7fce94188956d0239bd54c0363Argyrios Kyrtzidis ProtInfos.push_back(ProtInfo); 376ec43adc39006a7fce94188956d0239bd54c0363Argyrios Kyrtzidis } 386ec43adc39006a7fce94188956d0239bd54c0363Argyrios Kyrtzidis 396ec43adc39006a7fce94188956d0239bd54c0363Argyrios Kyrtzidis for (unsigned i = 0, e = ProtInfos.size(); i != e; ++i) 406ec43adc39006a7fce94188956d0239bd54c0363Argyrios Kyrtzidis ProtInfos[i].protocol = &ProtEntities[i]; 416ec43adc39006a7fce94188956d0239bd54c0363Argyrios Kyrtzidis 426ec43adc39006a7fce94188956d0239bd54c0363Argyrios Kyrtzidis for (unsigned i = 0, e = ProtInfos.size(); i != e; ++i) 436ec43adc39006a7fce94188956d0239bd54c0363Argyrios Kyrtzidis Prots.push_back(&ProtInfos[i]); 446ec43adc39006a7fce94188956d0239bd54c0363Argyrios Kyrtzidis} 456ec43adc39006a7fce94188956d0239bd54c0363Argyrios Kyrtzidis 46b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios KyrtzidisIndexingContext::AttrListInfo::AttrListInfo(const Decl *D, 47b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis IndexingContext &IdxCtx, 48b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis StrAdapter &SA) { 49b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis for (AttrVec::const_iterator AttrI = D->attr_begin(), AttrE = D->attr_end(); 50b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis AttrI != AttrE; ++AttrI) { 51b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis const Attr *A = *AttrI; 52b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis CXCursor C = MakeCXCursor(A, const_cast<Decl *>(D), IdxCtx.CXTU); 53b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis CXIdxLoc Loc = IdxCtx.getIndexLoc(A->getLocation()); 54b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis switch (C.kind) { 55b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis default: 56b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis Attrs.push_back(AttrInfo(CXIdxAttr_Unexposed, C, Loc, A)); 57b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis break; 58b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis case CXCursor_IBActionAttr: 59b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis Attrs.push_back(AttrInfo(CXIdxAttr_IBAction, C, Loc, A)); 60b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis break; 61b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis case CXCursor_IBOutletAttr: 62b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis Attrs.push_back(AttrInfo(CXIdxAttr_IBOutlet, C, Loc, A)); 63b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis break; 64b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis case CXCursor_IBOutletCollectionAttr: 65b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis IBCollAttrs.push_back(IBOutletCollectionInfo(C, Loc, A)); 66b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis break; 67b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis } 68b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis } 69b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis 70b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis for (unsigned i = 0, e = IBCollAttrs.size(); i != e; ++i) { 71b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis IBOutletCollectionInfo &IBInfo = IBCollAttrs[i]; 72b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis CXAttrs.push_back(&IBInfo); 73b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis 74b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis const IBOutletCollectionAttr * 75b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis IBAttr = cast<IBOutletCollectionAttr>(IBInfo.A); 76b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis IBInfo.IBCollInfo.attrInfo = &IBInfo; 77b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis IBInfo.IBCollInfo.classLoc = IdxCtx.getIndexLoc(IBAttr->getInterfaceLoc()); 78b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis IBInfo.IBCollInfo.objcClass = 0; 79b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis IBInfo.IBCollInfo.classCursor = clang_getNullCursor(); 80b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis QualType Ty = IBAttr->getInterface(); 81b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis if (const ObjCInterfaceType *InterTy = Ty->getAs<ObjCInterfaceType>()) { 82b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis if (const ObjCInterfaceDecl *InterD = InterTy->getInterface()) { 832957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis IdxCtx.getEntityInfo(InterD, IBInfo.ClassInfo, SA); 842957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis IBInfo.IBCollInfo.objcClass = &IBInfo.ClassInfo; 85b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis IBInfo.IBCollInfo.classCursor = MakeCursorObjCClassRef(InterD, 86b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis IBAttr->getInterfaceLoc(), IdxCtx.CXTU); 87b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis } 88b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis } 89b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis } 90b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis 91b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis for (unsigned i = 0, e = Attrs.size(); i != e; ++i) 92b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis CXAttrs.push_back(&Attrs[i]); 93b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis} 94b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis 952957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios KyrtzidisIndexingContext::CXXBasesListInfo::CXXBasesListInfo(const CXXRecordDecl *D, 962957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis IndexingContext &IdxCtx, 972957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis IndexingContext::StrAdapter &SA) { 982957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis for (CXXRecordDecl::base_class_const_iterator 992957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis I = D->bases_begin(), E = D->bases_end(); I != E; ++I) { 1002957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis const CXXBaseSpecifier &Base = *I; 1012957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis BaseEntities.push_back(EntityInfo()); 1022957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis const CXXRecordDecl *BaseRD = 0; 1032957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis if (const RecordType *RT = Base.getType()->getAs<RecordType>()) 1042957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis BaseRD = dyn_cast_or_null<CXXRecordDecl>(RT->getDecl()); 1052957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis IdxCtx.getEntityInfo(BaseRD, BaseEntities.back(), SA); 1062957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis CXIdxBaseClassInfo BaseInfo = { 0, 1072957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis MakeCursorCXXBaseSpecifier(&Base, IdxCtx.CXTU), 1082957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis IdxCtx.getIndexLoc(Base.getSourceRange().getBegin()) }; 1092957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis BaseInfos.push_back(BaseInfo); 1102957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis } 1112957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis 1122957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis for (unsigned i = 0, e = BaseInfos.size(); i != e; ++i) { 1132957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis if (BaseEntities[i].USR) 1142957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis BaseInfos[i].base = &BaseEntities[i]; 1152957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis } 1162957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis 1172957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis for (unsigned i = 0, e = BaseInfos.size(); i != e; ++i) 1182957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis CXBases.push_back(&BaseInfos[i]); 1192957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis} 1202957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis 1214e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidisconst char *IndexingContext::StrAdapter::toCStr(StringRef Str) { 1224e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis if (Str.empty()) 1234e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis return ""; 1244e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis if (Str.data()[Str.size()] == '\0') 1254e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis return Str.data(); 1264e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis Scratch += Str; 1274e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis Scratch.push_back('\0'); 1284e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis return Scratch.data() + (Scratch.size() - Str.size() - 1); 1294e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis} 1304e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis 1314e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidisvoid IndexingContext::setASTContext(ASTContext &ctx) { 1324e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis Ctx = &ctx; 1334e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis static_cast<ASTUnit*>(CXTU->TUData)->setASTContext(&ctx); 1344e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis} 1354e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis 136b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidisbool IndexingContext::shouldAbort() { 137b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis if (!CB.abortQuery) 138b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis return false; 139b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis return CB.abortQuery(ClientData, 0); 140b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis} 141b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis 142dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidisvoid IndexingContext::enteredMainFile(const FileEntry *File) { 143dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis if (File && CB.enteredMainFile) { 144dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis CXIdxClientFile idxFile = CB.enteredMainFile(ClientData, (CXFile)File, 0); 145dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis FileMap[File] = idxFile; 146dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis } 147dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis} 148dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis 1494e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidisvoid IndexingContext::ppIncludedFile(SourceLocation hashLoc, 1504e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis StringRef filename, 1514e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis const FileEntry *File, 1524e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis bool isImport, bool isAngled) { 1534e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis if (!CB.ppIncludedFile) 1544e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis return; 1554e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis 156dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis StrAdapter SA(*this); 1574e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis CXIdxIncludedFileInfo Info = { getIndexLoc(hashLoc), 1584e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis SA.toCStr(filename), 159dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis (CXFile)File, 1604e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis isImport, isAngled }; 161dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis CXIdxClientFile idxFile = CB.ppIncludedFile(ClientData, &Info); 162dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis FileMap[File] = idxFile; 1634e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis} 1644e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis 1656ec43adc39006a7fce94188956d0239bd54c0363Argyrios Kyrtzidisvoid IndexingContext::startedTranslationUnit() { 166dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis CXIdxClientContainer idxCont = 0; 1674e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis if (CB.startedTranslationUnit) 1684e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis idxCont = CB.startedTranslationUnit(ClientData, 0); 1694e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis addContainerInMap(Ctx->getTranslationUnitDecl(), idxCont); 1704e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis} 1714e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis 172b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidisvoid IndexingContext::handleDiagnosticSet(CXDiagnostic CXDiagSet) { 1734e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis if (!CB.diagnostic) 1744e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis return; 1754e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis 176b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis CB.diagnostic(ClientData, CXDiagSet, 0); 1774e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis} 1784e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis 179b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidisbool IndexingContext::handleDecl(const NamedDecl *D, 180dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis SourceLocation Loc, CXCursor Cursor, 181dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis DeclInfo &DInfo) { 182144b6c0c50b5523609cbac523f168b9e3cb01175Argyrios Kyrtzidis if (!CB.indexDeclaration || !D) 183b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis return false; 1842957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis if (D->isImplicit() && shouldIgnoreIfImplicit(D)) 1852957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis return false; 1864e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis 187dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis StrAdapter SA(*this); 1882957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis getEntityInfo(D, DInfo.EntInfo, SA); 1892957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis if (!DInfo.EntInfo.USR || Loc.isInvalid()) 190b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis return false; 191144b6c0c50b5523609cbac523f168b9e3cb01175Argyrios Kyrtzidis 192b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis markEntityOccurrenceInFile(D, Loc); 193b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis 1942957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis DInfo.entityInfo = &DInfo.EntInfo; 195dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis DInfo.cursor = Cursor; 196dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis DInfo.loc = getIndexLoc(Loc); 197c71d55469e7d5f7b376a30620617a175a9442da9Argyrios Kyrtzidis DInfo.isImplicit = D->isImplicit(); 198dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis 199b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis AttrListInfo AttrList(D, *this, SA); 200b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis DInfo.attributes = AttrList.getAttrs(); 201b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis DInfo.numAttributes = AttrList.getNumAttrs(); 202b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis 2032957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis getContainerInfo(D->getDeclContext(), DInfo.Container); 2042957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis DInfo.container = &DInfo.Container; 2052957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis if (DInfo.isContainer) { 2062957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis getContainerInfo(getEntityContainer(D), DInfo.DeclAsContainer); 2072957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis DInfo.declAsContainer = &DInfo.DeclAsContainer; 2082957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis } 209b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis 2102957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis CB.indexDeclaration(ClientData, &DInfo); 211b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis return true; 212dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis} 213dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis 214b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidisbool IndexingContext::handleObjCContainer(const ObjCContainerDecl *D, 215dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis SourceLocation Loc, CXCursor Cursor, 216dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis ObjCContainerDeclInfo &ContDInfo) { 2176ec43adc39006a7fce94188956d0239bd54c0363Argyrios Kyrtzidis ContDInfo.ObjCContDeclInfo.declInfo = &ContDInfo; 218b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis return handleDecl(D, Loc, Cursor, ContDInfo); 2194e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis} 2204e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis 221b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidisbool IndexingContext::handleFunction(const FunctionDecl *D) { 222c71d55469e7d5f7b376a30620617a175a9442da9Argyrios Kyrtzidis DeclInfo DInfo(!D->isFirstDeclaration(), D->isThisDeclarationADefinition(), 223c71d55469e7d5f7b376a30620617a175a9442da9Argyrios Kyrtzidis D->isThisDeclarationADefinition()); 224b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis return handleDecl(D, D->getLocation(), getCursor(D), DInfo); 225dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis} 2264e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis 227b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidisbool IndexingContext::handleVar(const VarDecl *D) { 228c71d55469e7d5f7b376a30620617a175a9442da9Argyrios Kyrtzidis DeclInfo DInfo(!D->isFirstDeclaration(), D->isThisDeclarationADefinition(), 229c71d55469e7d5f7b376a30620617a175a9442da9Argyrios Kyrtzidis /*isContainer=*/false); 230b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis return handleDecl(D, D->getLocation(), getCursor(D), DInfo); 2314e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis} 2324e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis 233b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidisbool IndexingContext::handleField(const FieldDecl *D) { 234c71d55469e7d5f7b376a30620617a175a9442da9Argyrios Kyrtzidis DeclInfo DInfo(/*isRedeclaration=*/false, /*isDefinition=*/true, 235c71d55469e7d5f7b376a30620617a175a9442da9Argyrios Kyrtzidis /*isContainer=*/false); 236b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis return handleDecl(D, D->getLocation(), getCursor(D), DInfo); 2374e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis} 2384e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis 239b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidisbool IndexingContext::handleEnumerator(const EnumConstantDecl *D) { 240c71d55469e7d5f7b376a30620617a175a9442da9Argyrios Kyrtzidis DeclInfo DInfo(/*isRedeclaration=*/false, /*isDefinition=*/true, 241c71d55469e7d5f7b376a30620617a175a9442da9Argyrios Kyrtzidis /*isContainer=*/false); 242b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis return handleDecl(D, D->getLocation(), getCursor(D), DInfo); 2434e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis} 2444e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis 245b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidisbool IndexingContext::handleTagDecl(const TagDecl *D) { 2462957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis if (const CXXRecordDecl *CXXRD = dyn_cast<CXXRecordDecl>(D)) 2472957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis return handleCXXRecordDecl(CXXRD, D); 2482957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis 249c71d55469e7d5f7b376a30620617a175a9442da9Argyrios Kyrtzidis DeclInfo DInfo(!D->isFirstDeclaration(), D->isThisDeclarationADefinition(), 250c71d55469e7d5f7b376a30620617a175a9442da9Argyrios Kyrtzidis D->isThisDeclarationADefinition()); 251b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis return handleDecl(D, D->getLocation(), getCursor(D), DInfo); 2524e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis} 2534e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis 2542957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidisbool IndexingContext::handleTypedefName(const TypedefNameDecl *D) { 255c71d55469e7d5f7b376a30620617a175a9442da9Argyrios Kyrtzidis DeclInfo DInfo(!D->isFirstDeclaration(), /*isDefinition=*/true, 256c71d55469e7d5f7b376a30620617a175a9442da9Argyrios Kyrtzidis /*isContainer=*/false); 257b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis return handleDecl(D, D->getLocation(), getCursor(D), DInfo); 258dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis} 2594e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis 260b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidisbool IndexingContext::handleObjCClass(const ObjCClassDecl *D) { 261dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis const ObjCClassDecl::ObjCClassRef *Ref = D->getForwardDecl(); 262dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis ObjCInterfaceDecl *IFaceD = Ref->getInterface(); 263dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis SourceLocation Loc = Ref->getLocation(); 264dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis bool isRedeclaration = IFaceD->getLocation() != Loc; 265c71d55469e7d5f7b376a30620617a175a9442da9Argyrios Kyrtzidis 266c71d55469e7d5f7b376a30620617a175a9442da9Argyrios Kyrtzidis ObjCContainerDeclInfo ContDInfo(/*isForwardRef=*/true, isRedeclaration, 267c71d55469e7d5f7b376a30620617a175a9442da9Argyrios Kyrtzidis /*isImplementation=*/false); 268b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis return handleObjCContainer(IFaceD, Loc, 269b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis MakeCursorObjCClassRef(IFaceD, Loc, CXTU), ContDInfo); 2704e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis} 2714e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis 272b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidisbool IndexingContext::handleObjCInterface(const ObjCInterfaceDecl *D) { 2736ec43adc39006a7fce94188956d0239bd54c0363Argyrios Kyrtzidis StrAdapter SA(*this); 2746ec43adc39006a7fce94188956d0239bd54c0363Argyrios Kyrtzidis 2756ec43adc39006a7fce94188956d0239bd54c0363Argyrios Kyrtzidis CXIdxBaseClassInfo BaseClass; 2762957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis EntityInfo BaseEntity; 2776ec43adc39006a7fce94188956d0239bd54c0363Argyrios Kyrtzidis BaseClass.cursor = clang_getNullCursor(); 2786ec43adc39006a7fce94188956d0239bd54c0363Argyrios Kyrtzidis if (ObjCInterfaceDecl *SuperD = D->getSuperClass()) { 2796ec43adc39006a7fce94188956d0239bd54c0363Argyrios Kyrtzidis getEntityInfo(SuperD, BaseEntity, SA); 2806ec43adc39006a7fce94188956d0239bd54c0363Argyrios Kyrtzidis SourceLocation SuperLoc = D->getSuperClassLoc(); 2816ec43adc39006a7fce94188956d0239bd54c0363Argyrios Kyrtzidis BaseClass.base = &BaseEntity; 2826ec43adc39006a7fce94188956d0239bd54c0363Argyrios Kyrtzidis BaseClass.cursor = MakeCursorObjCSuperClassRef(SuperD, SuperLoc, CXTU); 2836ec43adc39006a7fce94188956d0239bd54c0363Argyrios Kyrtzidis BaseClass.loc = getIndexLoc(SuperLoc); 2846ec43adc39006a7fce94188956d0239bd54c0363Argyrios Kyrtzidis } 2856ec43adc39006a7fce94188956d0239bd54c0363Argyrios Kyrtzidis 2866ec43adc39006a7fce94188956d0239bd54c0363Argyrios Kyrtzidis ObjCProtocolListInfo ProtInfo(D->getReferencedProtocols(), *this, SA); 2876ec43adc39006a7fce94188956d0239bd54c0363Argyrios Kyrtzidis 288c71d55469e7d5f7b376a30620617a175a9442da9Argyrios Kyrtzidis ObjCInterfaceDeclInfo InterInfo(D); 289c71d55469e7d5f7b376a30620617a175a9442da9Argyrios Kyrtzidis InterInfo.ObjCProtoListInfo = ProtInfo.getListInfo(); 290c71d55469e7d5f7b376a30620617a175a9442da9Argyrios Kyrtzidis InterInfo.ObjCInterDeclInfo.containerInfo = &InterInfo.ObjCContDeclInfo; 2916ec43adc39006a7fce94188956d0239bd54c0363Argyrios Kyrtzidis InterInfo.ObjCInterDeclInfo.superInfo = D->getSuperClass() ? &BaseClass : 0; 292c71d55469e7d5f7b376a30620617a175a9442da9Argyrios Kyrtzidis InterInfo.ObjCInterDeclInfo.protocols = &InterInfo.ObjCProtoListInfo; 2936ec43adc39006a7fce94188956d0239bd54c0363Argyrios Kyrtzidis 294b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis return handleObjCContainer(D, D->getLocation(), getCursor(D), InterInfo); 295dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis} 2964e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis 297b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidisbool IndexingContext::handleObjCImplementation( 298dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis const ObjCImplementationDecl *D) { 299c71d55469e7d5f7b376a30620617a175a9442da9Argyrios Kyrtzidis ObjCContainerDeclInfo ContDInfo(/*isForwardRef=*/false, 300e7bbab91f5cc899104d0a1dee6059d8413c70eebArgyrios Kyrtzidis /*isRedeclaration=*/true, 301c71d55469e7d5f7b376a30620617a175a9442da9Argyrios Kyrtzidis /*isImplementation=*/true); 302b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis return handleObjCContainer(D, D->getLocation(), getCursor(D), ContDInfo); 303dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis} 3044e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis 305b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidisbool IndexingContext::handleObjCForwardProtocol(const ObjCProtocolDecl *D, 306dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis SourceLocation Loc, 307dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis bool isRedeclaration) { 308c71d55469e7d5f7b376a30620617a175a9442da9Argyrios Kyrtzidis ObjCContainerDeclInfo ContDInfo(/*isForwardRef=*/true, 309c71d55469e7d5f7b376a30620617a175a9442da9Argyrios Kyrtzidis isRedeclaration, 310c71d55469e7d5f7b376a30620617a175a9442da9Argyrios Kyrtzidis /*isImplementation=*/false); 311b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis return handleObjCContainer(D, Loc, MakeCursorObjCProtocolRef(D, Loc, CXTU), 312b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis ContDInfo); 313dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis} 3144e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis 315b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidisbool IndexingContext::handleObjCProtocol(const ObjCProtocolDecl *D) { 316dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis StrAdapter SA(*this); 3176ec43adc39006a7fce94188956d0239bd54c0363Argyrios Kyrtzidis ObjCProtocolListInfo ProtListInfo(D->getReferencedProtocols(), *this, SA); 318dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis 319c71d55469e7d5f7b376a30620617a175a9442da9Argyrios Kyrtzidis ObjCProtocolDeclInfo ProtInfo(D); 320c71d55469e7d5f7b376a30620617a175a9442da9Argyrios Kyrtzidis ProtInfo.ObjCProtoRefListInfo = ProtListInfo.getListInfo(); 3214e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis 322b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis return handleObjCContainer(D, D->getLocation(), getCursor(D), ProtInfo); 3234e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis} 3244e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis 325b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidisbool IndexingContext::handleObjCCategory(const ObjCCategoryDecl *D) { 326c71d55469e7d5f7b376a30620617a175a9442da9Argyrios Kyrtzidis ObjCCategoryDeclInfo CatDInfo(/*isImplementation=*/false); 3272957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis EntityInfo ClassEntity; 328dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis StrAdapter SA(*this); 32921ee5707e6e59d982d2f2ae28e079c7ff46dc519Argyrios Kyrtzidis const ObjCInterfaceDecl *IFaceD = D->getClassInterface(); 33021ee5707e6e59d982d2f2ae28e079c7ff46dc519Argyrios Kyrtzidis SourceLocation ClassLoc = D->getLocation(); 331b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis SourceLocation CategoryLoc = D->IsClassExtension() ? ClassLoc 332b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis : D->getCategoryNameLoc(); 333c6b4a5099588fd21b49c80f730a596a64b2766c6Argyrios Kyrtzidis getEntityInfo(IFaceD, ClassEntity, SA); 334dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis 3356ec43adc39006a7fce94188956d0239bd54c0363Argyrios Kyrtzidis CatDInfo.ObjCCatDeclInfo.containerInfo = &CatDInfo.ObjCContDeclInfo; 336c6b4a5099588fd21b49c80f730a596a64b2766c6Argyrios Kyrtzidis if (IFaceD) { 337c6b4a5099588fd21b49c80f730a596a64b2766c6Argyrios Kyrtzidis CatDInfo.ObjCCatDeclInfo.objcClass = &ClassEntity; 338c6b4a5099588fd21b49c80f730a596a64b2766c6Argyrios Kyrtzidis CatDInfo.ObjCCatDeclInfo.classCursor = 339c6b4a5099588fd21b49c80f730a596a64b2766c6Argyrios Kyrtzidis MakeCursorObjCClassRef(IFaceD, ClassLoc, CXTU); 340c6b4a5099588fd21b49c80f730a596a64b2766c6Argyrios Kyrtzidis } else { 341c6b4a5099588fd21b49c80f730a596a64b2766c6Argyrios Kyrtzidis CatDInfo.ObjCCatDeclInfo.objcClass = 0; 342c6b4a5099588fd21b49c80f730a596a64b2766c6Argyrios Kyrtzidis CatDInfo.ObjCCatDeclInfo.classCursor = clang_getNullCursor(); 343c6b4a5099588fd21b49c80f730a596a64b2766c6Argyrios Kyrtzidis } 34421ee5707e6e59d982d2f2ae28e079c7ff46dc519Argyrios Kyrtzidis CatDInfo.ObjCCatDeclInfo.classLoc = getIndexLoc(ClassLoc); 345b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis return handleObjCContainer(D, CategoryLoc, getCursor(D), CatDInfo); 346dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis} 347dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis 348b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidisbool IndexingContext::handleObjCCategoryImpl(const ObjCCategoryImplDecl *D) { 349dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis const ObjCCategoryDecl *CatD = D->getCategoryDecl(); 350c71d55469e7d5f7b376a30620617a175a9442da9Argyrios Kyrtzidis ObjCCategoryDeclInfo CatDInfo(/*isImplementation=*/true); 3512957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis EntityInfo ClassEntity; 352dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis StrAdapter SA(*this); 3533e340a67f4522a2f633a719cb7f3389fe2474374Argyrios Kyrtzidis const ObjCInterfaceDecl *IFaceD = CatD->getClassInterface(); 3543e340a67f4522a2f633a719cb7f3389fe2474374Argyrios Kyrtzidis SourceLocation ClassLoc = D->getLocation(); 3553e340a67f4522a2f633a719cb7f3389fe2474374Argyrios Kyrtzidis SourceLocation CategoryLoc = ClassLoc; //FIXME: D->getCategoryNameLoc(); 3563e340a67f4522a2f633a719cb7f3389fe2474374Argyrios Kyrtzidis getEntityInfo(IFaceD, ClassEntity, SA); 357dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis 3586ec43adc39006a7fce94188956d0239bd54c0363Argyrios Kyrtzidis CatDInfo.ObjCCatDeclInfo.containerInfo = &CatDInfo.ObjCContDeclInfo; 3593e340a67f4522a2f633a719cb7f3389fe2474374Argyrios Kyrtzidis if (IFaceD) { 3603e340a67f4522a2f633a719cb7f3389fe2474374Argyrios Kyrtzidis CatDInfo.ObjCCatDeclInfo.objcClass = &ClassEntity; 3613e340a67f4522a2f633a719cb7f3389fe2474374Argyrios Kyrtzidis CatDInfo.ObjCCatDeclInfo.classCursor = 3623e340a67f4522a2f633a719cb7f3389fe2474374Argyrios Kyrtzidis MakeCursorObjCClassRef(IFaceD, ClassLoc, CXTU); 3633e340a67f4522a2f633a719cb7f3389fe2474374Argyrios Kyrtzidis } else { 3643e340a67f4522a2f633a719cb7f3389fe2474374Argyrios Kyrtzidis CatDInfo.ObjCCatDeclInfo.objcClass = 0; 3653e340a67f4522a2f633a719cb7f3389fe2474374Argyrios Kyrtzidis CatDInfo.ObjCCatDeclInfo.classCursor = clang_getNullCursor(); 3663e340a67f4522a2f633a719cb7f3389fe2474374Argyrios Kyrtzidis } 3673e340a67f4522a2f633a719cb7f3389fe2474374Argyrios Kyrtzidis CatDInfo.ObjCCatDeclInfo.classLoc = getIndexLoc(ClassLoc); 368b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis return handleObjCContainer(D, CategoryLoc, getCursor(D), CatDInfo); 3694e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis} 3704e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis 371b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidisbool IndexingContext::handleObjCMethod(const ObjCMethodDecl *D) { 372c71d55469e7d5f7b376a30620617a175a9442da9Argyrios Kyrtzidis DeclInfo DInfo(!D->isCanonicalDecl(), D->isThisDeclarationADefinition(), 373c71d55469e7d5f7b376a30620617a175a9442da9Argyrios Kyrtzidis D->isThisDeclarationADefinition()); 374b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis return handleDecl(D, D->getLocation(), getCursor(D), DInfo); 375b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis} 376b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis 377b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidisbool IndexingContext::handleSynthesizedObjCProperty( 378b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis const ObjCPropertyImplDecl *D) { 379b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis ObjCPropertyDecl *PD = D->getPropertyDecl(); 380b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis return handleReference(PD, D->getLocation(), getCursor(D), 0, D->getDeclContext()); 3814e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis} 3824e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis 383b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidisbool IndexingContext::handleSynthesizedObjCMethod(const ObjCMethodDecl *D, 384b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis SourceLocation Loc) { 385b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis DeclInfo DInfo(/*isRedeclaration=*/true, /*isDefinition=*/true, 386b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis /*isContainer=*/false); 387b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis return handleDecl(D, Loc, getCursor(D), DInfo); 388b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis} 389b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis 390b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidisbool IndexingContext::handleObjCProperty(const ObjCPropertyDecl *D) { 391c71d55469e7d5f7b376a30620617a175a9442da9Argyrios Kyrtzidis DeclInfo DInfo(/*isRedeclaration=*/false, /*isDefinition=*/false, 392c71d55469e7d5f7b376a30620617a175a9442da9Argyrios Kyrtzidis /*isContainer=*/false); 393b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis return handleDecl(D, D->getLocation(), getCursor(D), DInfo); 3944e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis} 3954e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis 3962957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidisbool IndexingContext::handleClassTemplate(const ClassTemplateDecl *D) { 3972957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis return handleCXXRecordDecl(D->getTemplatedDecl(), D); 3982957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis} 3992957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis 4002957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidisbool IndexingContext::handleFunctionTemplate(const FunctionTemplateDecl *D) { 4012957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis DeclInfo DInfo(/*isRedeclaration=*/!D->isCanonicalDecl(), 4022957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis /*isDefinition=*/D->isThisDeclarationADefinition(), 4032957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis /*isContainer=*/D->isThisDeclarationADefinition()); 4042957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis return handleDecl(D, D->getLocation(), getCursor(D), DInfo); 4052957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis} 4062957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis 4072957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidisbool IndexingContext::handleTypeAliasTemplate(const TypeAliasTemplateDecl *D) { 4082957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis DeclInfo DInfo(/*isRedeclaration=*/!D->isCanonicalDecl(), 4092957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis /*isDefinition=*/true, /*isContainer=*/false); 4102957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis return handleDecl(D, D->getLocation(), getCursor(D), DInfo); 4112957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis} 4122957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis 413b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidisbool IndexingContext::handleReference(const NamedDecl *D, SourceLocation Loc, 4144e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis const NamedDecl *Parent, 4154e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis const DeclContext *DC, 416aca19be8731fc31cff68702de0dc7f30ce908979Argyrios Kyrtzidis const Expr *E, 417aca19be8731fc31cff68702de0dc7f30ce908979Argyrios Kyrtzidis CXIdxEntityRefKind Kind) { 418d6c8209fd1567db9c2721f441b50cb23cdf8d835Argyrios Kyrtzidis if (!D) 419b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis return false; 420b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis 421b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis CXCursor Cursor = E ? MakeCXCursor(const_cast<Expr*>(E), 422b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis const_cast<Decl*>(cast<Decl>(DC)), CXTU) 423b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis : getRefCursor(D, Loc); 424b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis return handleReference(D, Loc, Cursor, Parent, DC, E, Kind); 425b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis} 426b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis 427b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidisbool IndexingContext::handleReference(const NamedDecl *D, SourceLocation Loc, 428b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis CXCursor Cursor, 429b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis const NamedDecl *Parent, 430b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis const DeclContext *DC, 431b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis const Expr *E, 432b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis CXIdxEntityRefKind Kind) { 4332957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis if (!CB.indexEntityReference) 434b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis return false; 4352957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis 4362957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis if (!D) 437b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis return false; 4384e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis if (Loc.isInvalid()) 439b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis return false; 4402957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis if (D->getParentFunctionOrMethod()) 441b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis return false; 4424e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis if (isNotFromSourceFile(D->getLocation())) 443b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis return false; 4442957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis if (D->isImplicit() && shouldIgnoreIfImplicit(D)) 4452957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis return false; 4462957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis 4472957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis if (suppressRefs()) { 4482957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis if (markEntityOccurrenceInFile(D, Loc)) 4492957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis return false; // already occurred. 4502957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis } 451c6b4a5099588fd21b49c80f730a596a64b2766c6Argyrios Kyrtzidis 452144b6c0c50b5523609cbac523f168b9e3cb01175Argyrios Kyrtzidis StrAdapter SA(*this); 4532957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis EntityInfo RefEntity, ParentEntity; 454144b6c0c50b5523609cbac523f168b9e3cb01175Argyrios Kyrtzidis getEntityInfo(D, RefEntity, SA); 455144b6c0c50b5523609cbac523f168b9e3cb01175Argyrios Kyrtzidis if (!RefEntity.USR) 456b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis return false; 457144b6c0c50b5523609cbac523f168b9e3cb01175Argyrios Kyrtzidis 458144b6c0c50b5523609cbac523f168b9e3cb01175Argyrios Kyrtzidis getEntityInfo(Parent, ParentEntity, SA); 459144b6c0c50b5523609cbac523f168b9e3cb01175Argyrios Kyrtzidis 4602957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis ContainerInfo Container; 4612957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis getContainerInfo(DC, Container); 462c6b4a5099588fd21b49c80f730a596a64b2766c6Argyrios Kyrtzidis 463854625f7347e4418803fe4aa9131928408e4dc53Benjamin Kramer CXIdxEntityRefInfo Info = { Cursor, 4644e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis getIndexLoc(Loc), 465dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis &RefEntity, 466c6b4a5099588fd21b49c80f730a596a64b2766c6Argyrios Kyrtzidis Parent ? &ParentEntity : 0, 4672957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis &Container, 468aca19be8731fc31cff68702de0dc7f30ce908979Argyrios Kyrtzidis Kind }; 4694e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis CB.indexEntityReference(ClientData, &Info); 470b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis return true; 4714e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis} 4724e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis 4734e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidisbool IndexingContext::isNotFromSourceFile(SourceLocation Loc) const { 4744e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis if (Loc.isInvalid()) 4754e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis return true; 4764e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis SourceManager &SM = Ctx->getSourceManager(); 4774e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis SourceLocation FileLoc = SM.getFileLoc(Loc); 4784e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis FileID FID = SM.getFileID(FileLoc); 4794e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis return SM.getFileEntryForID(FID) == 0; 4804e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis} 4814e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis 4824e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidisvoid IndexingContext::addContainerInMap(const DeclContext *DC, 483dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis CXIdxClientContainer container) { 4842957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis if (!DC) 4852957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis return; 4862957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis 4874e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis assert(getScopedContext(DC) == DC); 4884e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis ContainerMapTy::iterator I = ContainerMap.find(DC); 4894e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis if (I == ContainerMap.end()) { 4904e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis if (container) 4914e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis ContainerMap[DC] = container; 4924e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis return; 4934e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis } 4944e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis // Allow changing the container of a previously seen DeclContext so we 4954e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis // can handle invalid user code, like a function re-definition. 4964e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis if (container) 4974e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis I->second = container; 4984e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis else 4994e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis ContainerMap.erase(I); 5004e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis} 5014e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis 5022957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios KyrtzidisCXIdxClientEntity IndexingContext::getClientEntity(const Decl *D) const { 5032957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis if (!D) 5042957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis return 0; 5052957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis EntityMapTy::const_iterator I = EntityMap.find(D); 5062957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis if (I == EntityMap.end()) 5072957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis return 0; 5082957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis return I->second; 5092957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis} 5102957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis 5112957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidisvoid IndexingContext::setClientEntity(const Decl *D, CXIdxClientEntity client) { 5122957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis if (!D) 5132957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis return; 5142957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis EntityMap[D] = client; 5152957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis} 5162957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis 5172957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidisbool IndexingContext::handleCXXRecordDecl(const CXXRecordDecl *RD, 5182957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis const NamedDecl *OrigD) { 5192957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis StrAdapter SA(*this); 5202957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis CXXClassDeclInfo DInfo(/*isRedeclaration=*/!OrigD->isCanonicalDecl(), 5212957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis /*isDefinition=*/RD->isThisDeclarationADefinition()); 5222957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis CXXBasesListInfo BaseList(RD, *this, SA); 5232957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis DInfo.CXXClassInfo.declInfo = &DInfo; 5242957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis DInfo.CXXClassInfo.bases = BaseList.getBases(); 5252957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis DInfo.CXXClassInfo.numBases = BaseList.getNumBases(); 5262957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis 5272957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis return handleDecl(OrigD, OrigD->getLocation(), getCursor(OrigD), DInfo); 5282957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis} 5292957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis 530b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidisbool IndexingContext::markEntityOccurrenceInFile(const NamedDecl *D, 531b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis SourceLocation Loc) { 532b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis SourceManager &SM = Ctx->getSourceManager(); 533b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis SourceLocation FileLoc = SM.getFileLoc(Loc); 534b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis D = getEntityDecl(D); 535b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis 536b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis std::pair<FileID, unsigned> LocInfo = SM.getDecomposedLoc(Loc); 537b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis FileID FID = LocInfo.first; 538b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis if (FID.isInvalid()) 539b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis return true; 540b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis 541b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis const FileEntry *FE = SM.getFileEntryForID(FID); 542b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis if (!FE) 543b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis return true; 544b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis RefFileOccurence RefOccur(FE, D); 545b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis std::pair<llvm::DenseSet<RefFileOccurence>::iterator, bool> 546b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis res = RefFileOccurences.insert(RefOccur); 547b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis if (!res.second) 548b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis return true; // already in map. 549b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis 550b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis return false; 551b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis} 552b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis 5534e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidisconst NamedDecl *IndexingContext::getEntityDecl(const NamedDecl *D) const { 5544e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis assert(D); 5554e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis D = cast<NamedDecl>(D->getCanonicalDecl()); 5564e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis 557b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis if (const ObjCImplementationDecl * 5584e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis ImplD = dyn_cast<ObjCImplementationDecl>(D)) { 5594e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis return getEntityDecl(ImplD->getClassInterface()); 5604e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis 5614e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis } else if (const ObjCCategoryImplDecl * 5624e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis CatImplD = dyn_cast<ObjCCategoryImplDecl>(D)) { 5634e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis return getEntityDecl(CatImplD->getCategoryDecl()); 5642957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis } else if (const FunctionDecl *FD = dyn_cast<FunctionDecl>(D)) { 5652957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis if (FunctionTemplateDecl *TemplD = FD->getDescribedFunctionTemplate()) 5662957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis return getEntityDecl(TemplD); 5672957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis } else if (const CXXRecordDecl *RD = dyn_cast<CXXRecordDecl>(D)) { 5682957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis if (ClassTemplateDecl *TemplD = RD->getDescribedClassTemplate()) 5692957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis return getEntityDecl(TemplD); 5704e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis } 5714e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis 5724e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis return D; 5734e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis} 5744e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis 5754e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidisconst DeclContext * 5762957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios KyrtzidisIndexingContext::getEntityContainer(const Decl *D) const { 5772957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis const DeclContext *DC = dyn_cast<DeclContext>(D); 5782957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis if (DC) 5792957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis return DC; 5802957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis 5812957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis if (const ClassTemplateDecl *ClassTempl = dyn_cast<ClassTemplateDecl>(D)) { 5822957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis DC = ClassTempl->getTemplatedDecl(); 5832957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis } if (const FunctionTemplateDecl * 5842957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis FuncTempl = dyn_cast<FunctionTemplateDecl>(D)) { 5852957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis DC = FuncTempl->getTemplatedDecl(); 5862957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis } 5872957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis 5882957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis return DC; 5892957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis} 5902957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis 5912957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidisconst DeclContext * 5924e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios KyrtzidisIndexingContext::getScopedContext(const DeclContext *DC) const { 5934e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis // Local contexts are ignored for indexing. 5944e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis const DeclContext *FuncCtx = cast<Decl>(DC)->getParentFunctionOrMethod(); 5954e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis if (FuncCtx) 5964e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis return FuncCtx; 5974e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis 5984e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis // We consider enums always scoped for indexing. 5994e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis if (isa<TagDecl>(DC)) 6004e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis return DC; 6014e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis 6024e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis if (const NamespaceDecl *NS = dyn_cast<NamespaceDecl>(DC)) { 6034e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis if (NS->isAnonymousNamespace()) 6044e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis return getScopedContext(NS->getParent()); 6054e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis return NS; 6064e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis } 6074e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis 6084e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis return DC->getRedeclContext(); 6094e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis} 6104e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis 611dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios KyrtzidisCXIdxClientContainer 6122957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios KyrtzidisIndexingContext::getClientContainerForDC(const DeclContext *DC) const { 6132957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis if (!DC) 6142957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis return 0; 6152957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis 6164e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis DC = getScopedContext(DC); 6174e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis ContainerMapTy::const_iterator I = ContainerMap.find(DC); 6183e340a67f4522a2f633a719cb7f3389fe2474374Argyrios Kyrtzidis if (I == ContainerMap.end()) 6193e340a67f4522a2f633a719cb7f3389fe2474374Argyrios Kyrtzidis return 0; 6202957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis 6214e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis return I->second; 6224e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis} 6234e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis 624dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios KyrtzidisCXIdxClientFile IndexingContext::getIndexFile(const FileEntry *File) { 6254e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis if (!File) 6264e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis return 0; 6274e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis 6284e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis FileMapTy::iterator FI = FileMap.find(File); 6294e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis if (FI != FileMap.end()) 6304e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis return FI->second; 6314e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis 632dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis return 0; 6334e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis} 6344e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis 6354e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios KyrtzidisCXIdxLoc IndexingContext::getIndexLoc(SourceLocation Loc) const { 6364e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis CXIdxLoc idxLoc = { {0, 0}, 0 }; 6374e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis if (Loc.isInvalid()) 6384e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis return idxLoc; 6394e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis 6404e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis idxLoc.ptr_data[0] = (void*)this; 6414e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis idxLoc.int_data = Loc.getRawEncoding(); 6424e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis return idxLoc; 6434e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis} 6444e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis 6454e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidisvoid IndexingContext::translateLoc(SourceLocation Loc, 646dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis CXIdxClientFile *indexFile, CXFile *file, 6474e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis unsigned *line, unsigned *column, 6484e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis unsigned *offset) { 6494e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis if (Loc.isInvalid()) 6504e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis return; 6514e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis 6524e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis SourceManager &SM = Ctx->getSourceManager(); 6534e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis Loc = SM.getFileLoc(Loc); 6544e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis 6554e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis std::pair<FileID, unsigned> LocInfo = SM.getDecomposedLoc(Loc); 6564e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis FileID FID = LocInfo.first; 6574e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis unsigned FileOffset = LocInfo.second; 6584e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis 6594e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis if (FID.isInvalid()) 6604e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis return; 6614e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis 6624e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis const FileEntry *FE = SM.getFileEntryForID(FID); 6634e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis if (indexFile) 6644e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis *indexFile = getIndexFile(FE); 6654e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis if (file) 6664e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis *file = (void *)FE; 6674e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis if (line) 6684e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis *line = SM.getLineNumber(FID, FileOffset); 6694e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis if (column) 6704e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis *column = SM.getColumnNumber(FID, FileOffset); 6714e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis if (offset) 6724e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis *offset = FileOffset; 6734e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis} 6744e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis 675dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidisvoid IndexingContext::getEntityInfo(const NamedDecl *D, 6762957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis EntityInfo &EntityInfo, 6772957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis StrAdapter &SA) { 6782957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis EntityInfo.name = EntityInfo.USR = 0; 679c6b4a5099588fd21b49c80f730a596a64b2766c6Argyrios Kyrtzidis if (!D) 680c6b4a5099588fd21b49c80f730a596a64b2766c6Argyrios Kyrtzidis return; 6812957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis 682dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis D = getEntityDecl(D); 6832957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis EntityInfo.cursor = getCursor(D); 6842957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis EntityInfo.Dcl = D; 6852957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis EntityInfo.IndexCtx = this; 686dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis EntityInfo.kind = CXIdxEntity_Unexposed; 6872957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis EntityInfo.templateKind = CXIdxEntity_NonTemplate; 688dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis 689dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis if (const TagDecl *TD = dyn_cast<TagDecl>(D)) { 690dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis switch (TD->getTagKind()) { 691dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis case TTK_Struct: 692dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis EntityInfo.kind = CXIdxEntity_Struct; break; 693dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis case TTK_Union: 694dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis EntityInfo.kind = CXIdxEntity_Union; break; 695dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis case TTK_Class: 696dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis EntityInfo.kind = CXIdxEntity_CXXClass; break; 697dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis case TTK_Enum: 698dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis EntityInfo.kind = CXIdxEntity_Enum; break; 699dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis } 7004e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis 7012957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis if (const CXXRecordDecl *CXXRec = dyn_cast<CXXRecordDecl>(D)) { 7022957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis if (TD->getTagKind() == TTK_Struct && !CXXRec->isPOD()) 7032957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis EntityInfo.kind = CXIdxEntity_CXXClass; 7042957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis } 7052957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis 7062957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis if (isa<ClassTemplatePartialSpecializationDecl>(D)) { 7072957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis EntityInfo.templateKind = CXIdxEntity_TemplatePartialSpecialization; 7082957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis } else if (isa<ClassTemplateSpecializationDecl>(D)) { 7092957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis EntityInfo.templateKind = CXIdxEntity_TemplateSpecialization; 7102957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis } 7112957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis 712dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis } else { 713dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis switch (D->getKind()) { 714dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis case Decl::Typedef: 715dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis EntityInfo.kind = CXIdxEntity_Typedef; break; 716dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis case Decl::Function: 7172957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis EntityInfo.kind = CXIdxEntity_Function; 7182957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis break; 719dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis case Decl::Var: 7202957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis EntityInfo.kind = CXIdxEntity_Variable; 7212957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis if (isa<CXXRecordDecl>(D->getDeclContext())) 7222957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis EntityInfo.kind = CXIdxEntity_CXXStaticVariable; 7232957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis break; 724dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis case Decl::Field: 725dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis EntityInfo.kind = CXIdxEntity_Field; break; 726dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis case Decl::EnumConstant: 727dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis EntityInfo.kind = CXIdxEntity_EnumConstant; break; 728dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis case Decl::ObjCInterface: 729dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis EntityInfo.kind = CXIdxEntity_ObjCClass; break; 730dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis case Decl::ObjCProtocol: 731dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis EntityInfo.kind = CXIdxEntity_ObjCProtocol; break; 732dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis case Decl::ObjCCategory: 733dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis EntityInfo.kind = CXIdxEntity_ObjCCategory; break; 734dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis case Decl::ObjCMethod: 735c71d55469e7d5f7b376a30620617a175a9442da9Argyrios Kyrtzidis if (cast<ObjCMethodDecl>(D)->isInstanceMethod()) 736c71d55469e7d5f7b376a30620617a175a9442da9Argyrios Kyrtzidis EntityInfo.kind = CXIdxEntity_ObjCInstanceMethod; 737c71d55469e7d5f7b376a30620617a175a9442da9Argyrios Kyrtzidis else 738c71d55469e7d5f7b376a30620617a175a9442da9Argyrios Kyrtzidis EntityInfo.kind = CXIdxEntity_ObjCClassMethod; 739c71d55469e7d5f7b376a30620617a175a9442da9Argyrios Kyrtzidis break; 740dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis case Decl::ObjCProperty: 741dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis EntityInfo.kind = CXIdxEntity_ObjCProperty; break; 742dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis case Decl::ObjCIvar: 743dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis EntityInfo.kind = CXIdxEntity_ObjCIvar; break; 7442957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis case Decl::Namespace: 7452957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis EntityInfo.kind = CXIdxEntity_CXXNamespace; break; 7462957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis case Decl::NamespaceAlias: 7472957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis EntityInfo.kind = CXIdxEntity_CXXNamespaceAlias; break; 7482957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis case Decl::CXXConstructor: 7492957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis EntityInfo.kind = CXIdxEntity_CXXConstructor; break; 7502957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis case Decl::CXXDestructor: 7512957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis EntityInfo.kind = CXIdxEntity_CXXDestructor; break; 7522957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis case Decl::CXXConversion: 7532957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis EntityInfo.kind = CXIdxEntity_CXXConversionFunction; break; 7542957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis case Decl::CXXMethod: { 7552957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis const CXXMethodDecl *MD = cast<CXXMethodDecl>(D); 7562957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis if (MD->isStatic()) 7572957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis EntityInfo.kind = CXIdxEntity_CXXStaticMethod; 7582957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis else 7592957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis EntityInfo.kind = CXIdxEntity_CXXInstanceMethod; 7602957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis break; 7612957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis } 7622957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis case Decl::ClassTemplate: 7632957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis EntityInfo.kind = CXIdxEntity_CXXClass; 7642957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis EntityInfo.templateKind = CXIdxEntity_Template; 7652957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis break; 7662957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis case Decl::FunctionTemplate: 7672957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis EntityInfo.kind = CXIdxEntity_Function; 7682957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis EntityInfo.templateKind = CXIdxEntity_Template; 7692957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis if (const CXXMethodDecl *MD = dyn_cast_or_null<CXXMethodDecl>( 7702957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis cast<FunctionTemplateDecl>(D)->getTemplatedDecl())) { 7712957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis if (isa<CXXConstructorDecl>(MD)) 7722957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis EntityInfo.kind = CXIdxEntity_CXXConstructor; 7732957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis else if (isa<CXXDestructorDecl>(MD)) 7742957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis EntityInfo.kind = CXIdxEntity_CXXDestructor; 7752957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis else if (isa<CXXConversionDecl>(MD)) 7762957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis EntityInfo.kind = CXIdxEntity_CXXConversionFunction; 7772957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis else { 7782957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis if (MD->isStatic()) 7792957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis EntityInfo.kind = CXIdxEntity_CXXStaticMethod; 7802957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis else 7812957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis EntityInfo.kind = CXIdxEntity_CXXInstanceMethod; 7822957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis } 7832957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis } 7842957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis break; 7852957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis case Decl::TypeAliasTemplate: 7862957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis EntityInfo.kind = CXIdxEntity_CXXTypeAlias; 7872957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis EntityInfo.templateKind = CXIdxEntity_Template; 7882957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis break; 7892957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis case Decl::TypeAlias: 7902957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis EntityInfo.kind = CXIdxEntity_CXXTypeAlias; break; 791dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis default: 792dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis break; 793dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis } 794dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis } 7954e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis 7962957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis if (EntityInfo.kind == CXIdxEntity_Unexposed) 7972957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis return; 7982957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis 7992957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis if (const FunctionDecl *FD = dyn_cast<FunctionDecl>(D)) { 8002957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis if (FD->getTemplatedKind() == 8012957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis FunctionDecl::TK_FunctionTemplateSpecialization) 8022957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis EntityInfo.templateKind = CXIdxEntity_TemplateSpecialization; 8032957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis } 8042957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis 8054e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis if (IdentifierInfo *II = D->getIdentifier()) { 8064e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis EntityInfo.name = SA.toCStr(II->getName()); 8074e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis 8084e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis } else if (isa<RecordDecl>(D) || isa<NamespaceDecl>(D)) { 809dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis EntityInfo.name = 0; // anonymous record/namespace. 8104e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis 8114e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis } else { 8124e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis unsigned Begin = SA.getCurSize(); 8134e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis { 8144e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis llvm::raw_svector_ostream OS(SA.getBuffer()); 8154e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis D->printName(OS); 8164e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis } 8174e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis EntityInfo.name = SA.getCStr(Begin); 8184e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis } 8194e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis 820dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis { 821dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis unsigned Begin = SA.getCurSize(); 822dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis bool Ignore = getDeclCursorUSR(D, SA.getBuffer()); 823dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis if (Ignore) { 824144b6c0c50b5523609cbac523f168b9e3cb01175Argyrios Kyrtzidis EntityInfo.USR = 0; 825dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis } else { 826dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis EntityInfo.USR = SA.getCStr(Begin); 827dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis } 8284e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis } 8294e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis} 8304e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis 8312957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidisvoid IndexingContext::getContainerInfo(const DeclContext *DC, 8322957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis ContainerInfo &ContInfo) { 8332957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis ContInfo.cursor = getCursor(cast<Decl>(DC)); 8342957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis ContInfo.DC = DC; 8352957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis ContInfo.IndexCtx = this; 8362957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis} 8372957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis 8384e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios KyrtzidisCXCursor IndexingContext::getRefCursor(const NamedDecl *D, SourceLocation Loc) { 8394e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis if (const TypeDecl *TD = dyn_cast<TypeDecl>(D)) 8404e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis return MakeCursorTypeRef(TD, Loc, CXTU); 8414e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis if (const ObjCInterfaceDecl *ID = dyn_cast<ObjCInterfaceDecl>(D)) 8424e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis return MakeCursorObjCClassRef(ID, Loc, CXTU); 8434e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis if (const ObjCProtocolDecl *PD = dyn_cast<ObjCProtocolDecl>(D)) 8444e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis return MakeCursorObjCProtocolRef(PD, Loc, CXTU); 845b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis if (const TemplateDecl *Template = dyn_cast<TemplateDecl>(D)) 846b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis return MakeCursorTemplateRef(Template, Loc, CXTU); 847b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis if (const NamespaceDecl *Namespace = dyn_cast<NamespaceDecl>(D)) 848b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis return MakeCursorNamespaceRef(Namespace, Loc, CXTU); 849b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis if (const NamespaceAliasDecl *Namespace = dyn_cast<NamespaceAliasDecl>(D)) 850b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis return MakeCursorNamespaceRef(Namespace, Loc, CXTU); 851b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis if (const FieldDecl *Field = dyn_cast<FieldDecl>(D)) 852b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis return MakeCursorMemberRef(Field, Loc, CXTU); 853b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis 8544e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis return clang_getNullCursor(); 8554e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis} 8562957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis 8572957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidisbool IndexingContext::shouldIgnoreIfImplicit(const NamedDecl *D) { 8582957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis if (isa<ObjCIvarDecl>(D)) 8592957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis return false; 8602957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis if (isa<ObjCMethodDecl>(D)) 8612957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis return false; 8622957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis return true; 8632957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis} 864