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