IndexingContext.cpp revision 3e340a67f4522a2f633a719cb7f3389fe2474374
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); 2623e340a67f4522a2f633a719cb7f3389fe2474374Argyrios Kyrtzidis const ObjCInterfaceDecl *IFaceD = CatD->getClassInterface(); 2633e340a67f4522a2f633a719cb7f3389fe2474374Argyrios Kyrtzidis SourceLocation ClassLoc = D->getLocation(); 2643e340a67f4522a2f633a719cb7f3389fe2474374Argyrios Kyrtzidis SourceLocation CategoryLoc = ClassLoc; //FIXME: D->getCategoryNameLoc(); 2653e340a67f4522a2f633a719cb7f3389fe2474374Argyrios Kyrtzidis getEntityInfo(IFaceD, ClassEntity, SA); 266dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis 2676ec43adc39006a7fce94188956d0239bd54c0363Argyrios Kyrtzidis CatDInfo.ObjCCatDeclInfo.containerInfo = &CatDInfo.ObjCContDeclInfo; 2683e340a67f4522a2f633a719cb7f3389fe2474374Argyrios Kyrtzidis if (IFaceD) { 2693e340a67f4522a2f633a719cb7f3389fe2474374Argyrios Kyrtzidis CatDInfo.ObjCCatDeclInfo.objcClass = &ClassEntity; 2703e340a67f4522a2f633a719cb7f3389fe2474374Argyrios Kyrtzidis CatDInfo.ObjCCatDeclInfo.classCursor = 2713e340a67f4522a2f633a719cb7f3389fe2474374Argyrios Kyrtzidis MakeCursorObjCClassRef(IFaceD, ClassLoc, CXTU); 2723e340a67f4522a2f633a719cb7f3389fe2474374Argyrios Kyrtzidis } else { 2733e340a67f4522a2f633a719cb7f3389fe2474374Argyrios Kyrtzidis CatDInfo.ObjCCatDeclInfo.objcClass = 0; 2743e340a67f4522a2f633a719cb7f3389fe2474374Argyrios Kyrtzidis CatDInfo.ObjCCatDeclInfo.classCursor = clang_getNullCursor(); 2753e340a67f4522a2f633a719cb7f3389fe2474374Argyrios Kyrtzidis } 2763e340a67f4522a2f633a719cb7f3389fe2474374Argyrios Kyrtzidis CatDInfo.ObjCCatDeclInfo.classLoc = getIndexLoc(ClassLoc); 2773e340a67f4522a2f633a719cb7f3389fe2474374Argyrios Kyrtzidis handleObjCContainer(D, CategoryLoc, getCursor(D), CatDInfo); 2784e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis} 2794e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis 2804e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidisvoid IndexingContext::handleObjCMethod(const ObjCMethodDecl *D) { 281c71d55469e7d5f7b376a30620617a175a9442da9Argyrios Kyrtzidis DeclInfo DInfo(!D->isCanonicalDecl(), D->isThisDeclarationADefinition(), 282c71d55469e7d5f7b376a30620617a175a9442da9Argyrios Kyrtzidis D->isThisDeclarationADefinition()); 283c71d55469e7d5f7b376a30620617a175a9442da9Argyrios Kyrtzidis handleDecl(D, D->getLocation(), getCursor(D), DInfo); 2844e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis} 2854e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis 2864e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidisvoid IndexingContext::handleObjCProperty(const ObjCPropertyDecl *D) { 287c71d55469e7d5f7b376a30620617a175a9442da9Argyrios Kyrtzidis DeclInfo DInfo(/*isRedeclaration=*/false, /*isDefinition=*/false, 288c71d55469e7d5f7b376a30620617a175a9442da9Argyrios Kyrtzidis /*isContainer=*/false); 289c71d55469e7d5f7b376a30620617a175a9442da9Argyrios Kyrtzidis handleDecl(D, D->getLocation(), getCursor(D), DInfo); 2904e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis} 2914e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis 2924e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidisvoid IndexingContext::handleReference(const NamedDecl *D, SourceLocation Loc, 2934e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis const NamedDecl *Parent, 2944e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis const DeclContext *DC, 295aca19be8731fc31cff68702de0dc7f30ce908979Argyrios Kyrtzidis const Expr *E, 296aca19be8731fc31cff68702de0dc7f30ce908979Argyrios Kyrtzidis CXIdxEntityRefKind Kind) { 297d6c8209fd1567db9c2721f441b50cb23cdf8d835Argyrios Kyrtzidis if (!D) 298d6c8209fd1567db9c2721f441b50cb23cdf8d835Argyrios Kyrtzidis return; 299d6c8209fd1567db9c2721f441b50cb23cdf8d835Argyrios Kyrtzidis if (D->getParentFunctionOrMethod()) 300d6c8209fd1567db9c2721f441b50cb23cdf8d835Argyrios Kyrtzidis return; 3014e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis if (Loc.isInvalid()) 3024e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis return; 3034e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis if (!CB.indexEntityReference) 3044e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis return; 3054e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis if (isNotFromSourceFile(D->getLocation())) 3064e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis return; 3074e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis 308c6b4a5099588fd21b49c80f730a596a64b2766c6Argyrios Kyrtzidis D = getEntityDecl(D); 309c6b4a5099588fd21b49c80f730a596a64b2766c6Argyrios Kyrtzidis 310c6b4a5099588fd21b49c80f730a596a64b2766c6Argyrios Kyrtzidis if (onlyOneRefPerFile()) { 311c6b4a5099588fd21b49c80f730a596a64b2766c6Argyrios Kyrtzidis SourceManager &SM = Ctx->getSourceManager(); 312c6b4a5099588fd21b49c80f730a596a64b2766c6Argyrios Kyrtzidis SourceLocation FileLoc = SM.getFileLoc(Loc); 313c6b4a5099588fd21b49c80f730a596a64b2766c6Argyrios Kyrtzidis 314c6b4a5099588fd21b49c80f730a596a64b2766c6Argyrios Kyrtzidis std::pair<FileID, unsigned> LocInfo = SM.getDecomposedLoc(Loc); 315c6b4a5099588fd21b49c80f730a596a64b2766c6Argyrios Kyrtzidis FileID FID = LocInfo.first; 316c6b4a5099588fd21b49c80f730a596a64b2766c6Argyrios Kyrtzidis if (FID.isInvalid()) 317c6b4a5099588fd21b49c80f730a596a64b2766c6Argyrios Kyrtzidis return; 318c6b4a5099588fd21b49c80f730a596a64b2766c6Argyrios Kyrtzidis 319c6b4a5099588fd21b49c80f730a596a64b2766c6Argyrios Kyrtzidis const FileEntry *FE = SM.getFileEntryForID(FID); 320c6b4a5099588fd21b49c80f730a596a64b2766c6Argyrios Kyrtzidis if (!FE) 321c6b4a5099588fd21b49c80f730a596a64b2766c6Argyrios Kyrtzidis return; 322c6b4a5099588fd21b49c80f730a596a64b2766c6Argyrios Kyrtzidis RefFileOccurence RefOccur(FE, D); 323c6b4a5099588fd21b49c80f730a596a64b2766c6Argyrios Kyrtzidis std::pair<llvm::DenseSet<RefFileOccurence>::iterator, bool> 324c6b4a5099588fd21b49c80f730a596a64b2766c6Argyrios Kyrtzidis res = RefFileOccurences.insert(RefOccur); 325c6b4a5099588fd21b49c80f730a596a64b2766c6Argyrios Kyrtzidis if (!res.second) 326c6b4a5099588fd21b49c80f730a596a64b2766c6Argyrios Kyrtzidis return; // already in map. 327c6b4a5099588fd21b49c80f730a596a64b2766c6Argyrios Kyrtzidis } 328c6b4a5099588fd21b49c80f730a596a64b2766c6Argyrios Kyrtzidis 329dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis StrAdapter SA(*this); 330854625f7347e4418803fe4aa9131928408e4dc53Benjamin Kramer CXCursor Cursor = E ? MakeCXCursor(const_cast<Expr*>(E), 331854625f7347e4418803fe4aa9131928408e4dc53Benjamin Kramer const_cast<Decl*>(cast<Decl>(DC)), CXTU) 332854625f7347e4418803fe4aa9131928408e4dc53Benjamin Kramer : getRefCursor(D, Loc); 333854625f7347e4418803fe4aa9131928408e4dc53Benjamin Kramer 334dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis CXIdxEntityInfo RefEntity, ParentEntity; 335dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis getEntityInfo(D, RefEntity, SA); 336dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis getEntityInfo(Parent, ParentEntity, SA); 337854625f7347e4418803fe4aa9131928408e4dc53Benjamin Kramer CXIdxEntityRefInfo Info = { Cursor, 3384e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis getIndexLoc(Loc), 339dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis &RefEntity, 340c6b4a5099588fd21b49c80f730a596a64b2766c6Argyrios Kyrtzidis Parent ? &ParentEntity : 0, 341aca19be8731fc31cff68702de0dc7f30ce908979Argyrios Kyrtzidis getIndexContainerForDC(DC), 342aca19be8731fc31cff68702de0dc7f30ce908979Argyrios Kyrtzidis Kind }; 3434e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis CB.indexEntityReference(ClientData, &Info); 3444e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis} 3454e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis 3464e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidisbool IndexingContext::isNotFromSourceFile(SourceLocation Loc) const { 3474e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis if (Loc.isInvalid()) 3484e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis return true; 3494e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis SourceManager &SM = Ctx->getSourceManager(); 3504e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis SourceLocation FileLoc = SM.getFileLoc(Loc); 3514e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis FileID FID = SM.getFileID(FileLoc); 3524e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis return SM.getFileEntryForID(FID) == 0; 3534e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis} 3544e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis 3554e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidisvoid IndexingContext::addContainerInMap(const DeclContext *DC, 356dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis CXIdxClientContainer container) { 3574e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis assert(getScopedContext(DC) == DC); 3584e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis ContainerMapTy::iterator I = ContainerMap.find(DC); 3594e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis if (I == ContainerMap.end()) { 3604e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis if (container) 3614e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis ContainerMap[DC] = container; 3624e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis return; 3634e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis } 3644e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis // Allow changing the container of a previously seen DeclContext so we 3654e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis // can handle invalid user code, like a function re-definition. 3664e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis if (container) 3674e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis I->second = container; 3684e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis else 3694e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis ContainerMap.erase(I); 3704e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis} 3714e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis 3724e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidisconst NamedDecl *IndexingContext::getEntityDecl(const NamedDecl *D) const { 3734e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis assert(D); 3744e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis D = cast<NamedDecl>(D->getCanonicalDecl()); 3754e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis 3764e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis if (const ObjCCategoryDecl *Cat = dyn_cast<ObjCCategoryDecl>(D)) { 3774e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis if (Cat->IsClassExtension()) 3784e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis return getEntityDecl(Cat->getClassInterface()); 3794e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis 3804e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis } else if (const ObjCImplementationDecl * 3814e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis ImplD = dyn_cast<ObjCImplementationDecl>(D)) { 3824e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis return getEntityDecl(ImplD->getClassInterface()); 3834e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis 3844e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis } else if (const ObjCCategoryImplDecl * 3854e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis CatImplD = dyn_cast<ObjCCategoryImplDecl>(D)) { 3864e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis return getEntityDecl(CatImplD->getCategoryDecl()); 3874e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis } 3884e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis 3894e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis return D; 3904e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis} 3914e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis 3924e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidisconst DeclContext * 3934e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios KyrtzidisIndexingContext::getScopedContext(const DeclContext *DC) const { 3944e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis // Local contexts are ignored for indexing. 3954e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis const DeclContext *FuncCtx = cast<Decl>(DC)->getParentFunctionOrMethod(); 3964e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis if (FuncCtx) 3974e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis return FuncCtx; 3984e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis 3994e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis // We consider enums always scoped for indexing. 4004e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis if (isa<TagDecl>(DC)) 4014e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis return DC; 4024e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis 4034e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis if (const NamespaceDecl *NS = dyn_cast<NamespaceDecl>(DC)) { 4044e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis if (NS->isAnonymousNamespace()) 4054e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis return getScopedContext(NS->getParent()); 4064e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis return NS; 4074e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis } 4084e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis 4094e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis return DC->getRedeclContext(); 4104e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis} 4114e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis 412dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios KyrtzidisCXIdxClientContainer 4134e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios KyrtzidisIndexingContext::getIndexContainerForDC(const DeclContext *DC) const { 4144e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis DC = getScopedContext(DC); 4154e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis ContainerMapTy::const_iterator I = ContainerMap.find(DC); 4163e340a67f4522a2f633a719cb7f3389fe2474374Argyrios Kyrtzidis if (I == ContainerMap.end()) 4173e340a67f4522a2f633a719cb7f3389fe2474374Argyrios Kyrtzidis return 0; 4184e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis// assert(I != ContainerMap.end() && 4194e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis// "Failed to include a scoped context in the container map"); 4204e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis return I->second; 4214e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis} 4224e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis 423dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios KyrtzidisCXIdxClientFile IndexingContext::getIndexFile(const FileEntry *File) { 4244e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis if (!File) 4254e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis return 0; 4264e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis 4274e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis FileMapTy::iterator FI = FileMap.find(File); 4284e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis if (FI != FileMap.end()) 4294e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis return FI->second; 4304e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis 431dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis return 0; 4324e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis} 4334e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis 4344e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios KyrtzidisCXIdxLoc IndexingContext::getIndexLoc(SourceLocation Loc) const { 4354e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis CXIdxLoc idxLoc = { {0, 0}, 0 }; 4364e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis if (Loc.isInvalid()) 4374e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis return idxLoc; 4384e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis 4394e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis idxLoc.ptr_data[0] = (void*)this; 4404e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis idxLoc.int_data = Loc.getRawEncoding(); 4414e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis return idxLoc; 4424e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis} 4434e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis 4444e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidisvoid IndexingContext::translateLoc(SourceLocation Loc, 445dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis CXIdxClientFile *indexFile, CXFile *file, 4464e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis unsigned *line, unsigned *column, 4474e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis unsigned *offset) { 4484e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis if (Loc.isInvalid()) 4494e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis return; 4504e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis 4514e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis SourceManager &SM = Ctx->getSourceManager(); 4524e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis Loc = SM.getFileLoc(Loc); 4534e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis 4544e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis std::pair<FileID, unsigned> LocInfo = SM.getDecomposedLoc(Loc); 4554e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis FileID FID = LocInfo.first; 4564e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis unsigned FileOffset = LocInfo.second; 4574e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis 4584e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis if (FID.isInvalid()) 4594e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis return; 4604e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis 4614e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis const FileEntry *FE = SM.getFileEntryForID(FID); 4624e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis if (indexFile) 4634e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis *indexFile = getIndexFile(FE); 4644e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis if (file) 4654e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis *file = (void *)FE; 4664e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis if (line) 4674e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis *line = SM.getLineNumber(FID, FileOffset); 4684e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis if (column) 4694e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis *column = SM.getColumnNumber(FID, FileOffset); 4704e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis if (offset) 4714e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis *offset = FileOffset; 4724e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis} 4734e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis 474dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidisvoid IndexingContext::getEntityInfo(const NamedDecl *D, 475dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis CXIdxEntityInfo &EntityInfo, 476dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis StrAdapter &SA) { 477c6b4a5099588fd21b49c80f730a596a64b2766c6Argyrios Kyrtzidis if (!D) 478c6b4a5099588fd21b49c80f730a596a64b2766c6Argyrios Kyrtzidis return; 479dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis D = getEntityDecl(D); 480dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis EntityInfo.kind = CXIdxEntity_Unexposed; 481dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis 482dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis if (const TagDecl *TD = dyn_cast<TagDecl>(D)) { 483dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis switch (TD->getTagKind()) { 484dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis case TTK_Struct: 485dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis EntityInfo.kind = CXIdxEntity_Struct; break; 486dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis case TTK_Union: 487dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis EntityInfo.kind = CXIdxEntity_Union; break; 488dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis case TTK_Class: 489dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis EntityInfo.kind = CXIdxEntity_CXXClass; break; 490dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis case TTK_Enum: 491dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis EntityInfo.kind = CXIdxEntity_Enum; break; 492dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis } 4934e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis 494dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis } else { 495dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis switch (D->getKind()) { 496dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis case Decl::Typedef: 497dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis EntityInfo.kind = CXIdxEntity_Typedef; break; 498dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis case Decl::Function: 499dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis EntityInfo.kind = CXIdxEntity_Function; break; 500dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis case Decl::Var: 501dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis EntityInfo.kind = CXIdxEntity_Variable; break; 502dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis case Decl::Field: 503dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis EntityInfo.kind = CXIdxEntity_Field; break; 504dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis case Decl::EnumConstant: 505dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis EntityInfo.kind = CXIdxEntity_EnumConstant; break; 506dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis case Decl::ObjCInterface: 507dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis EntityInfo.kind = CXIdxEntity_ObjCClass; break; 508dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis case Decl::ObjCProtocol: 509dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis EntityInfo.kind = CXIdxEntity_ObjCProtocol; break; 510dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis case Decl::ObjCCategory: 511dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis EntityInfo.kind = CXIdxEntity_ObjCCategory; break; 512dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis case Decl::ObjCMethod: 513c71d55469e7d5f7b376a30620617a175a9442da9Argyrios Kyrtzidis if (cast<ObjCMethodDecl>(D)->isInstanceMethod()) 514c71d55469e7d5f7b376a30620617a175a9442da9Argyrios Kyrtzidis EntityInfo.kind = CXIdxEntity_ObjCInstanceMethod; 515c71d55469e7d5f7b376a30620617a175a9442da9Argyrios Kyrtzidis else 516c71d55469e7d5f7b376a30620617a175a9442da9Argyrios Kyrtzidis EntityInfo.kind = CXIdxEntity_ObjCClassMethod; 517c71d55469e7d5f7b376a30620617a175a9442da9Argyrios Kyrtzidis break; 518dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis case Decl::ObjCProperty: 519dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis EntityInfo.kind = CXIdxEntity_ObjCProperty; break; 520dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis case Decl::ObjCIvar: 521dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis EntityInfo.kind = CXIdxEntity_ObjCIvar; break; 522dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis default: 523dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis break; 524dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis } 525dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis } 5264e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis 5274e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis if (IdentifierInfo *II = D->getIdentifier()) { 5284e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis EntityInfo.name = SA.toCStr(II->getName()); 5294e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis 5304e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis } else if (isa<RecordDecl>(D) || isa<NamespaceDecl>(D)) { 531dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis EntityInfo.name = 0; // anonymous record/namespace. 5324e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis 5334e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis } else { 5344e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis unsigned Begin = SA.getCurSize(); 5354e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis { 5364e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis llvm::raw_svector_ostream OS(SA.getBuffer()); 5374e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis D->printName(OS); 5384e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis } 5394e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis EntityInfo.name = SA.getCStr(Begin); 5404e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis } 5414e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis 542dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis { 543dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis unsigned Begin = SA.getCurSize(); 544dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis bool Ignore = getDeclCursorUSR(D, SA.getBuffer()); 545dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis if (Ignore) { 546dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis EntityInfo.USR = ""; 547dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis } else { 548dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis EntityInfo.USR = SA.getCStr(Begin); 549dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis } 5504e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis } 5514e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis} 5524e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis 5534e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios KyrtzidisCXCursor IndexingContext::getRefCursor(const NamedDecl *D, SourceLocation Loc) { 5544e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis if (const TypeDecl *TD = dyn_cast<TypeDecl>(D)) 5554e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis return MakeCursorTypeRef(TD, Loc, CXTU); 5564e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis if (const ObjCInterfaceDecl *ID = dyn_cast<ObjCInterfaceDecl>(D)) 5574e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis return MakeCursorObjCClassRef(ID, Loc, CXTU); 5584e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis if (const ObjCProtocolDecl *PD = dyn_cast<ObjCProtocolDecl>(D)) 5594e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis return MakeCursorObjCProtocolRef(PD, Loc, CXTU); 5604e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis 5614e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis //assert(0 && "not yet"); 5624e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis return clang_getNullCursor(); 5634e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis} 564