IndexingContext.cpp revision e7bbab91f5cc899104d0a1dee6059d8413c70eeb
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(); 242dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis getEntityInfo(D->getClassInterface(), ClassEntity, SA); 243dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis 2446ec43adc39006a7fce94188956d0239bd54c0363Argyrios Kyrtzidis CatDInfo.ObjCCatDeclInfo.containerInfo = &CatDInfo.ObjCContDeclInfo; 2456ec43adc39006a7fce94188956d0239bd54c0363Argyrios Kyrtzidis CatDInfo.ObjCCatDeclInfo.objcClass = &ClassEntity; 24621ee5707e6e59d982d2f2ae28e079c7ff46dc519Argyrios Kyrtzidis CatDInfo.ObjCCatDeclInfo.classCursor = 24721ee5707e6e59d982d2f2ae28e079c7ff46dc519Argyrios Kyrtzidis MakeCursorObjCClassRef(IFaceD, ClassLoc, CXTU); 24821ee5707e6e59d982d2f2ae28e079c7ff46dc519Argyrios Kyrtzidis CatDInfo.ObjCCatDeclInfo.classLoc = getIndexLoc(ClassLoc); 24921ee5707e6e59d982d2f2ae28e079c7ff46dc519Argyrios Kyrtzidis handleObjCContainer(D, CategoryLoc, getCursor(D), CatDInfo); 250dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis} 251dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis 252dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidisvoid IndexingContext::handleObjCCategoryImpl(const ObjCCategoryImplDecl *D) { 253dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis const ObjCCategoryDecl *CatD = D->getCategoryDecl(); 254c71d55469e7d5f7b376a30620617a175a9442da9Argyrios Kyrtzidis ObjCCategoryDeclInfo CatDInfo(/*isImplementation=*/true); 255dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis CXIdxEntityInfo ClassEntity; 256dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis StrAdapter SA(*this); 257dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis getEntityInfo(CatD->getClassInterface(), ClassEntity, SA); 258dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis 2596ec43adc39006a7fce94188956d0239bd54c0363Argyrios Kyrtzidis CatDInfo.ObjCCatDeclInfo.containerInfo = &CatDInfo.ObjCContDeclInfo; 2606ec43adc39006a7fce94188956d0239bd54c0363Argyrios Kyrtzidis CatDInfo.ObjCCatDeclInfo.objcClass = &ClassEntity; 261c71d55469e7d5f7b376a30620617a175a9442da9Argyrios Kyrtzidis handleObjCContainer(D, D->getLocation(), getCursor(D), CatDInfo); 2624e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis} 2634e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis 2644e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidisvoid IndexingContext::handleObjCMethod(const ObjCMethodDecl *D) { 265c71d55469e7d5f7b376a30620617a175a9442da9Argyrios Kyrtzidis DeclInfo DInfo(!D->isCanonicalDecl(), D->isThisDeclarationADefinition(), 266c71d55469e7d5f7b376a30620617a175a9442da9Argyrios Kyrtzidis D->isThisDeclarationADefinition()); 267c71d55469e7d5f7b376a30620617a175a9442da9Argyrios Kyrtzidis handleDecl(D, D->getLocation(), getCursor(D), DInfo); 2684e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis} 2694e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis 2704e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidisvoid IndexingContext::handleObjCProperty(const ObjCPropertyDecl *D) { 271c71d55469e7d5f7b376a30620617a175a9442da9Argyrios Kyrtzidis DeclInfo DInfo(/*isRedeclaration=*/false, /*isDefinition=*/false, 272c71d55469e7d5f7b376a30620617a175a9442da9Argyrios Kyrtzidis /*isContainer=*/false); 273c71d55469e7d5f7b376a30620617a175a9442da9Argyrios Kyrtzidis handleDecl(D, D->getLocation(), getCursor(D), DInfo); 2744e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis} 2754e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis 2764e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidisvoid IndexingContext::handleReference(const NamedDecl *D, SourceLocation Loc, 2774e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis const NamedDecl *Parent, 2784e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis const DeclContext *DC, 279aca19be8731fc31cff68702de0dc7f30ce908979Argyrios Kyrtzidis const Expr *E, 280aca19be8731fc31cff68702de0dc7f30ce908979Argyrios Kyrtzidis CXIdxEntityRefKind Kind) { 2814e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis if (Loc.isInvalid()) 2824e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis return; 2834e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis if (!CB.indexEntityReference) 2844e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis return; 2854e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis if (isNotFromSourceFile(D->getLocation())) 2864e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis return; 2874e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis 288dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis StrAdapter SA(*this); 289854625f7347e4418803fe4aa9131928408e4dc53Benjamin Kramer CXCursor Cursor = E ? MakeCXCursor(const_cast<Expr*>(E), 290854625f7347e4418803fe4aa9131928408e4dc53Benjamin Kramer const_cast<Decl*>(cast<Decl>(DC)), CXTU) 291854625f7347e4418803fe4aa9131928408e4dc53Benjamin Kramer : getRefCursor(D, Loc); 292854625f7347e4418803fe4aa9131928408e4dc53Benjamin Kramer 293dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis CXIdxEntityInfo RefEntity, ParentEntity; 294dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis getEntityInfo(D, RefEntity, SA); 295dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis getEntityInfo(Parent, ParentEntity, SA); 296854625f7347e4418803fe4aa9131928408e4dc53Benjamin Kramer CXIdxEntityRefInfo Info = { Cursor, 2974e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis getIndexLoc(Loc), 298dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis &RefEntity, 299dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis &ParentEntity, 300aca19be8731fc31cff68702de0dc7f30ce908979Argyrios Kyrtzidis getIndexContainerForDC(DC), 301aca19be8731fc31cff68702de0dc7f30ce908979Argyrios Kyrtzidis Kind }; 3024e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis CB.indexEntityReference(ClientData, &Info); 3034e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis} 3044e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis 3054e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidisbool IndexingContext::isNotFromSourceFile(SourceLocation Loc) const { 3064e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis if (Loc.isInvalid()) 3074e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis return true; 3084e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis SourceManager &SM = Ctx->getSourceManager(); 3094e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis SourceLocation FileLoc = SM.getFileLoc(Loc); 3104e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis FileID FID = SM.getFileID(FileLoc); 3114e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis return SM.getFileEntryForID(FID) == 0; 3124e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis} 3134e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis 3144e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidisvoid IndexingContext::addContainerInMap(const DeclContext *DC, 315dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis CXIdxClientContainer container) { 3164e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis assert(getScopedContext(DC) == DC); 3174e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis ContainerMapTy::iterator I = ContainerMap.find(DC); 3184e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis if (I == ContainerMap.end()) { 3194e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis if (container) 3204e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis ContainerMap[DC] = container; 3214e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis return; 3224e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis } 3234e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis // Allow changing the container of a previously seen DeclContext so we 3244e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis // can handle invalid user code, like a function re-definition. 3254e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis if (container) 3264e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis I->second = container; 3274e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis else 3284e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis ContainerMap.erase(I); 3294e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis} 3304e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis 3314e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidisconst NamedDecl *IndexingContext::getEntityDecl(const NamedDecl *D) const { 3324e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis assert(D); 3334e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis D = cast<NamedDecl>(D->getCanonicalDecl()); 3344e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis 3354e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis if (const ObjCCategoryDecl *Cat = dyn_cast<ObjCCategoryDecl>(D)) { 3364e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis if (Cat->IsClassExtension()) 3374e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis return getEntityDecl(Cat->getClassInterface()); 3384e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis 3394e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis } else if (const ObjCImplementationDecl * 3404e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis ImplD = dyn_cast<ObjCImplementationDecl>(D)) { 3414e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis return getEntityDecl(ImplD->getClassInterface()); 3424e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis 3434e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis } else if (const ObjCCategoryImplDecl * 3444e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis CatImplD = dyn_cast<ObjCCategoryImplDecl>(D)) { 3454e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis return getEntityDecl(CatImplD->getCategoryDecl()); 3464e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis } 3474e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis 3484e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis return D; 3494e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis} 3504e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis 3514e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidisconst DeclContext * 3524e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios KyrtzidisIndexingContext::getScopedContext(const DeclContext *DC) const { 3534e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis // Local contexts are ignored for indexing. 3544e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis const DeclContext *FuncCtx = cast<Decl>(DC)->getParentFunctionOrMethod(); 3554e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis if (FuncCtx) 3564e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis return FuncCtx; 3574e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis 3584e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis // We consider enums always scoped for indexing. 3594e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis if (isa<TagDecl>(DC)) 3604e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis return DC; 3614e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis 3624e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis if (const NamespaceDecl *NS = dyn_cast<NamespaceDecl>(DC)) { 3634e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis if (NS->isAnonymousNamespace()) 3644e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis return getScopedContext(NS->getParent()); 3654e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis return NS; 3664e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis } 3674e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis 3684e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis return DC->getRedeclContext(); 3694e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis} 3704e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis 371dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios KyrtzidisCXIdxClientContainer 3724e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios KyrtzidisIndexingContext::getIndexContainerForDC(const DeclContext *DC) const { 3734e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis DC = getScopedContext(DC); 3744e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis ContainerMapTy::const_iterator I = ContainerMap.find(DC); 3754e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis// assert(I != ContainerMap.end() && 3764e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis// "Failed to include a scoped context in the container map"); 3774e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis return I->second; 3784e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis} 3794e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis 380dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios KyrtzidisCXIdxClientFile IndexingContext::getIndexFile(const FileEntry *File) { 3814e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis if (!File) 3824e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis return 0; 3834e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis 3844e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis FileMapTy::iterator FI = FileMap.find(File); 3854e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis if (FI != FileMap.end()) 3864e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis return FI->second; 3874e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis 388dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis return 0; 3894e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis} 3904e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis 3914e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios KyrtzidisCXIdxLoc IndexingContext::getIndexLoc(SourceLocation Loc) const { 3924e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis CXIdxLoc idxLoc = { {0, 0}, 0 }; 3934e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis if (Loc.isInvalid()) 3944e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis return idxLoc; 3954e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis 3964e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis idxLoc.ptr_data[0] = (void*)this; 3974e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis idxLoc.int_data = Loc.getRawEncoding(); 3984e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis return idxLoc; 3994e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis} 4004e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis 4014e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidisvoid IndexingContext::translateLoc(SourceLocation Loc, 402dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis CXIdxClientFile *indexFile, CXFile *file, 4034e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis unsigned *line, unsigned *column, 4044e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis unsigned *offset) { 4054e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis if (Loc.isInvalid()) 4064e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis return; 4074e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis 4084e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis SourceManager &SM = Ctx->getSourceManager(); 4094e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis Loc = SM.getFileLoc(Loc); 4104e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis 4114e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis std::pair<FileID, unsigned> LocInfo = SM.getDecomposedLoc(Loc); 4124e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis FileID FID = LocInfo.first; 4134e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis unsigned FileOffset = LocInfo.second; 4144e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis 4154e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis if (FID.isInvalid()) 4164e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis return; 4174e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis 4184e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis const FileEntry *FE = SM.getFileEntryForID(FID); 4194e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis if (indexFile) 4204e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis *indexFile = getIndexFile(FE); 4214e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis if (file) 4224e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis *file = (void *)FE; 4234e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis if (line) 4244e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis *line = SM.getLineNumber(FID, FileOffset); 4254e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis if (column) 4264e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis *column = SM.getColumnNumber(FID, FileOffset); 4274e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis if (offset) 4284e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis *offset = FileOffset; 4294e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis} 4304e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis 431dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidisvoid IndexingContext::getEntityInfo(const NamedDecl *D, 432dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis CXIdxEntityInfo &EntityInfo, 433dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis StrAdapter &SA) { 434dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis D = getEntityDecl(D); 435dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis EntityInfo.kind = CXIdxEntity_Unexposed; 436dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis 437dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis if (const TagDecl *TD = dyn_cast<TagDecl>(D)) { 438dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis switch (TD->getTagKind()) { 439dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis case TTK_Struct: 440dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis EntityInfo.kind = CXIdxEntity_Struct; break; 441dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis case TTK_Union: 442dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis EntityInfo.kind = CXIdxEntity_Union; break; 443dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis case TTK_Class: 444dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis EntityInfo.kind = CXIdxEntity_CXXClass; break; 445dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis case TTK_Enum: 446dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis EntityInfo.kind = CXIdxEntity_Enum; break; 447dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis } 4484e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis 449dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis } else { 450dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis switch (D->getKind()) { 451dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis case Decl::Typedef: 452dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis EntityInfo.kind = CXIdxEntity_Typedef; break; 453dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis case Decl::Function: 454dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis EntityInfo.kind = CXIdxEntity_Function; break; 455dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis case Decl::Var: 456dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis EntityInfo.kind = CXIdxEntity_Variable; break; 457dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis case Decl::Field: 458dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis EntityInfo.kind = CXIdxEntity_Field; break; 459dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis case Decl::EnumConstant: 460dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis EntityInfo.kind = CXIdxEntity_EnumConstant; break; 461dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis case Decl::ObjCInterface: 462dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis EntityInfo.kind = CXIdxEntity_ObjCClass; break; 463dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis case Decl::ObjCProtocol: 464dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis EntityInfo.kind = CXIdxEntity_ObjCProtocol; break; 465dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis case Decl::ObjCCategory: 466dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis EntityInfo.kind = CXIdxEntity_ObjCCategory; break; 467dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis case Decl::ObjCMethod: 468c71d55469e7d5f7b376a30620617a175a9442da9Argyrios Kyrtzidis if (cast<ObjCMethodDecl>(D)->isInstanceMethod()) 469c71d55469e7d5f7b376a30620617a175a9442da9Argyrios Kyrtzidis EntityInfo.kind = CXIdxEntity_ObjCInstanceMethod; 470c71d55469e7d5f7b376a30620617a175a9442da9Argyrios Kyrtzidis else 471c71d55469e7d5f7b376a30620617a175a9442da9Argyrios Kyrtzidis EntityInfo.kind = CXIdxEntity_ObjCClassMethod; 472c71d55469e7d5f7b376a30620617a175a9442da9Argyrios Kyrtzidis break; 473dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis case Decl::ObjCProperty: 474dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis EntityInfo.kind = CXIdxEntity_ObjCProperty; break; 475dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis case Decl::ObjCIvar: 476dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis EntityInfo.kind = CXIdxEntity_ObjCIvar; break; 477dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis default: 478dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis break; 479dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis } 480dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis } 4814e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis 4824e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis if (IdentifierInfo *II = D->getIdentifier()) { 4834e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis EntityInfo.name = SA.toCStr(II->getName()); 4844e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis 4854e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis } else if (isa<RecordDecl>(D) || isa<NamespaceDecl>(D)) { 486dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis EntityInfo.name = 0; // anonymous record/namespace. 4874e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis 4884e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis } else { 4894e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis unsigned Begin = SA.getCurSize(); 4904e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis { 4914e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis llvm::raw_svector_ostream OS(SA.getBuffer()); 4924e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis D->printName(OS); 4934e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis } 4944e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis EntityInfo.name = SA.getCStr(Begin); 4954e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis } 4964e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis 497dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis { 498dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis unsigned Begin = SA.getCurSize(); 499dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis bool Ignore = getDeclCursorUSR(D, SA.getBuffer()); 500dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis if (Ignore) { 501dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis EntityInfo.USR = ""; 502dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis } else { 503dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis EntityInfo.USR = SA.getCStr(Begin); 504dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis } 5054e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis } 5064e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis} 5074e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis 5084e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios KyrtzidisCXCursor IndexingContext::getRefCursor(const NamedDecl *D, SourceLocation Loc) { 5094e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis if (const TypeDecl *TD = dyn_cast<TypeDecl>(D)) 5104e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis return MakeCursorTypeRef(TD, Loc, CXTU); 5114e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis if (const ObjCInterfaceDecl *ID = dyn_cast<ObjCInterfaceDecl>(D)) 5124e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis return MakeCursorObjCClassRef(ID, Loc, CXTU); 5134e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis if (const ObjCProtocolDecl *PD = dyn_cast<ObjCProtocolDecl>(D)) 5144e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis return MakeCursorObjCProtocolRef(PD, Loc, CXTU); 5154e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis 5164e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis //assert(0 && "not yet"); 5174e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis return clang_getNullCursor(); 5184e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis} 519