IndexingContext.cpp revision d6c8209fd1567db9c2721f441b50cb23cdf8d835
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" 154e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis#include "clang/AST/DeclObjC.h" 164e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis 174e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidisusing namespace clang; 184e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidisusing namespace cxindex; 194e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidisusing namespace cxcursor; 204e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis 216ec43adc39006a7fce94188956d0239bd54c0363Argyrios KyrtzidisIndexingContext::ObjCProtocolListInfo::ObjCProtocolListInfo( 226ec43adc39006a7fce94188956d0239bd54c0363Argyrios Kyrtzidis const ObjCProtocolList &ProtList, 236ec43adc39006a7fce94188956d0239bd54c0363Argyrios Kyrtzidis IndexingContext &IdxCtx, 246ec43adc39006a7fce94188956d0239bd54c0363Argyrios Kyrtzidis StrAdapter &SA) { 256ec43adc39006a7fce94188956d0239bd54c0363Argyrios Kyrtzidis ObjCInterfaceDecl::protocol_loc_iterator LI = ProtList.loc_begin(); 266ec43adc39006a7fce94188956d0239bd54c0363Argyrios Kyrtzidis for (ObjCInterfaceDecl::protocol_iterator 276ec43adc39006a7fce94188956d0239bd54c0363Argyrios Kyrtzidis I = ProtList.begin(), E = ProtList.end(); I != E; ++I, ++LI) { 286ec43adc39006a7fce94188956d0239bd54c0363Argyrios Kyrtzidis SourceLocation Loc = *LI; 296ec43adc39006a7fce94188956d0239bd54c0363Argyrios Kyrtzidis ObjCProtocolDecl *PD = *I; 306ec43adc39006a7fce94188956d0239bd54c0363Argyrios Kyrtzidis ProtEntities.push_back(CXIdxEntityInfo()); 316ec43adc39006a7fce94188956d0239bd54c0363Argyrios Kyrtzidis IdxCtx.getEntityInfo(PD, ProtEntities.back(), SA); 326ec43adc39006a7fce94188956d0239bd54c0363Argyrios Kyrtzidis CXIdxObjCProtocolRefInfo ProtInfo = { 0, 336ec43adc39006a7fce94188956d0239bd54c0363Argyrios Kyrtzidis MakeCursorObjCProtocolRef(PD, Loc, IdxCtx.CXTU), 346ec43adc39006a7fce94188956d0239bd54c0363Argyrios Kyrtzidis IdxCtx.getIndexLoc(Loc) }; 356ec43adc39006a7fce94188956d0239bd54c0363Argyrios Kyrtzidis ProtInfos.push_back(ProtInfo); 366ec43adc39006a7fce94188956d0239bd54c0363Argyrios Kyrtzidis } 376ec43adc39006a7fce94188956d0239bd54c0363Argyrios Kyrtzidis 386ec43adc39006a7fce94188956d0239bd54c0363Argyrios Kyrtzidis for (unsigned i = 0, e = ProtInfos.size(); i != e; ++i) 396ec43adc39006a7fce94188956d0239bd54c0363Argyrios Kyrtzidis ProtInfos[i].protocol = &ProtEntities[i]; 406ec43adc39006a7fce94188956d0239bd54c0363Argyrios Kyrtzidis 416ec43adc39006a7fce94188956d0239bd54c0363Argyrios Kyrtzidis for (unsigned i = 0, e = ProtInfos.size(); i != e; ++i) 426ec43adc39006a7fce94188956d0239bd54c0363Argyrios Kyrtzidis Prots.push_back(&ProtInfos[i]); 436ec43adc39006a7fce94188956d0239bd54c0363Argyrios Kyrtzidis} 446ec43adc39006a7fce94188956d0239bd54c0363Argyrios Kyrtzidis 454e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidisconst char *IndexingContext::StrAdapter::toCStr(StringRef Str) { 464e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis if (Str.empty()) 474e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis return ""; 484e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis if (Str.data()[Str.size()] == '\0') 494e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis return Str.data(); 504e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis Scratch += Str; 514e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis Scratch.push_back('\0'); 524e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis return Scratch.data() + (Scratch.size() - Str.size() - 1); 534e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis} 544e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis 554e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidisvoid IndexingContext::setASTContext(ASTContext &ctx) { 564e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis Ctx = &ctx; 574e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis static_cast<ASTUnit*>(CXTU->TUData)->setASTContext(&ctx); 584e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis} 594e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis 60dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidisvoid IndexingContext::enteredMainFile(const FileEntry *File) { 61dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis if (File && CB.enteredMainFile) { 62dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis CXIdxClientFile idxFile = CB.enteredMainFile(ClientData, (CXFile)File, 0); 63dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis FileMap[File] = idxFile; 64dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis } 65dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis} 66dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis 674e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidisvoid IndexingContext::ppIncludedFile(SourceLocation hashLoc, 684e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis StringRef filename, 694e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis const FileEntry *File, 704e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis bool isImport, bool isAngled) { 714e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis if (!CB.ppIncludedFile) 724e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis return; 734e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis 74dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis StrAdapter SA(*this); 754e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis CXIdxIncludedFileInfo Info = { getIndexLoc(hashLoc), 764e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis SA.toCStr(filename), 77dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis (CXFile)File, 784e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis isImport, isAngled }; 79dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis CXIdxClientFile idxFile = CB.ppIncludedFile(ClientData, &Info); 80dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis FileMap[File] = idxFile; 814e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis} 824e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis 836ec43adc39006a7fce94188956d0239bd54c0363Argyrios Kyrtzidisvoid IndexingContext::startedTranslationUnit() { 84dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis CXIdxClientContainer idxCont = 0; 854e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis if (CB.startedTranslationUnit) 864e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis idxCont = CB.startedTranslationUnit(ClientData, 0); 874e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis addContainerInMap(Ctx->getTranslationUnitDecl(), idxCont); 884e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis} 894e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis 904e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidisvoid IndexingContext::handleDiagnostic(const StoredDiagnostic &StoredDiag) { 914e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis if (!CB.diagnostic) 924e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis return; 934e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis 944e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis CXStoredDiagnostic CXDiag(StoredDiag, Ctx->getLangOptions()); 954e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis CB.diagnostic(ClientData, &CXDiag, 0); 964e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis} 974e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis 9821ee5707e6e59d982d2f2ae28e079c7ff46dc519Argyrios Kyrtzidisvoid IndexingContext::handleDiagnostic(CXDiagnostic CXDiag) { 9921ee5707e6e59d982d2f2ae28e079c7ff46dc519Argyrios Kyrtzidis if (!CB.diagnostic) 10021ee5707e6e59d982d2f2ae28e079c7ff46dc519Argyrios Kyrtzidis return; 10121ee5707e6e59d982d2f2ae28e079c7ff46dc519Argyrios Kyrtzidis 10221ee5707e6e59d982d2f2ae28e079c7ff46dc519Argyrios Kyrtzidis CB.diagnostic(ClientData, CXDiag, 0); 10321ee5707e6e59d982d2f2ae28e079c7ff46dc519Argyrios Kyrtzidis} 10421ee5707e6e59d982d2f2ae28e079c7ff46dc519Argyrios Kyrtzidis 105dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidisvoid IndexingContext::handleDecl(const NamedDecl *D, 106dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis SourceLocation Loc, CXCursor Cursor, 107dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis DeclInfo &DInfo) { 108dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis if (!CB.indexDeclaration) 109dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis return; 1104e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis 111dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis StrAdapter SA(*this); 112dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis getEntityInfo(D, DInfo.CXEntInfo, SA); 113dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis DInfo.entityInfo = &DInfo.CXEntInfo; 114dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis DInfo.cursor = Cursor; 115dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis DInfo.loc = getIndexLoc(Loc); 116dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis DInfo.container = getIndexContainer(D); 117c71d55469e7d5f7b376a30620617a175a9442da9Argyrios Kyrtzidis DInfo.isImplicit = D->isImplicit(); 118dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis 1196ec43adc39006a7fce94188956d0239bd54c0363Argyrios Kyrtzidis CXIdxClientContainer clientCont = 0; 120c71d55469e7d5f7b376a30620617a175a9442da9Argyrios Kyrtzidis CXIdxDeclOut DeclOut = { DInfo.isContainer ? &clientCont : 0 }; 1216ec43adc39006a7fce94188956d0239bd54c0363Argyrios Kyrtzidis CB.indexDeclaration(ClientData, &DInfo, &DeclOut); 122dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis 123c71d55469e7d5f7b376a30620617a175a9442da9Argyrios Kyrtzidis if (DInfo.isContainer) 1246ec43adc39006a7fce94188956d0239bd54c0363Argyrios Kyrtzidis addContainerInMap(cast<DeclContext>(D), clientCont); 125dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis} 126dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis 127dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidisvoid IndexingContext::handleObjCContainer(const ObjCContainerDecl *D, 128dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis SourceLocation Loc, CXCursor Cursor, 129dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis ObjCContainerDeclInfo &ContDInfo) { 1306ec43adc39006a7fce94188956d0239bd54c0363Argyrios Kyrtzidis ContDInfo.ObjCContDeclInfo.declInfo = &ContDInfo; 131c71d55469e7d5f7b376a30620617a175a9442da9Argyrios Kyrtzidis handleDecl(D, Loc, Cursor, ContDInfo); 1324e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis} 1334e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis 134dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidisvoid IndexingContext::handleFunction(const FunctionDecl *D) { 135c71d55469e7d5f7b376a30620617a175a9442da9Argyrios Kyrtzidis DeclInfo DInfo(!D->isFirstDeclaration(), D->isThisDeclarationADefinition(), 136c71d55469e7d5f7b376a30620617a175a9442da9Argyrios Kyrtzidis D->isThisDeclarationADefinition()); 137c71d55469e7d5f7b376a30620617a175a9442da9Argyrios Kyrtzidis handleDecl(D, D->getLocation(), getCursor(D), DInfo); 138dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis} 1394e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis 140dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidisvoid IndexingContext::handleVar(const VarDecl *D) { 141c71d55469e7d5f7b376a30620617a175a9442da9Argyrios Kyrtzidis DeclInfo DInfo(!D->isFirstDeclaration(), D->isThisDeclarationADefinition(), 142c71d55469e7d5f7b376a30620617a175a9442da9Argyrios Kyrtzidis /*isContainer=*/false); 143c71d55469e7d5f7b376a30620617a175a9442da9Argyrios Kyrtzidis handleDecl(D, D->getLocation(), getCursor(D), DInfo); 1444e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis} 1454e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis 1464e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidisvoid IndexingContext::handleField(const FieldDecl *D) { 147c71d55469e7d5f7b376a30620617a175a9442da9Argyrios Kyrtzidis DeclInfo DInfo(/*isRedeclaration=*/false, /*isDefinition=*/true, 148c71d55469e7d5f7b376a30620617a175a9442da9Argyrios Kyrtzidis /*isContainer=*/false); 149c71d55469e7d5f7b376a30620617a175a9442da9Argyrios Kyrtzidis handleDecl(D, D->getLocation(), getCursor(D), DInfo); 1504e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis} 1514e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis 1524e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidisvoid IndexingContext::handleEnumerator(const EnumConstantDecl *D) { 153c71d55469e7d5f7b376a30620617a175a9442da9Argyrios Kyrtzidis DeclInfo DInfo(/*isRedeclaration=*/false, /*isDefinition=*/true, 154c71d55469e7d5f7b376a30620617a175a9442da9Argyrios Kyrtzidis /*isContainer=*/false); 155c71d55469e7d5f7b376a30620617a175a9442da9Argyrios Kyrtzidis handleDecl(D, D->getLocation(), getCursor(D), DInfo); 1564e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis} 1574e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis 1584e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidisvoid IndexingContext::handleTagDecl(const TagDecl *D) { 159c71d55469e7d5f7b376a30620617a175a9442da9Argyrios Kyrtzidis DeclInfo DInfo(!D->isFirstDeclaration(), D->isThisDeclarationADefinition(), 160c71d55469e7d5f7b376a30620617a175a9442da9Argyrios Kyrtzidis D->isThisDeclarationADefinition()); 161c71d55469e7d5f7b376a30620617a175a9442da9Argyrios Kyrtzidis handleDecl(D, D->getLocation(), getCursor(D), DInfo); 1624e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis} 1634e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis 1644e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidisvoid IndexingContext::handleTypedef(const TypedefDecl *D) { 165c71d55469e7d5f7b376a30620617a175a9442da9Argyrios Kyrtzidis DeclInfo DInfo(!D->isFirstDeclaration(), /*isDefinition=*/true, 166c71d55469e7d5f7b376a30620617a175a9442da9Argyrios Kyrtzidis /*isContainer=*/false); 167c71d55469e7d5f7b376a30620617a175a9442da9Argyrios Kyrtzidis handleDecl(D, D->getLocation(), getCursor(D), DInfo); 168dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis} 1694e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis 170dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidisvoid IndexingContext::handleObjCClass(const ObjCClassDecl *D) { 171dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis const ObjCClassDecl::ObjCClassRef *Ref = D->getForwardDecl(); 172dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis ObjCInterfaceDecl *IFaceD = Ref->getInterface(); 173dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis SourceLocation Loc = Ref->getLocation(); 174dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis bool isRedeclaration = IFaceD->getLocation() != Loc; 175c71d55469e7d5f7b376a30620617a175a9442da9Argyrios Kyrtzidis 176c71d55469e7d5f7b376a30620617a175a9442da9Argyrios Kyrtzidis ObjCContainerDeclInfo ContDInfo(/*isForwardRef=*/true, isRedeclaration, 177c71d55469e7d5f7b376a30620617a175a9442da9Argyrios Kyrtzidis /*isImplementation=*/false); 178dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis handleObjCContainer(IFaceD, Loc, MakeCursorObjCClassRef(IFaceD, Loc, CXTU), 179c71d55469e7d5f7b376a30620617a175a9442da9Argyrios Kyrtzidis ContDInfo); 1804e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis} 1814e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis 1824e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidisvoid IndexingContext::handleObjCInterface(const ObjCInterfaceDecl *D) { 1836ec43adc39006a7fce94188956d0239bd54c0363Argyrios Kyrtzidis StrAdapter SA(*this); 1846ec43adc39006a7fce94188956d0239bd54c0363Argyrios Kyrtzidis 1856ec43adc39006a7fce94188956d0239bd54c0363Argyrios Kyrtzidis CXIdxBaseClassInfo BaseClass; 1866ec43adc39006a7fce94188956d0239bd54c0363Argyrios Kyrtzidis CXIdxEntityInfo BaseEntity; 1876ec43adc39006a7fce94188956d0239bd54c0363Argyrios Kyrtzidis BaseClass.cursor = clang_getNullCursor(); 1886ec43adc39006a7fce94188956d0239bd54c0363Argyrios Kyrtzidis if (ObjCInterfaceDecl *SuperD = D->getSuperClass()) { 1896ec43adc39006a7fce94188956d0239bd54c0363Argyrios Kyrtzidis getEntityInfo(SuperD, BaseEntity, SA); 1906ec43adc39006a7fce94188956d0239bd54c0363Argyrios Kyrtzidis SourceLocation SuperLoc = D->getSuperClassLoc(); 1916ec43adc39006a7fce94188956d0239bd54c0363Argyrios Kyrtzidis BaseClass.base = &BaseEntity; 1926ec43adc39006a7fce94188956d0239bd54c0363Argyrios Kyrtzidis BaseClass.cursor = MakeCursorObjCSuperClassRef(SuperD, SuperLoc, CXTU); 1936ec43adc39006a7fce94188956d0239bd54c0363Argyrios Kyrtzidis BaseClass.loc = getIndexLoc(SuperLoc); 1946ec43adc39006a7fce94188956d0239bd54c0363Argyrios Kyrtzidis } 1956ec43adc39006a7fce94188956d0239bd54c0363Argyrios Kyrtzidis 1966ec43adc39006a7fce94188956d0239bd54c0363Argyrios Kyrtzidis ObjCProtocolListInfo ProtInfo(D->getReferencedProtocols(), *this, SA); 1976ec43adc39006a7fce94188956d0239bd54c0363Argyrios Kyrtzidis 198c71d55469e7d5f7b376a30620617a175a9442da9Argyrios Kyrtzidis ObjCInterfaceDeclInfo InterInfo(D); 199c71d55469e7d5f7b376a30620617a175a9442da9Argyrios Kyrtzidis InterInfo.ObjCProtoListInfo = ProtInfo.getListInfo(); 200c71d55469e7d5f7b376a30620617a175a9442da9Argyrios Kyrtzidis InterInfo.ObjCInterDeclInfo.containerInfo = &InterInfo.ObjCContDeclInfo; 2016ec43adc39006a7fce94188956d0239bd54c0363Argyrios Kyrtzidis InterInfo.ObjCInterDeclInfo.superInfo = D->getSuperClass() ? &BaseClass : 0; 202c71d55469e7d5f7b376a30620617a175a9442da9Argyrios Kyrtzidis InterInfo.ObjCInterDeclInfo.protocols = &InterInfo.ObjCProtoListInfo; 2036ec43adc39006a7fce94188956d0239bd54c0363Argyrios Kyrtzidis 204c71d55469e7d5f7b376a30620617a175a9442da9Argyrios Kyrtzidis handleObjCContainer(D, D->getLocation(), getCursor(D), InterInfo); 205dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis} 2064e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis 207dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidisvoid IndexingContext::handleObjCImplementation( 208dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis const ObjCImplementationDecl *D) { 209c71d55469e7d5f7b376a30620617a175a9442da9Argyrios Kyrtzidis ObjCContainerDeclInfo ContDInfo(/*isForwardRef=*/false, 210e7bbab91f5cc899104d0a1dee6059d8413c70eebArgyrios Kyrtzidis /*isRedeclaration=*/true, 211c71d55469e7d5f7b376a30620617a175a9442da9Argyrios Kyrtzidis /*isImplementation=*/true); 212c71d55469e7d5f7b376a30620617a175a9442da9Argyrios Kyrtzidis handleObjCContainer(D, D->getLocation(), getCursor(D), ContDInfo); 213dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis} 2144e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis 215dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidisvoid IndexingContext::handleObjCForwardProtocol(const ObjCProtocolDecl *D, 216dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis SourceLocation Loc, 217dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis bool isRedeclaration) { 218c71d55469e7d5f7b376a30620617a175a9442da9Argyrios Kyrtzidis ObjCContainerDeclInfo ContDInfo(/*isForwardRef=*/true, 219c71d55469e7d5f7b376a30620617a175a9442da9Argyrios Kyrtzidis isRedeclaration, 220c71d55469e7d5f7b376a30620617a175a9442da9Argyrios Kyrtzidis /*isImplementation=*/false); 221dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis handleObjCContainer(D, Loc, MakeCursorObjCProtocolRef(D, Loc, CXTU), 222c71d55469e7d5f7b376a30620617a175a9442da9Argyrios Kyrtzidis ContDInfo); 223dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis} 2244e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis 225dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidisvoid IndexingContext::handleObjCProtocol(const ObjCProtocolDecl *D) { 226dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis StrAdapter SA(*this); 2276ec43adc39006a7fce94188956d0239bd54c0363Argyrios Kyrtzidis ObjCProtocolListInfo ProtListInfo(D->getReferencedProtocols(), *this, SA); 228dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis 229c71d55469e7d5f7b376a30620617a175a9442da9Argyrios Kyrtzidis ObjCProtocolDeclInfo ProtInfo(D); 230c71d55469e7d5f7b376a30620617a175a9442da9Argyrios Kyrtzidis ProtInfo.ObjCProtoRefListInfo = ProtListInfo.getListInfo(); 2314e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis 232c71d55469e7d5f7b376a30620617a175a9442da9Argyrios Kyrtzidis handleObjCContainer(D, D->getLocation(), getCursor(D), ProtInfo); 2334e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis} 2344e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis 2354e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidisvoid IndexingContext::handleObjCCategory(const ObjCCategoryDecl *D) { 236c71d55469e7d5f7b376a30620617a175a9442da9Argyrios Kyrtzidis ObjCCategoryDeclInfo CatDInfo(/*isImplementation=*/false); 237dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis CXIdxEntityInfo ClassEntity; 238dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis StrAdapter SA(*this); 23921ee5707e6e59d982d2f2ae28e079c7ff46dc519Argyrios Kyrtzidis const ObjCInterfaceDecl *IFaceD = D->getClassInterface(); 24021ee5707e6e59d982d2f2ae28e079c7ff46dc519Argyrios Kyrtzidis SourceLocation ClassLoc = D->getLocation(); 24121ee5707e6e59d982d2f2ae28e079c7ff46dc519Argyrios Kyrtzidis SourceLocation CategoryLoc = D->getCategoryNameLoc(); 242c6b4a5099588fd21b49c80f730a596a64b2766c6Argyrios Kyrtzidis getEntityInfo(IFaceD, ClassEntity, SA); 243dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis 2446ec43adc39006a7fce94188956d0239bd54c0363Argyrios Kyrtzidis CatDInfo.ObjCCatDeclInfo.containerInfo = &CatDInfo.ObjCContDeclInfo; 245c6b4a5099588fd21b49c80f730a596a64b2766c6Argyrios Kyrtzidis if (IFaceD) { 246c6b4a5099588fd21b49c80f730a596a64b2766c6Argyrios Kyrtzidis CatDInfo.ObjCCatDeclInfo.objcClass = &ClassEntity; 247c6b4a5099588fd21b49c80f730a596a64b2766c6Argyrios Kyrtzidis CatDInfo.ObjCCatDeclInfo.classCursor = 248c6b4a5099588fd21b49c80f730a596a64b2766c6Argyrios Kyrtzidis MakeCursorObjCClassRef(IFaceD, ClassLoc, CXTU); 249c6b4a5099588fd21b49c80f730a596a64b2766c6Argyrios Kyrtzidis } else { 250c6b4a5099588fd21b49c80f730a596a64b2766c6Argyrios Kyrtzidis CatDInfo.ObjCCatDeclInfo.objcClass = 0; 251c6b4a5099588fd21b49c80f730a596a64b2766c6Argyrios Kyrtzidis CatDInfo.ObjCCatDeclInfo.classCursor = clang_getNullCursor(); 252c6b4a5099588fd21b49c80f730a596a64b2766c6Argyrios Kyrtzidis } 25321ee5707e6e59d982d2f2ae28e079c7ff46dc519Argyrios Kyrtzidis CatDInfo.ObjCCatDeclInfo.classLoc = getIndexLoc(ClassLoc); 25421ee5707e6e59d982d2f2ae28e079c7ff46dc519Argyrios Kyrtzidis handleObjCContainer(D, CategoryLoc, getCursor(D), CatDInfo); 255dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis} 256dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis 257dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidisvoid IndexingContext::handleObjCCategoryImpl(const ObjCCategoryImplDecl *D) { 258dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis const ObjCCategoryDecl *CatD = D->getCategoryDecl(); 259c71d55469e7d5f7b376a30620617a175a9442da9Argyrios Kyrtzidis ObjCCategoryDeclInfo CatDInfo(/*isImplementation=*/true); 260dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis CXIdxEntityInfo ClassEntity; 261dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis StrAdapter SA(*this); 262dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis getEntityInfo(CatD->getClassInterface(), ClassEntity, SA); 263dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis 2646ec43adc39006a7fce94188956d0239bd54c0363Argyrios Kyrtzidis CatDInfo.ObjCCatDeclInfo.containerInfo = &CatDInfo.ObjCContDeclInfo; 2656ec43adc39006a7fce94188956d0239bd54c0363Argyrios Kyrtzidis CatDInfo.ObjCCatDeclInfo.objcClass = &ClassEntity; 266c71d55469e7d5f7b376a30620617a175a9442da9Argyrios Kyrtzidis handleObjCContainer(D, D->getLocation(), getCursor(D), CatDInfo); 2674e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis} 2684e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis 2694e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidisvoid IndexingContext::handleObjCMethod(const ObjCMethodDecl *D) { 270c71d55469e7d5f7b376a30620617a175a9442da9Argyrios Kyrtzidis DeclInfo DInfo(!D->isCanonicalDecl(), D->isThisDeclarationADefinition(), 271c71d55469e7d5f7b376a30620617a175a9442da9Argyrios Kyrtzidis D->isThisDeclarationADefinition()); 272c71d55469e7d5f7b376a30620617a175a9442da9Argyrios Kyrtzidis handleDecl(D, D->getLocation(), getCursor(D), DInfo); 2734e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis} 2744e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis 2754e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidisvoid IndexingContext::handleObjCProperty(const ObjCPropertyDecl *D) { 276c71d55469e7d5f7b376a30620617a175a9442da9Argyrios Kyrtzidis DeclInfo DInfo(/*isRedeclaration=*/false, /*isDefinition=*/false, 277c71d55469e7d5f7b376a30620617a175a9442da9Argyrios Kyrtzidis /*isContainer=*/false); 278c71d55469e7d5f7b376a30620617a175a9442da9Argyrios Kyrtzidis handleDecl(D, D->getLocation(), getCursor(D), DInfo); 2794e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis} 2804e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis 2814e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidisvoid IndexingContext::handleReference(const NamedDecl *D, SourceLocation Loc, 2824e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis const NamedDecl *Parent, 2834e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis const DeclContext *DC, 284aca19be8731fc31cff68702de0dc7f30ce908979Argyrios Kyrtzidis const Expr *E, 285aca19be8731fc31cff68702de0dc7f30ce908979Argyrios Kyrtzidis CXIdxEntityRefKind Kind) { 286d6c8209fd1567db9c2721f441b50cb23cdf8d835Argyrios Kyrtzidis if (!D) 287d6c8209fd1567db9c2721f441b50cb23cdf8d835Argyrios Kyrtzidis return; 288d6c8209fd1567db9c2721f441b50cb23cdf8d835Argyrios Kyrtzidis if (D->getParentFunctionOrMethod()) 289d6c8209fd1567db9c2721f441b50cb23cdf8d835Argyrios Kyrtzidis return; 2904e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis if (Loc.isInvalid()) 2914e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis return; 2924e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis if (!CB.indexEntityReference) 2934e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis return; 2944e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis if (isNotFromSourceFile(D->getLocation())) 2954e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis return; 2964e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis 297c6b4a5099588fd21b49c80f730a596a64b2766c6Argyrios Kyrtzidis D = getEntityDecl(D); 298c6b4a5099588fd21b49c80f730a596a64b2766c6Argyrios Kyrtzidis 299c6b4a5099588fd21b49c80f730a596a64b2766c6Argyrios Kyrtzidis if (onlyOneRefPerFile()) { 300c6b4a5099588fd21b49c80f730a596a64b2766c6Argyrios Kyrtzidis SourceManager &SM = Ctx->getSourceManager(); 301c6b4a5099588fd21b49c80f730a596a64b2766c6Argyrios Kyrtzidis SourceLocation FileLoc = SM.getFileLoc(Loc); 302c6b4a5099588fd21b49c80f730a596a64b2766c6Argyrios Kyrtzidis 303c6b4a5099588fd21b49c80f730a596a64b2766c6Argyrios Kyrtzidis std::pair<FileID, unsigned> LocInfo = SM.getDecomposedLoc(Loc); 304c6b4a5099588fd21b49c80f730a596a64b2766c6Argyrios Kyrtzidis FileID FID = LocInfo.first; 305c6b4a5099588fd21b49c80f730a596a64b2766c6Argyrios Kyrtzidis if (FID.isInvalid()) 306c6b4a5099588fd21b49c80f730a596a64b2766c6Argyrios Kyrtzidis return; 307c6b4a5099588fd21b49c80f730a596a64b2766c6Argyrios Kyrtzidis 308c6b4a5099588fd21b49c80f730a596a64b2766c6Argyrios Kyrtzidis const FileEntry *FE = SM.getFileEntryForID(FID); 309c6b4a5099588fd21b49c80f730a596a64b2766c6Argyrios Kyrtzidis if (!FE) 310c6b4a5099588fd21b49c80f730a596a64b2766c6Argyrios Kyrtzidis return; 311c6b4a5099588fd21b49c80f730a596a64b2766c6Argyrios Kyrtzidis RefFileOccurence RefOccur(FE, D); 312c6b4a5099588fd21b49c80f730a596a64b2766c6Argyrios Kyrtzidis std::pair<llvm::DenseSet<RefFileOccurence>::iterator, bool> 313c6b4a5099588fd21b49c80f730a596a64b2766c6Argyrios Kyrtzidis res = RefFileOccurences.insert(RefOccur); 314c6b4a5099588fd21b49c80f730a596a64b2766c6Argyrios Kyrtzidis if (!res.second) 315c6b4a5099588fd21b49c80f730a596a64b2766c6Argyrios Kyrtzidis return; // already in map. 316c6b4a5099588fd21b49c80f730a596a64b2766c6Argyrios Kyrtzidis } 317c6b4a5099588fd21b49c80f730a596a64b2766c6Argyrios Kyrtzidis 318dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis StrAdapter SA(*this); 319854625f7347e4418803fe4aa9131928408e4dc53Benjamin Kramer CXCursor Cursor = E ? MakeCXCursor(const_cast<Expr*>(E), 320854625f7347e4418803fe4aa9131928408e4dc53Benjamin Kramer const_cast<Decl*>(cast<Decl>(DC)), CXTU) 321854625f7347e4418803fe4aa9131928408e4dc53Benjamin Kramer : getRefCursor(D, Loc); 322854625f7347e4418803fe4aa9131928408e4dc53Benjamin Kramer 323dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis CXIdxEntityInfo RefEntity, ParentEntity; 324dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis getEntityInfo(D, RefEntity, SA); 325dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis getEntityInfo(Parent, ParentEntity, SA); 326854625f7347e4418803fe4aa9131928408e4dc53Benjamin Kramer CXIdxEntityRefInfo Info = { Cursor, 3274e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis getIndexLoc(Loc), 328dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis &RefEntity, 329c6b4a5099588fd21b49c80f730a596a64b2766c6Argyrios Kyrtzidis Parent ? &ParentEntity : 0, 330aca19be8731fc31cff68702de0dc7f30ce908979Argyrios Kyrtzidis getIndexContainerForDC(DC), 331aca19be8731fc31cff68702de0dc7f30ce908979Argyrios Kyrtzidis Kind }; 3324e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis CB.indexEntityReference(ClientData, &Info); 3334e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis} 3344e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis 3354e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidisbool IndexingContext::isNotFromSourceFile(SourceLocation Loc) const { 3364e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis if (Loc.isInvalid()) 3374e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis return true; 3384e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis SourceManager &SM = Ctx->getSourceManager(); 3394e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis SourceLocation FileLoc = SM.getFileLoc(Loc); 3404e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis FileID FID = SM.getFileID(FileLoc); 3414e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis return SM.getFileEntryForID(FID) == 0; 3424e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis} 3434e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis 3444e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidisvoid IndexingContext::addContainerInMap(const DeclContext *DC, 345dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis CXIdxClientContainer container) { 3464e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis assert(getScopedContext(DC) == DC); 3474e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis ContainerMapTy::iterator I = ContainerMap.find(DC); 3484e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis if (I == ContainerMap.end()) { 3494e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis if (container) 3504e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis ContainerMap[DC] = container; 3514e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis return; 3524e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis } 3534e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis // Allow changing the container of a previously seen DeclContext so we 3544e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis // can handle invalid user code, like a function re-definition. 3554e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis if (container) 3564e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis I->second = container; 3574e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis else 3584e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis ContainerMap.erase(I); 3594e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis} 3604e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis 3614e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidisconst NamedDecl *IndexingContext::getEntityDecl(const NamedDecl *D) const { 3624e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis assert(D); 3634e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis D = cast<NamedDecl>(D->getCanonicalDecl()); 3644e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis 3654e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis if (const ObjCCategoryDecl *Cat = dyn_cast<ObjCCategoryDecl>(D)) { 3664e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis if (Cat->IsClassExtension()) 3674e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis return getEntityDecl(Cat->getClassInterface()); 3684e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis 3694e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis } else if (const ObjCImplementationDecl * 3704e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis ImplD = dyn_cast<ObjCImplementationDecl>(D)) { 3714e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis return getEntityDecl(ImplD->getClassInterface()); 3724e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis 3734e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis } else if (const ObjCCategoryImplDecl * 3744e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis CatImplD = dyn_cast<ObjCCategoryImplDecl>(D)) { 3754e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis return getEntityDecl(CatImplD->getCategoryDecl()); 3764e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis } 3774e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis 3784e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis return D; 3794e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis} 3804e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis 3814e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidisconst DeclContext * 3824e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios KyrtzidisIndexingContext::getScopedContext(const DeclContext *DC) const { 3834e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis // Local contexts are ignored for indexing. 3844e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis const DeclContext *FuncCtx = cast<Decl>(DC)->getParentFunctionOrMethod(); 3854e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis if (FuncCtx) 3864e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis return FuncCtx; 3874e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis 3884e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis // We consider enums always scoped for indexing. 3894e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis if (isa<TagDecl>(DC)) 3904e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis return DC; 3914e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis 3924e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis if (const NamespaceDecl *NS = dyn_cast<NamespaceDecl>(DC)) { 3934e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis if (NS->isAnonymousNamespace()) 3944e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis return getScopedContext(NS->getParent()); 3954e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis return NS; 3964e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis } 3974e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis 3984e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis return DC->getRedeclContext(); 3994e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis} 4004e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis 401dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios KyrtzidisCXIdxClientContainer 4024e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios KyrtzidisIndexingContext::getIndexContainerForDC(const DeclContext *DC) const { 4034e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis DC = getScopedContext(DC); 4044e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis ContainerMapTy::const_iterator I = ContainerMap.find(DC); 4054e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis// assert(I != ContainerMap.end() && 4064e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis// "Failed to include a scoped context in the container map"); 4074e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis return I->second; 4084e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis} 4094e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis 410dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios KyrtzidisCXIdxClientFile IndexingContext::getIndexFile(const FileEntry *File) { 4114e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis if (!File) 4124e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis return 0; 4134e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis 4144e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis FileMapTy::iterator FI = FileMap.find(File); 4154e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis if (FI != FileMap.end()) 4164e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis return FI->second; 4174e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis 418dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis return 0; 4194e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis} 4204e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis 4214e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios KyrtzidisCXIdxLoc IndexingContext::getIndexLoc(SourceLocation Loc) const { 4224e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis CXIdxLoc idxLoc = { {0, 0}, 0 }; 4234e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis if (Loc.isInvalid()) 4244e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis return idxLoc; 4254e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis 4264e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis idxLoc.ptr_data[0] = (void*)this; 4274e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis idxLoc.int_data = Loc.getRawEncoding(); 4284e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis return idxLoc; 4294e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis} 4304e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis 4314e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidisvoid IndexingContext::translateLoc(SourceLocation Loc, 432dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis CXIdxClientFile *indexFile, CXFile *file, 4334e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis unsigned *line, unsigned *column, 4344e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis unsigned *offset) { 4354e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis if (Loc.isInvalid()) 4364e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis return; 4374e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis 4384e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis SourceManager &SM = Ctx->getSourceManager(); 4394e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis Loc = SM.getFileLoc(Loc); 4404e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis 4414e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis std::pair<FileID, unsigned> LocInfo = SM.getDecomposedLoc(Loc); 4424e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis FileID FID = LocInfo.first; 4434e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis unsigned FileOffset = LocInfo.second; 4444e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis 4454e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis if (FID.isInvalid()) 4464e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis return; 4474e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis 4484e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis const FileEntry *FE = SM.getFileEntryForID(FID); 4494e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis if (indexFile) 4504e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis *indexFile = getIndexFile(FE); 4514e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis if (file) 4524e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis *file = (void *)FE; 4534e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis if (line) 4544e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis *line = SM.getLineNumber(FID, FileOffset); 4554e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis if (column) 4564e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis *column = SM.getColumnNumber(FID, FileOffset); 4574e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis if (offset) 4584e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis *offset = FileOffset; 4594e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis} 4604e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis 461dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidisvoid IndexingContext::getEntityInfo(const NamedDecl *D, 462dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis CXIdxEntityInfo &EntityInfo, 463dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis StrAdapter &SA) { 464c6b4a5099588fd21b49c80f730a596a64b2766c6Argyrios Kyrtzidis if (!D) 465c6b4a5099588fd21b49c80f730a596a64b2766c6Argyrios Kyrtzidis return; 466dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis D = getEntityDecl(D); 467dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis EntityInfo.kind = CXIdxEntity_Unexposed; 468dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis 469dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis if (const TagDecl *TD = dyn_cast<TagDecl>(D)) { 470dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis switch (TD->getTagKind()) { 471dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis case TTK_Struct: 472dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis EntityInfo.kind = CXIdxEntity_Struct; break; 473dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis case TTK_Union: 474dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis EntityInfo.kind = CXIdxEntity_Union; break; 475dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis case TTK_Class: 476dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis EntityInfo.kind = CXIdxEntity_CXXClass; break; 477dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis case TTK_Enum: 478dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis EntityInfo.kind = CXIdxEntity_Enum; break; 479dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis } 4804e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis 481dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis } else { 482dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis switch (D->getKind()) { 483dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis case Decl::Typedef: 484dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis EntityInfo.kind = CXIdxEntity_Typedef; break; 485dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis case Decl::Function: 486dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis EntityInfo.kind = CXIdxEntity_Function; break; 487dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis case Decl::Var: 488dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis EntityInfo.kind = CXIdxEntity_Variable; break; 489dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis case Decl::Field: 490dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis EntityInfo.kind = CXIdxEntity_Field; break; 491dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis case Decl::EnumConstant: 492dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis EntityInfo.kind = CXIdxEntity_EnumConstant; break; 493dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis case Decl::ObjCInterface: 494dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis EntityInfo.kind = CXIdxEntity_ObjCClass; break; 495dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis case Decl::ObjCProtocol: 496dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis EntityInfo.kind = CXIdxEntity_ObjCProtocol; break; 497dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis case Decl::ObjCCategory: 498dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis EntityInfo.kind = CXIdxEntity_ObjCCategory; break; 499dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis case Decl::ObjCMethod: 500c71d55469e7d5f7b376a30620617a175a9442da9Argyrios Kyrtzidis if (cast<ObjCMethodDecl>(D)->isInstanceMethod()) 501c71d55469e7d5f7b376a30620617a175a9442da9Argyrios Kyrtzidis EntityInfo.kind = CXIdxEntity_ObjCInstanceMethod; 502c71d55469e7d5f7b376a30620617a175a9442da9Argyrios Kyrtzidis else 503c71d55469e7d5f7b376a30620617a175a9442da9Argyrios Kyrtzidis EntityInfo.kind = CXIdxEntity_ObjCClassMethod; 504c71d55469e7d5f7b376a30620617a175a9442da9Argyrios Kyrtzidis break; 505dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis case Decl::ObjCProperty: 506dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis EntityInfo.kind = CXIdxEntity_ObjCProperty; break; 507dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis case Decl::ObjCIvar: 508dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis EntityInfo.kind = CXIdxEntity_ObjCIvar; break; 509dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis default: 510dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis break; 511dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis } 512dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis } 5134e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis 5144e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis if (IdentifierInfo *II = D->getIdentifier()) { 5154e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis EntityInfo.name = SA.toCStr(II->getName()); 5164e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis 5174e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis } else if (isa<RecordDecl>(D) || isa<NamespaceDecl>(D)) { 518dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis EntityInfo.name = 0; // anonymous record/namespace. 5194e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis 5204e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis } else { 5214e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis unsigned Begin = SA.getCurSize(); 5224e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis { 5234e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis llvm::raw_svector_ostream OS(SA.getBuffer()); 5244e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis D->printName(OS); 5254e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis } 5264e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis EntityInfo.name = SA.getCStr(Begin); 5274e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis } 5284e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis 529dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis { 530dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis unsigned Begin = SA.getCurSize(); 531dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis bool Ignore = getDeclCursorUSR(D, SA.getBuffer()); 532dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis if (Ignore) { 533dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis EntityInfo.USR = ""; 534dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis } else { 535dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis EntityInfo.USR = SA.getCStr(Begin); 536dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis } 5374e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis } 5384e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis} 5394e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis 5404e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios KyrtzidisCXCursor IndexingContext::getRefCursor(const NamedDecl *D, SourceLocation Loc) { 5414e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis if (const TypeDecl *TD = dyn_cast<TypeDecl>(D)) 5424e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis return MakeCursorTypeRef(TD, Loc, CXTU); 5434e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis if (const ObjCInterfaceDecl *ID = dyn_cast<ObjCInterfaceDecl>(D)) 5444e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis return MakeCursorObjCClassRef(ID, Loc, CXTU); 5454e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis if (const ObjCProtocolDecl *PD = dyn_cast<ObjCProtocolDecl>(D)) 5464e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis return MakeCursorObjCProtocolRef(PD, Loc, CXTU); 5474e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis 5484e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis //assert(0 && "not yet"); 5494e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis return clang_getNullCursor(); 5504e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis} 551