IndexingContext.cpp revision dd93c596cd95e1b96031ff47efe0a5095ff3d7f1
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
214e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidisconst char *IndexingContext::StrAdapter::toCStr(StringRef Str) {
224e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis  if (Str.empty())
234e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis    return "";
244e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis  if (Str.data()[Str.size()] == '\0')
254e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis    return Str.data();
264e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis  Scratch += Str;
274e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis  Scratch.push_back('\0');
284e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis  return Scratch.data() + (Scratch.size() - Str.size() - 1);
294e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis}
304e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis
314e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidisvoid IndexingContext::setASTContext(ASTContext &ctx) {
324e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis  Ctx = &ctx;
334e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis  static_cast<ASTUnit*>(CXTU->TUData)->setASTContext(&ctx);
344e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis}
354e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis
36dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidisvoid IndexingContext::enteredMainFile(const FileEntry *File) {
37dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis  if (File && CB.enteredMainFile) {
38dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis    CXIdxClientFile idxFile = CB.enteredMainFile(ClientData, (CXFile)File, 0);
39dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis    FileMap[File] = idxFile;
40dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis  }
41dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis}
42dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis
434e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidisvoid IndexingContext::ppIncludedFile(SourceLocation hashLoc,
444e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis                                     StringRef filename,
454e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis                                     const FileEntry *File,
464e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis                                     bool isImport, bool isAngled) {
474e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis  if (!CB.ppIncludedFile)
484e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis    return;
494e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis
50dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis  StrAdapter SA(*this);
514e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis  CXIdxIncludedFileInfo Info = { getIndexLoc(hashLoc),
524e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis                                 SA.toCStr(filename),
53dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis                                 (CXFile)File,
544e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis                                 isImport, isAngled };
55dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis  CXIdxClientFile idxFile = CB.ppIncludedFile(ClientData, &Info);
56dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis  FileMap[File] = idxFile;
574e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis}
584e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis
594e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidisvoid IndexingContext::ppMacroDefined(SourceLocation Loc, StringRef Name,
604e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis                                     SourceLocation DefBegin, unsigned Length,
614e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis                                     const void *OpaqueMacro) {
624e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis  if (!CB.ppMacroDefined)
634e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis    return;
644e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis
65dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis  StrAdapter SA(*this);
664e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis  CXIdxMacroInfo MacroInfo =  { getIndexLoc(Loc), SA.toCStr(Name) };
674e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis  CXIdxMacroDefinedInfo Info = { &MacroInfo,
684e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis                                 getIndexLoc(DefBegin), Length };
69dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis  CXIdxClientMacro idxMacro = CB.ppMacroDefined(ClientData, &Info);
704e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis  MacroMap[OpaqueMacro] = idxMacro;
714e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis}
724e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis
734e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidisvoid IndexingContext::ppMacroUndefined(SourceLocation Loc, StringRef Name,
744e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis                                       const void *OpaqueMacro) {
754e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis  if (!CB.ppMacroUndefined)
764e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis    return;
774e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis
78dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis  StrAdapter SA(*this);
794e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis  CXIdxMacroUndefinedInfo Info = { getIndexLoc(Loc),
804e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis                                   SA.toCStr(Name), 0 };
814e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis  CB.ppMacroUndefined(ClientData, &Info);
824e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis}
834e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis
844e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidisvoid IndexingContext::ppMacroExpanded(SourceLocation Loc, StringRef Name,
854e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis                                      const void *OpaqueMacro) {
864e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis  if (!CB.ppMacroExpanded)
874e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis    return;
884e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis
89dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis  StrAdapter SA(*this);
904e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis  CXIdxMacroExpandedInfo Info = { getIndexLoc(Loc),
914e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis                                   SA.toCStr(Name), 0 };
924e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis  CB.ppMacroExpanded(ClientData, &Info);
934e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis}
944e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis
954e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidisvoid IndexingContext::invokeStartedTranslationUnit() {
96dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis  CXIdxClientContainer idxCont = 0;
974e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis  if (CB.startedTranslationUnit)
984e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis    idxCont = CB.startedTranslationUnit(ClientData, 0);
994e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis  addContainerInMap(Ctx->getTranslationUnitDecl(), idxCont);
1004e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis}
1014e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis
1024e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidisvoid IndexingContext::invokeFinishedTranslationUnit() {
103dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis  endContainer(Ctx->getTranslationUnitDecl());
1044e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis}
1054e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis
1064e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidisvoid IndexingContext::handleDiagnostic(const StoredDiagnostic &StoredDiag) {
1074e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis  if (!CB.diagnostic)
1084e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis    return;
1094e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis
1104e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis  CXStoredDiagnostic CXDiag(StoredDiag, Ctx->getLangOptions());
1114e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis  CB.diagnostic(ClientData, &CXDiag, 0);
1124e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis}
1134e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis
114dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidisvoid IndexingContext::handleDecl(const NamedDecl *D,
115dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis                                 SourceLocation Loc, CXCursor Cursor,
116dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis                                 bool isRedeclaration, bool isDefinition,
117dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis                                 DeclInfo &DInfo) {
118dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis  if (!CB.indexDeclaration)
119dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis    return;
1204e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis
121dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis  StrAdapter SA(*this);
122dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis  getEntityInfo(D, DInfo.CXEntInfo, SA);
123dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis  DInfo.entityInfo = &DInfo.CXEntInfo;
124dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis  DInfo.cursor = Cursor;
125dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis  DInfo.loc = getIndexLoc(Loc);
126dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis  DInfo.container = getIndexContainer(D);
127dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis  DInfo.isRedeclaration = isRedeclaration;
128dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis  DInfo.isDefinition = isDefinition;
129dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis
130dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis  CXIdxClientEntity
131dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis    clientEnt = CB.indexDeclaration(ClientData, &DInfo);
132dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis
133dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis  if (!isRedeclaration)
134dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis    addEntityInMap(D, clientEnt);
135dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis}
136dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis
137dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidisvoid IndexingContext::handleObjCContainer(const ObjCContainerDecl *D,
138dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis                                          SourceLocation Loc, CXCursor Cursor,
139dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis                                          bool isForwardRef,
140dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis                                          bool isRedeclaration,
141dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis                                          bool isImplementation,
142dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis                                          ObjCContainerDeclInfo &ContDInfo) {
143dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis  ContDInfo.CXObjCContDeclInfo.declInfo = &ContDInfo;
144dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis  if (isForwardRef)
145dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis    ContDInfo.CXObjCContDeclInfo.kind = CXIdxObjCContainer_ForwardRef;
146dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis  else if (isImplementation)
147dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis    ContDInfo.CXObjCContDeclInfo.kind = CXIdxObjCContainer_Implementation;
148dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis  else
149dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis    ContDInfo.CXObjCContDeclInfo.kind = CXIdxObjCContainer_Interface;
1504e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis
151dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis  handleDecl(D, Loc, Cursor,
152dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis             isRedeclaration, /*isDefinition=*/!isForwardRef, ContDInfo);
1534e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis}
1544e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis
155dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidisvoid IndexingContext::handleFunction(const FunctionDecl *D) {
156dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis  DeclInfo DInfo;
157dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis  handleDecl(D, D->getLocation(), getCursor(D),
158dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis             !D->isFirstDeclaration(), D->isThisDeclarationADefinition(),
159dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis             DInfo);
160dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis}
1614e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis
162dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidisvoid IndexingContext::handleVar(const VarDecl *D) {
163dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis  DeclInfo DInfo;
164dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis  handleDecl(D, D->getLocation(), getCursor(D),
165dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis             !D->isFirstDeclaration(), D->isThisDeclarationADefinition(),
166dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis             DInfo);
1674e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis}
1684e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis
1694e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidisvoid IndexingContext::handleField(const FieldDecl *D) {
170dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis  DeclInfo DInfo;
171dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis  handleDecl(D, D->getLocation(), getCursor(D),
172dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis             /*isRedeclaration=*/false, /*isDefinition=*/false, DInfo);
1734e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis}
1744e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis
1754e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidisvoid IndexingContext::handleEnumerator(const EnumConstantDecl *D) {
176dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis  DeclInfo DInfo;
177dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis  handleDecl(D, D->getLocation(), getCursor(D),
178dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis             /*isRedeclaration=*/false, /*isDefinition=*/true, DInfo);
1794e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis}
1804e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis
1814e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidisvoid IndexingContext::handleTagDecl(const TagDecl *D) {
182dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis  TagDeclInfo TagDInfo;
183dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis  TagDInfo.CXTagDeclInfo.declInfo = &TagDInfo;
184dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis  TagDInfo.CXTagDeclInfo.isAnonymous = D->getIdentifier() == 0;
185dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis  handleDecl(D, D->getLocation(), getCursor(D),
186dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis             !D->isFirstDeclaration(), D->isThisDeclarationADefinition(),
187dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis             TagDInfo);
1884e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis}
1894e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis
1904e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidisvoid IndexingContext::handleTypedef(const TypedefDecl *D) {
191dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis  DeclInfo DInfo;
192dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis  handleDecl(D, D->getLocation(), getCursor(D),
193dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis             !D->isFirstDeclaration(), /*isDefinition=*/true, DInfo);
194dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis}
1954e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis
196dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidisvoid IndexingContext::handleObjCClass(const ObjCClassDecl *D) {
197dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis  ObjCContainerDeclInfo ContDInfo;
198dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis  const ObjCClassDecl::ObjCClassRef *Ref = D->getForwardDecl();
199dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis  ObjCInterfaceDecl *IFaceD = Ref->getInterface();
200dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis  SourceLocation Loc = Ref->getLocation();
201dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis  bool isRedeclaration = IFaceD->getLocation() != Loc;
202dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis  handleObjCContainer(IFaceD, Loc, MakeCursorObjCClassRef(IFaceD, Loc, CXTU),
203dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis                      /*isForwardRef=*/true, isRedeclaration,
204dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis                      /*isImplementation=*/false, ContDInfo);
2054e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis}
2064e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis
2074e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidisvoid IndexingContext::handleObjCInterface(const ObjCInterfaceDecl *D) {
208dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis  ObjCContainerDeclInfo ContDInfo;
209dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis  handleObjCContainer(D, D->getLocation(), getCursor(D),
210dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis                      /*isForwardRef=*/false,
211dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis                      /*isRedeclaration=*/D->isInitiallyForwardDecl(),
212dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis                      /*isImplementation=*/false, ContDInfo);
213dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis}
2144e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis
215dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidisvoid IndexingContext::handleObjCImplementation(
216dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis                                              const ObjCImplementationDecl *D) {
217dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis  ObjCContainerDeclInfo ContDInfo;
218dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis  const ObjCInterfaceDecl *Class = D->getClassInterface();
219dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis  handleObjCContainer(Class, D->getLocation(), getCursor(D),
220dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis                      /*isForwardRef=*/false,
221dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis                      /*isRedeclaration=*/!Class->isImplicitInterfaceDecl(),
222dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis                      /*isImplementation=*/true, ContDInfo);
223dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis}
2244e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis
225dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidisvoid IndexingContext::handleObjCForwardProtocol(const ObjCProtocolDecl *D,
226dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis                                                SourceLocation Loc,
227dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis                                                bool isRedeclaration) {
228dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis  ObjCContainerDeclInfo ContDInfo;
229dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis  handleObjCContainer(D, Loc, MakeCursorObjCProtocolRef(D, Loc, CXTU),
230dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis                      /*isForwardRef=*/true,
231dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis                      isRedeclaration,
232dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis                      /*isImplementation=*/false, ContDInfo);
233dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis}
2344e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis
235dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidisvoid IndexingContext::handleObjCProtocol(const ObjCProtocolDecl *D) {
236dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis  ObjCContainerDeclInfo ContDInfo;
237dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis  handleObjCContainer(D, D->getLocation(), getCursor(D),
238dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis                      /*isForwardRef=*/false,
239dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis                      /*isRedeclaration=*/D->isInitiallyForwardDecl(),
240dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis                      /*isImplementation=*/false, ContDInfo);
2414e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis}
2424e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis
2434e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidisvoid IndexingContext::defineObjCInterface(const ObjCInterfaceDecl *D) {
2444e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis  if (!CB.defineObjCClass)
2454e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis    return;
2464e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis
247dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis  StrAdapter SA(*this);
248dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis  CXIdxObjCBaseClassInfo BaseClass;
249dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis  CXIdxEntityInfo BaseEntity;
2504e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis  if (D->getSuperClass()) {
251dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis    getEntityInfo(D->getSuperClass(), BaseEntity, SA);
252dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis    BaseClass.objcClass = &BaseEntity;
2534e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis    BaseClass.loc = getIndexLoc(D->getSuperClassLoc());
2544e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis  }
255dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis
2564e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis  SmallVector<CXIdxObjCProtocolRefInfo, 4> ProtInfos;
257dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis  SmallVector<CXIdxEntityInfo, 4> ProtEntities;
2584e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis  ObjCInterfaceDecl::protocol_loc_iterator LI = D->protocol_loc_begin();
2594e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis  for (ObjCInterfaceDecl::protocol_iterator
2604e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis         I = D->protocol_begin(), E = D->protocol_end(); I != E; ++I, ++LI) {
2614e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis    SourceLocation Loc = *LI;
2624e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis    ObjCProtocolDecl *PD = *I;
263dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis    ProtEntities.push_back(CXIdxEntityInfo());
264dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis    getEntityInfo(PD, ProtEntities.back(), SA);
265dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis    CXIdxObjCProtocolRefInfo ProtInfo = { 0, getIndexLoc(Loc) };
2664e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis    ProtInfos.push_back(ProtInfo);
2674e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis  }
268dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis
269dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis  for (unsigned i = 0, e = ProtInfos.size(); i != e; ++i)
270dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis    ProtInfos[i].protocol = &ProtEntities[i];
2714e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis
2724e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis  SmallVector<CXIdxObjCProtocolRefInfo *, 4> Prots;
2734e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis  for (unsigned i = 0, e = Prots.size(); i != e; ++i)
2744e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis    Prots.push_back(&ProtInfos[i]);
2754e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis
276dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis  CXIdxEntityInfo ClassEntity;
277dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis  getEntityInfo(D, ClassEntity, SA);
2784e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis  CXIdxObjCClassDefineInfo Info = { getCursor(D),
279dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis                                    &ClassEntity,
2804e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis                                    getIndexContainerForDC(D),
2814e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis                                    D->getSuperClass() ? &BaseClass : 0,
2824e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis                                    Prots.data(),
2833de2fc4e42f8d58f061af3ac8bb7d57e8d86a23bMatt Beaumont-Gay                                    static_cast<unsigned>(Prots.size()) };
2844e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis  CB.defineObjCClass(ClientData, &Info);
2854e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis}
2864e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis
2874e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidisvoid IndexingContext::handleObjCCategory(const ObjCCategoryDecl *D) {
288dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis  ObjCCategoryDeclInfo CatDInfo;
289dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis  CXIdxEntityInfo ClassEntity;
290dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis  StrAdapter SA(*this);
291dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis  getEntityInfo(D->getClassInterface(), ClassEntity, SA);
292dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis
293dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis  CatDInfo.CXObjCCatDeclInfo.containerInfo = &CatDInfo.CXObjCContDeclInfo;
294dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis  CatDInfo.CXObjCCatDeclInfo.objcClass = &ClassEntity;
295dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis  handleObjCContainer(D, D->getLocation(), getCursor(D),
296dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis                      /*isForwardRef=*/false,
297dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis                      /*isRedeclaration=*/false,
298dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis                      /*isImplementation=*/false, CatDInfo);
299dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis}
300dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis
301dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidisvoid IndexingContext::handleObjCCategoryImpl(const ObjCCategoryImplDecl *D) {
302dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis  const ObjCCategoryDecl *CatD = D->getCategoryDecl();
303dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis  ObjCCategoryDeclInfo CatDInfo;
304dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis  CXIdxEntityInfo ClassEntity;
305dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis  StrAdapter SA(*this);
306dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis  getEntityInfo(CatD->getClassInterface(), ClassEntity, SA);
307dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis
308dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis  CatDInfo.CXObjCCatDeclInfo.containerInfo = &CatDInfo.CXObjCContDeclInfo;
309dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis  CatDInfo.CXObjCCatDeclInfo.objcClass = &ClassEntity;
310dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis  handleObjCContainer(CatD, D->getLocation(), getCursor(D),
311dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis                      /*isForwardRef=*/false,
312dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis                      /*isRedeclaration=*/true,
313dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis                      /*isImplementation=*/true, CatDInfo);
3144e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis}
3154e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis
3164e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidisvoid IndexingContext::handleObjCMethod(const ObjCMethodDecl *D) {
317dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis  DeclInfo DInfo;
318dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis  handleDecl(D, D->getLocation(), getCursor(D),
319dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis             !D->isCanonicalDecl(), D->isThisDeclarationADefinition(),
320dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis             DInfo);
3214e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis}
3224e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis
3234e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidisvoid IndexingContext::handleObjCProperty(const ObjCPropertyDecl *D) {
324dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis  DeclInfo DInfo;
325dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis  handleDecl(D, D->getLocation(), getCursor(D),
326dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis             /*isRedeclaration=*/false, /*isDefinition=*/false,
327dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis             DInfo);
3284e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis}
3294e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis
3304e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidisvoid IndexingContext::handleReference(const NamedDecl *D, SourceLocation Loc,
3314e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis                                      const NamedDecl *Parent,
3324e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis                                      const DeclContext *DC,
333aca19be8731fc31cff68702de0dc7f30ce908979Argyrios Kyrtzidis                                      const Expr *E,
334aca19be8731fc31cff68702de0dc7f30ce908979Argyrios Kyrtzidis                                      CXIdxEntityRefKind Kind) {
3354e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis  if (Loc.isInvalid())
3364e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis    return;
3374e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis  if (!CB.indexEntityReference)
3384e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis    return;
3394e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis  if (isNotFromSourceFile(D->getLocation()))
3404e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis    return;
3414e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis
342dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis  StrAdapter SA(*this);
343854625f7347e4418803fe4aa9131928408e4dc53Benjamin Kramer  CXCursor Cursor = E ? MakeCXCursor(const_cast<Expr*>(E),
344854625f7347e4418803fe4aa9131928408e4dc53Benjamin Kramer                                     const_cast<Decl*>(cast<Decl>(DC)), CXTU)
345854625f7347e4418803fe4aa9131928408e4dc53Benjamin Kramer                      : getRefCursor(D, Loc);
346854625f7347e4418803fe4aa9131928408e4dc53Benjamin Kramer
347dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis  CXIdxEntityInfo RefEntity, ParentEntity;
348dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis  getEntityInfo(D, RefEntity, SA);
349dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis  getEntityInfo(Parent, ParentEntity, SA);
350854625f7347e4418803fe4aa9131928408e4dc53Benjamin Kramer  CXIdxEntityRefInfo Info = { Cursor,
3514e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis                              getIndexLoc(Loc),
352dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis                              &RefEntity,
353dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis                              &ParentEntity,
354aca19be8731fc31cff68702de0dc7f30ce908979Argyrios Kyrtzidis                              getIndexContainerForDC(DC),
355aca19be8731fc31cff68702de0dc7f30ce908979Argyrios Kyrtzidis                              Kind };
3564e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis  CB.indexEntityReference(ClientData, &Info);
3574e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis}
3584e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis
359dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidisvoid IndexingContext::startContainer(const NamedDecl *D, bool isStmtBody,
360dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis                                     const DeclContext *DC) {
361dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis  if (!CB.startedContainer)
362dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis    return;
3634e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis
364dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis  if (!DC)
365dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis    DC = cast<DeclContext>(D);
366dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis
367dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis  StrAdapter SA(*this);
368dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis  CXIdxEntityInfo Entity;
369dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis  getEntityInfo(D, Entity, SA);
370dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis  CXIdxContainerInfo Info;
371dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis  Info.entity = &Entity;
372dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis  Info.cursor = getCursor(D);
373dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis  Info.loc = getIndexLoc(D->getLocation());
374dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis  Info.isObjCImpl = isa<ObjCImplDecl>(D);
3754e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis
376dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis  CXIdxClientContainer clientCont = CB.startedContainer(ClientData, &Info);
377dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis  addContainerInMap(DC, clientCont);
3784e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis}
3794e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis
380dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidisvoid IndexingContext::endContainer(const DeclContext *DC) {
3814e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis  if (CB.endedContainer) {
3824e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis    CXIdxEndContainerInfo Info = { getIndexContainerForDC(DC),
3834e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis                                   getIndexLoc(cast<Decl>(DC)->getLocEnd()) };
3844e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis    CB.endedContainer(ClientData, &Info);
3854e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis  }
3864e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis}
3874e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis
3884e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidisbool IndexingContext::isNotFromSourceFile(SourceLocation Loc) const {
3894e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis  if (Loc.isInvalid())
3904e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis    return true;
3914e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis  SourceManager &SM = Ctx->getSourceManager();
3924e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis  SourceLocation FileLoc = SM.getFileLoc(Loc);
3934e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis  FileID FID = SM.getFileID(FileLoc);
3944e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis  return SM.getFileEntryForID(FID) == 0;
3954e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis}
3964e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis
3974e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidisvoid IndexingContext::addContainerInMap(const DeclContext *DC,
398dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis                                        CXIdxClientContainer container) {
3994e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis  assert(getScopedContext(DC) == DC);
4004e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis  ContainerMapTy::iterator I = ContainerMap.find(DC);
4014e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis  if (I == ContainerMap.end()) {
4024e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis    if (container)
4034e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis      ContainerMap[DC] = container;
4044e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis    return;
4054e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis  }
4064e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis  // Allow changing the container of a previously seen DeclContext so we
4074e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis  // can handle invalid user code, like a function re-definition.
4084e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis  if (container)
4094e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis    I->second = container;
4104e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis  else
4114e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis    ContainerMap.erase(I);
4124e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis}
4134e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis
414dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidisvoid IndexingContext::addEntityInMap(const NamedDecl *D,
415dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis                                     CXIdxClientEntity entity) {
4164e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis  assert(getEntityDecl(D) == D &&
4174e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis         "Tried to add a non-entity (canonical) decl");
4184e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis  assert(EntityMap.find(D) == EntityMap.end());
4194e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis  if (entity || D->isFromASTFile())
4204e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis    EntityMap[D] = entity;
4214e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis}
4224e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis
423dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios KyrtzidisCXIdxClientEntity IndexingContext::getClientEntity(const NamedDecl *D) {
4244e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis  if (!D)
4254e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis    return 0;
4264e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis  D = getEntityDecl(D);
4274e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis  EntityMapTy::const_iterator I = EntityMap.find(D);
4284e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis  if (I != EntityMap.end())
4294e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis    return I->second;
4304e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis
4314e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis  if (!D->isFromASTFile()) {
4324e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis    //assert(0 && "Entity not in map");
4334e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis    return 0;
4344e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis  }
4354e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis
436dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis  StrAdapter SA(*this);
4374e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis
438dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis  CXIdxClientEntity idxEntity = 0;
4394e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis  if (CB.importedEntity) {
4404e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis    CXIdxEntityInfo EntityInfo;
4414e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis    getEntityInfo(D, EntityInfo, SA);
4424e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis    CXIdxImportedEntityInfo Info = { &EntityInfo,
4434e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis                                     getCursor(D),
4444e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis                                     getIndexLoc(D->getLocation()),
4454e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis                                     /*CXIdxASTFile*/0 };
4464e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis    idxEntity = CB.importedEntity(ClientData, &Info);
4474e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis  }
4484e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis  addEntityInMap(D, idxEntity);
4494e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis  return idxEntity;
4504e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis}
4514e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis
4524e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidisconst NamedDecl *IndexingContext::getEntityDecl(const NamedDecl *D) const {
4534e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis  assert(D);
4544e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis  D = cast<NamedDecl>(D->getCanonicalDecl());
4554e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis
4564e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis  if (const ObjCCategoryDecl *Cat = dyn_cast<ObjCCategoryDecl>(D)) {
4574e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis    if (Cat->IsClassExtension())
4584e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis      return getEntityDecl(Cat->getClassInterface());
4594e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis
4604e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis  } else if (const ObjCImplementationDecl *
4614e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis               ImplD = dyn_cast<ObjCImplementationDecl>(D)) {
4624e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis    return getEntityDecl(ImplD->getClassInterface());
4634e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis
4644e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis  } else if (const ObjCCategoryImplDecl *
4654e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis               CatImplD = dyn_cast<ObjCCategoryImplDecl>(D)) {
4664e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis    return getEntityDecl(CatImplD->getCategoryDecl());
4674e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis  }
4684e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis
4694e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis  return D;
4704e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis}
4714e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis
4724e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidisconst DeclContext *
4734e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios KyrtzidisIndexingContext::getScopedContext(const DeclContext *DC) const {
4744e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis  // Local contexts are ignored for indexing.
4754e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis  const DeclContext *FuncCtx = cast<Decl>(DC)->getParentFunctionOrMethod();
4764e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis  if (FuncCtx)
4774e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis    return FuncCtx;
4784e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis
4794e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis  // We consider enums always scoped for indexing.
4804e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis  if (isa<TagDecl>(DC))
4814e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis    return DC;
4824e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis
4834e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis  if (const NamespaceDecl *NS = dyn_cast<NamespaceDecl>(DC)) {
4844e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis    if (NS->isAnonymousNamespace())
4854e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis      return getScopedContext(NS->getParent());
4864e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis    return NS;
4874e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis  }
4884e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis
4894e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis  return DC->getRedeclContext();
4904e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis}
4914e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis
492dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios KyrtzidisCXIdxClientContainer
4934e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios KyrtzidisIndexingContext::getIndexContainerForDC(const DeclContext *DC) const {
4944e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis  DC = getScopedContext(DC);
4954e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis  ContainerMapTy::const_iterator I = ContainerMap.find(DC);
4964e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis//  assert(I != ContainerMap.end() &&
4974e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis//         "Failed to include a scoped context in the container map");
4984e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis  return I->second;
4994e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis}
5004e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis
501dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios KyrtzidisCXIdxClientFile IndexingContext::getIndexFile(const FileEntry *File) {
5024e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis  if (!File)
5034e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis    return 0;
5044e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis
5054e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis  FileMapTy::iterator FI = FileMap.find(File);
5064e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis  if (FI != FileMap.end())
5074e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis    return FI->second;
5084e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis
509dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis  return 0;
5104e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis}
5114e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis
5124e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios KyrtzidisCXIdxLoc IndexingContext::getIndexLoc(SourceLocation Loc) const {
5134e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis  CXIdxLoc idxLoc =  { {0, 0}, 0 };
5144e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis  if (Loc.isInvalid())
5154e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis    return idxLoc;
5164e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis
5174e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis  idxLoc.ptr_data[0] = (void*)this;
5184e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis  idxLoc.int_data = Loc.getRawEncoding();
5194e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis  return idxLoc;
5204e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis}
5214e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis
5224e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidisvoid IndexingContext::translateLoc(SourceLocation Loc,
523dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis                                   CXIdxClientFile *indexFile, CXFile *file,
5244e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis                                   unsigned *line, unsigned *column,
5254e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis                                   unsigned *offset) {
5264e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis  if (Loc.isInvalid())
5274e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis    return;
5284e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis
5294e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis  SourceManager &SM = Ctx->getSourceManager();
5304e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis  Loc = SM.getFileLoc(Loc);
5314e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis
5324e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis  std::pair<FileID, unsigned> LocInfo = SM.getDecomposedLoc(Loc);
5334e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis  FileID FID = LocInfo.first;
5344e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis  unsigned FileOffset = LocInfo.second;
5354e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis
5364e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis  if (FID.isInvalid())
5374e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis    return;
5384e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis
5394e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis  const FileEntry *FE = SM.getFileEntryForID(FID);
5404e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis  if (indexFile)
5414e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis    *indexFile = getIndexFile(FE);
5424e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis  if (file)
5434e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis    *file = (void *)FE;
5444e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis  if (line)
5454e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis    *line = SM.getLineNumber(FID, FileOffset);
5464e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis  if (column)
5474e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis    *column = SM.getColumnNumber(FID, FileOffset);
5484e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis  if (offset)
5494e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis    *offset = FileOffset;
5504e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis}
5514e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis
552dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidisvoid IndexingContext::getEntityInfo(const NamedDecl *D,
553dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis                                     CXIdxEntityInfo &EntityInfo,
554dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis                                     StrAdapter &SA) {
555dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis  D = getEntityDecl(D);
556dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis  EntityInfo.kind = CXIdxEntity_Unexposed;
557dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis  EntityInfo.clientEntity = getClientEntity(D);
558dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis
559dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis  if (const TagDecl *TD = dyn_cast<TagDecl>(D)) {
560dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis    switch (TD->getTagKind()) {
561dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis    case TTK_Struct:
562dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis      EntityInfo.kind = CXIdxEntity_Struct; break;
563dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis    case TTK_Union:
564dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis      EntityInfo.kind = CXIdxEntity_Union; break;
565dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis    case TTK_Class:
566dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis      EntityInfo.kind = CXIdxEntity_CXXClass; break;
567dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis    case TTK_Enum:
568dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis      EntityInfo.kind = CXIdxEntity_Enum; break;
569dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis    }
5704e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis
571dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis  } else {
572dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis    switch (D->getKind()) {
573dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis    case Decl::Typedef:
574dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis      EntityInfo.kind = CXIdxEntity_Typedef; break;
575dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis    case Decl::Function:
576dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis      EntityInfo.kind = CXIdxEntity_Function; break;
577dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis    case Decl::Var:
578dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis      EntityInfo.kind = CXIdxEntity_Variable; break;
579dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis    case Decl::Field:
580dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis      EntityInfo.kind = CXIdxEntity_Field; break;
581dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis    case Decl::EnumConstant:
582dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis      EntityInfo.kind = CXIdxEntity_EnumConstant; break;
583dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis    case Decl::ObjCInterface:
584dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis      EntityInfo.kind = CXIdxEntity_ObjCClass; break;
585dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis    case Decl::ObjCProtocol:
586dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis      EntityInfo.kind = CXIdxEntity_ObjCProtocol; break;
587dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis    case Decl::ObjCCategory:
588dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis      EntityInfo.kind = CXIdxEntity_ObjCCategory; break;
589dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis    case Decl::ObjCMethod:
590dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis      EntityInfo.kind = CXIdxEntity_ObjCMethod; break;
591dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis    case Decl::ObjCProperty:
592dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis      EntityInfo.kind = CXIdxEntity_ObjCProperty; break;
593dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis    case Decl::ObjCIvar:
594dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis      EntityInfo.kind = CXIdxEntity_ObjCIvar; break;
595dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis    default:
596dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis      break;
597dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis    }
598dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis  }
5994e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis
6004e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis  if (IdentifierInfo *II = D->getIdentifier()) {
6014e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis    EntityInfo.name = SA.toCStr(II->getName());
6024e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis
6034e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis  } else if (isa<RecordDecl>(D) || isa<NamespaceDecl>(D)) {
604dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis    EntityInfo.name = 0; // anonymous record/namespace.
6054e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis
6064e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis  } else {
6074e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis    unsigned Begin = SA.getCurSize();
6084e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis    {
6094e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis      llvm::raw_svector_ostream OS(SA.getBuffer());
6104e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis      D->printName(OS);
6114e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis    }
6124e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis    EntityInfo.name = SA.getCStr(Begin);
6134e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis  }
6144e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis
615dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis  {
616dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis    unsigned Begin = SA.getCurSize();
617dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis    bool Ignore = getDeclCursorUSR(D, SA.getBuffer());
618dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis    if (Ignore) {
619dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis      EntityInfo.USR = "";
620dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis    } else {
621dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis      EntityInfo.USR = SA.getCStr(Begin);
622dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis    }
6234e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis  }
6244e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis}
6254e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis
6264e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios KyrtzidisCXCursor IndexingContext::getRefCursor(const NamedDecl *D, SourceLocation Loc) {
6274e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis  if (const TypeDecl *TD = dyn_cast<TypeDecl>(D))
6284e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis    return MakeCursorTypeRef(TD, Loc, CXTU);
6294e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis  if (const ObjCInterfaceDecl *ID = dyn_cast<ObjCInterfaceDecl>(D))
6304e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis    return MakeCursorObjCClassRef(ID, Loc, CXTU);
6314e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis  if (const ObjCProtocolDecl *PD = dyn_cast<ObjCProtocolDecl>(D))
6324e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis    return MakeCursorObjCProtocolRef(PD, Loc, CXTU);
6334e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis
6344e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis  //assert(0 && "not yet");
6354e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis  return clang_getNullCursor();
6364e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis}
637