IndexingContext.cpp revision 2957e6f8c4c2e58a4b9cb639949fea801970fe36
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"
152957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis#include "clang/AST/DeclCXX.h"
16b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis#include "clang/AST/DeclTemplate.h"
174e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis
184e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidisusing namespace clang;
194e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidisusing namespace cxindex;
204e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidisusing namespace cxcursor;
214e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis
226ec43adc39006a7fce94188956d0239bd54c0363Argyrios KyrtzidisIndexingContext::ObjCProtocolListInfo::ObjCProtocolListInfo(
236ec43adc39006a7fce94188956d0239bd54c0363Argyrios Kyrtzidis                                    const ObjCProtocolList &ProtList,
246ec43adc39006a7fce94188956d0239bd54c0363Argyrios Kyrtzidis                                    IndexingContext &IdxCtx,
256ec43adc39006a7fce94188956d0239bd54c0363Argyrios Kyrtzidis                                    StrAdapter &SA) {
266ec43adc39006a7fce94188956d0239bd54c0363Argyrios Kyrtzidis  ObjCInterfaceDecl::protocol_loc_iterator LI = ProtList.loc_begin();
276ec43adc39006a7fce94188956d0239bd54c0363Argyrios Kyrtzidis  for (ObjCInterfaceDecl::protocol_iterator
286ec43adc39006a7fce94188956d0239bd54c0363Argyrios Kyrtzidis         I = ProtList.begin(), E = ProtList.end(); I != E; ++I, ++LI) {
296ec43adc39006a7fce94188956d0239bd54c0363Argyrios Kyrtzidis    SourceLocation Loc = *LI;
306ec43adc39006a7fce94188956d0239bd54c0363Argyrios Kyrtzidis    ObjCProtocolDecl *PD = *I;
312957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis    ProtEntities.push_back(EntityInfo());
326ec43adc39006a7fce94188956d0239bd54c0363Argyrios Kyrtzidis    IdxCtx.getEntityInfo(PD, ProtEntities.back(), SA);
336ec43adc39006a7fce94188956d0239bd54c0363Argyrios Kyrtzidis    CXIdxObjCProtocolRefInfo ProtInfo = { 0,
346ec43adc39006a7fce94188956d0239bd54c0363Argyrios Kyrtzidis                                MakeCursorObjCProtocolRef(PD, Loc, IdxCtx.CXTU),
356ec43adc39006a7fce94188956d0239bd54c0363Argyrios Kyrtzidis                                IdxCtx.getIndexLoc(Loc) };
366ec43adc39006a7fce94188956d0239bd54c0363Argyrios Kyrtzidis    ProtInfos.push_back(ProtInfo);
376ec43adc39006a7fce94188956d0239bd54c0363Argyrios Kyrtzidis  }
386ec43adc39006a7fce94188956d0239bd54c0363Argyrios Kyrtzidis
396ec43adc39006a7fce94188956d0239bd54c0363Argyrios Kyrtzidis  for (unsigned i = 0, e = ProtInfos.size(); i != e; ++i)
406ec43adc39006a7fce94188956d0239bd54c0363Argyrios Kyrtzidis    ProtInfos[i].protocol = &ProtEntities[i];
416ec43adc39006a7fce94188956d0239bd54c0363Argyrios Kyrtzidis
426ec43adc39006a7fce94188956d0239bd54c0363Argyrios Kyrtzidis  for (unsigned i = 0, e = ProtInfos.size(); i != e; ++i)
436ec43adc39006a7fce94188956d0239bd54c0363Argyrios Kyrtzidis    Prots.push_back(&ProtInfos[i]);
446ec43adc39006a7fce94188956d0239bd54c0363Argyrios Kyrtzidis}
456ec43adc39006a7fce94188956d0239bd54c0363Argyrios Kyrtzidis
46b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios KyrtzidisIndexingContext::AttrListInfo::AttrListInfo(const Decl *D,
47b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis                                            IndexingContext &IdxCtx,
48b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis                                            StrAdapter &SA) {
49b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis  for (AttrVec::const_iterator AttrI = D->attr_begin(), AttrE = D->attr_end();
50b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis         AttrI != AttrE; ++AttrI) {
51b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis    const Attr *A = *AttrI;
52b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis    CXCursor C = MakeCXCursor(A, const_cast<Decl *>(D), IdxCtx.CXTU);
53b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis    CXIdxLoc Loc =  IdxCtx.getIndexLoc(A->getLocation());
54b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis    switch (C.kind) {
55b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis    default:
56b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis      Attrs.push_back(AttrInfo(CXIdxAttr_Unexposed, C, Loc, A));
57b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis      break;
58b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis    case CXCursor_IBActionAttr:
59b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis      Attrs.push_back(AttrInfo(CXIdxAttr_IBAction, C, Loc, A));
60b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis      break;
61b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis    case CXCursor_IBOutletAttr:
62b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis      Attrs.push_back(AttrInfo(CXIdxAttr_IBOutlet, C, Loc, A));
63b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis      break;
64b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis    case CXCursor_IBOutletCollectionAttr:
65b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis      IBCollAttrs.push_back(IBOutletCollectionInfo(C, Loc, A));
66b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis      break;
67b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis    }
68b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis  }
69b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis
70b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis  for (unsigned i = 0, e = IBCollAttrs.size(); i != e; ++i) {
71b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis    IBOutletCollectionInfo &IBInfo = IBCollAttrs[i];
72b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis    CXAttrs.push_back(&IBInfo);
73b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis
74b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis    const IBOutletCollectionAttr *
75b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis      IBAttr = cast<IBOutletCollectionAttr>(IBInfo.A);
76b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis    IBInfo.IBCollInfo.attrInfo = &IBInfo;
77b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis    IBInfo.IBCollInfo.classLoc = IdxCtx.getIndexLoc(IBAttr->getInterfaceLoc());
78b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis    IBInfo.IBCollInfo.objcClass = 0;
79b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis    IBInfo.IBCollInfo.classCursor = clang_getNullCursor();
80b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis    QualType Ty = IBAttr->getInterface();
81b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis    if (const ObjCInterfaceType *InterTy = Ty->getAs<ObjCInterfaceType>()) {
82b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis      if (const ObjCInterfaceDecl *InterD = InterTy->getInterface()) {
832957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis        IdxCtx.getEntityInfo(InterD, IBInfo.ClassInfo, SA);
842957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis        IBInfo.IBCollInfo.objcClass = &IBInfo.ClassInfo;
85b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis        IBInfo.IBCollInfo.classCursor = MakeCursorObjCClassRef(InterD,
86b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis                                        IBAttr->getInterfaceLoc(), IdxCtx.CXTU);
87b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis      }
88b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis    }
89b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis  }
90b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis
91b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis  for (unsigned i = 0, e = Attrs.size(); i != e; ++i)
92b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis    CXAttrs.push_back(&Attrs[i]);
93b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis}
94b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis
952957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios KyrtzidisIndexingContext::CXXBasesListInfo::CXXBasesListInfo(const CXXRecordDecl *D,
962957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis                                   IndexingContext &IdxCtx,
972957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis                                   IndexingContext::StrAdapter &SA) {
982957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis  for (CXXRecordDecl::base_class_const_iterator
992957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis         I = D->bases_begin(), E = D->bases_end(); I != E; ++I) {
1002957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis    const CXXBaseSpecifier &Base = *I;
1012957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis    BaseEntities.push_back(EntityInfo());
1022957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis    const CXXRecordDecl *BaseRD = 0;
1032957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis    if (const RecordType *RT = Base.getType()->getAs<RecordType>())
1042957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis      BaseRD = dyn_cast_or_null<CXXRecordDecl>(RT->getDecl());
1052957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis    IdxCtx.getEntityInfo(BaseRD, BaseEntities.back(), SA);
1062957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis    CXIdxBaseClassInfo BaseInfo = { 0,
1072957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis                         MakeCursorCXXBaseSpecifier(&Base, IdxCtx.CXTU),
1082957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis                         IdxCtx.getIndexLoc(Base.getSourceRange().getBegin()) };
1092957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis    BaseInfos.push_back(BaseInfo);
1102957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis  }
1112957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis
1122957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis  for (unsigned i = 0, e = BaseInfos.size(); i != e; ++i) {
1132957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis    if (BaseEntities[i].USR)
1142957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis      BaseInfos[i].base = &BaseEntities[i];
1152957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis  }
1162957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis
1172957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis  for (unsigned i = 0, e = BaseInfos.size(); i != e; ++i)
1182957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis    CXBases.push_back(&BaseInfos[i]);
1192957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis}
1202957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis
1214e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidisconst char *IndexingContext::StrAdapter::toCStr(StringRef Str) {
1224e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis  if (Str.empty())
1234e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis    return "";
1244e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis  if (Str.data()[Str.size()] == '\0')
1254e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis    return Str.data();
1264e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis  Scratch += Str;
1274e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis  Scratch.push_back('\0');
1284e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis  return Scratch.data() + (Scratch.size() - Str.size() - 1);
1294e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis}
1304e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis
1314e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidisvoid IndexingContext::setASTContext(ASTContext &ctx) {
1324e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis  Ctx = &ctx;
1334e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis  static_cast<ASTUnit*>(CXTU->TUData)->setASTContext(&ctx);
1344e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis}
1354e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis
136b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidisbool IndexingContext::shouldAbort() {
137b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis  if (!CB.abortQuery)
138b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis    return false;
139b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis  return CB.abortQuery(ClientData, 0);
140b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis}
141b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis
142dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidisvoid IndexingContext::enteredMainFile(const FileEntry *File) {
143dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis  if (File && CB.enteredMainFile) {
144dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis    CXIdxClientFile idxFile = CB.enteredMainFile(ClientData, (CXFile)File, 0);
145dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis    FileMap[File] = idxFile;
146dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis  }
147dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis}
148dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis
1494e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidisvoid IndexingContext::ppIncludedFile(SourceLocation hashLoc,
1504e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis                                     StringRef filename,
1514e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis                                     const FileEntry *File,
1524e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis                                     bool isImport, bool isAngled) {
1534e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis  if (!CB.ppIncludedFile)
1544e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis    return;
1554e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis
156dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis  StrAdapter SA(*this);
1574e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis  CXIdxIncludedFileInfo Info = { getIndexLoc(hashLoc),
1584e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis                                 SA.toCStr(filename),
159dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis                                 (CXFile)File,
1604e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis                                 isImport, isAngled };
161dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis  CXIdxClientFile idxFile = CB.ppIncludedFile(ClientData, &Info);
162dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis  FileMap[File] = idxFile;
1634e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis}
1644e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis
1656ec43adc39006a7fce94188956d0239bd54c0363Argyrios Kyrtzidisvoid IndexingContext::startedTranslationUnit() {
166dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis  CXIdxClientContainer idxCont = 0;
1674e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis  if (CB.startedTranslationUnit)
1684e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis    idxCont = CB.startedTranslationUnit(ClientData, 0);
1694e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis  addContainerInMap(Ctx->getTranslationUnitDecl(), idxCont);
1704e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis}
1714e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis
172b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidisvoid IndexingContext::handleDiagnosticSet(CXDiagnostic CXDiagSet) {
1734e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis  if (!CB.diagnostic)
1744e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis    return;
1754e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis
176b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis  CB.diagnostic(ClientData, CXDiagSet, 0);
1774e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis}
1784e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis
179b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidisbool IndexingContext::handleDecl(const NamedDecl *D,
180dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis                                 SourceLocation Loc, CXCursor Cursor,
181dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis                                 DeclInfo &DInfo) {
182144b6c0c50b5523609cbac523f168b9e3cb01175Argyrios Kyrtzidis  if (!CB.indexDeclaration || !D)
183b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis    return false;
1842957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis  if (D->isImplicit() && shouldIgnoreIfImplicit(D))
1852957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis    return false;
1864e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis
187dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis  StrAdapter SA(*this);
1882957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis  getEntityInfo(D, DInfo.EntInfo, SA);
1892957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis  if (!DInfo.EntInfo.USR || Loc.isInvalid())
190b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis    return false;
191144b6c0c50b5523609cbac523f168b9e3cb01175Argyrios Kyrtzidis
192b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis  markEntityOccurrenceInFile(D, Loc);
193b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis
1942957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis  DInfo.entityInfo = &DInfo.EntInfo;
195dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis  DInfo.cursor = Cursor;
196dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis  DInfo.loc = getIndexLoc(Loc);
197c71d55469e7d5f7b376a30620617a175a9442da9Argyrios Kyrtzidis  DInfo.isImplicit = D->isImplicit();
198dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis
199b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis  AttrListInfo AttrList(D, *this, SA);
200b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis  DInfo.attributes = AttrList.getAttrs();
201b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis  DInfo.numAttributes = AttrList.getNumAttrs();
202b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis
2032957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis  getContainerInfo(D->getDeclContext(), DInfo.Container);
2042957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis  DInfo.container = &DInfo.Container;
2052957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis  if (DInfo.isContainer) {
2062957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis    getContainerInfo(getEntityContainer(D), DInfo.DeclAsContainer);
2072957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis    DInfo.declAsContainer = &DInfo.DeclAsContainer;
2082957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis  }
209b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis
2102957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis  CB.indexDeclaration(ClientData, &DInfo);
211b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis  return true;
212dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis}
213dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis
214b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidisbool IndexingContext::handleObjCContainer(const ObjCContainerDecl *D,
215dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis                                          SourceLocation Loc, CXCursor Cursor,
216dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis                                          ObjCContainerDeclInfo &ContDInfo) {
2176ec43adc39006a7fce94188956d0239bd54c0363Argyrios Kyrtzidis  ContDInfo.ObjCContDeclInfo.declInfo = &ContDInfo;
218b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis  return handleDecl(D, Loc, Cursor, ContDInfo);
2194e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis}
2204e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis
221b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidisbool IndexingContext::handleFunction(const FunctionDecl *D) {
222c71d55469e7d5f7b376a30620617a175a9442da9Argyrios Kyrtzidis  DeclInfo DInfo(!D->isFirstDeclaration(), D->isThisDeclarationADefinition(),
223c71d55469e7d5f7b376a30620617a175a9442da9Argyrios Kyrtzidis                 D->isThisDeclarationADefinition());
224b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis  return handleDecl(D, D->getLocation(), getCursor(D), DInfo);
225dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis}
2264e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis
227b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidisbool IndexingContext::handleVar(const VarDecl *D) {
228c71d55469e7d5f7b376a30620617a175a9442da9Argyrios Kyrtzidis  DeclInfo DInfo(!D->isFirstDeclaration(), D->isThisDeclarationADefinition(),
229c71d55469e7d5f7b376a30620617a175a9442da9Argyrios Kyrtzidis                 /*isContainer=*/false);
230b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis  return handleDecl(D, D->getLocation(), getCursor(D), DInfo);
2314e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis}
2324e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis
233b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidisbool IndexingContext::handleField(const FieldDecl *D) {
234c71d55469e7d5f7b376a30620617a175a9442da9Argyrios Kyrtzidis  DeclInfo DInfo(/*isRedeclaration=*/false, /*isDefinition=*/true,
235c71d55469e7d5f7b376a30620617a175a9442da9Argyrios Kyrtzidis                 /*isContainer=*/false);
236b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis  return handleDecl(D, D->getLocation(), getCursor(D), DInfo);
2374e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis}
2384e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis
239b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidisbool IndexingContext::handleEnumerator(const EnumConstantDecl *D) {
240c71d55469e7d5f7b376a30620617a175a9442da9Argyrios Kyrtzidis  DeclInfo DInfo(/*isRedeclaration=*/false, /*isDefinition=*/true,
241c71d55469e7d5f7b376a30620617a175a9442da9Argyrios Kyrtzidis                 /*isContainer=*/false);
242b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis  return handleDecl(D, D->getLocation(), getCursor(D), DInfo);
2434e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis}
2444e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis
245b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidisbool IndexingContext::handleTagDecl(const TagDecl *D) {
2462957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis  if (const CXXRecordDecl *CXXRD = dyn_cast<CXXRecordDecl>(D))
2472957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis    return handleCXXRecordDecl(CXXRD, D);
2482957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis
249c71d55469e7d5f7b376a30620617a175a9442da9Argyrios Kyrtzidis  DeclInfo DInfo(!D->isFirstDeclaration(), D->isThisDeclarationADefinition(),
250c71d55469e7d5f7b376a30620617a175a9442da9Argyrios Kyrtzidis                 D->isThisDeclarationADefinition());
251b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis  return handleDecl(D, D->getLocation(), getCursor(D), DInfo);
2524e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis}
2534e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis
2542957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidisbool IndexingContext::handleTypedefName(const TypedefNameDecl *D) {
255c71d55469e7d5f7b376a30620617a175a9442da9Argyrios Kyrtzidis  DeclInfo DInfo(!D->isFirstDeclaration(), /*isDefinition=*/true,
256c71d55469e7d5f7b376a30620617a175a9442da9Argyrios Kyrtzidis                 /*isContainer=*/false);
257b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis  return handleDecl(D, D->getLocation(), getCursor(D), DInfo);
258dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis}
2594e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis
260b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidisbool IndexingContext::handleObjCClass(const ObjCClassDecl *D) {
261dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis  const ObjCClassDecl::ObjCClassRef *Ref = D->getForwardDecl();
262dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis  ObjCInterfaceDecl *IFaceD = Ref->getInterface();
263dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis  SourceLocation Loc = Ref->getLocation();
264dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis  bool isRedeclaration = IFaceD->getLocation() != Loc;
265c71d55469e7d5f7b376a30620617a175a9442da9Argyrios Kyrtzidis
266c71d55469e7d5f7b376a30620617a175a9442da9Argyrios Kyrtzidis  ObjCContainerDeclInfo ContDInfo(/*isForwardRef=*/true, isRedeclaration,
267c71d55469e7d5f7b376a30620617a175a9442da9Argyrios Kyrtzidis                                  /*isImplementation=*/false);
268b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis  return handleObjCContainer(IFaceD, Loc,
269b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis                          MakeCursorObjCClassRef(IFaceD, Loc, CXTU), ContDInfo);
2704e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis}
2714e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis
272b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidisbool IndexingContext::handleObjCInterface(const ObjCInterfaceDecl *D) {
2736ec43adc39006a7fce94188956d0239bd54c0363Argyrios Kyrtzidis  StrAdapter SA(*this);
2746ec43adc39006a7fce94188956d0239bd54c0363Argyrios Kyrtzidis
2756ec43adc39006a7fce94188956d0239bd54c0363Argyrios Kyrtzidis  CXIdxBaseClassInfo BaseClass;
2762957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis  EntityInfo BaseEntity;
2776ec43adc39006a7fce94188956d0239bd54c0363Argyrios Kyrtzidis  BaseClass.cursor = clang_getNullCursor();
2786ec43adc39006a7fce94188956d0239bd54c0363Argyrios Kyrtzidis  if (ObjCInterfaceDecl *SuperD = D->getSuperClass()) {
2796ec43adc39006a7fce94188956d0239bd54c0363Argyrios Kyrtzidis    getEntityInfo(SuperD, BaseEntity, SA);
2806ec43adc39006a7fce94188956d0239bd54c0363Argyrios Kyrtzidis    SourceLocation SuperLoc = D->getSuperClassLoc();
2816ec43adc39006a7fce94188956d0239bd54c0363Argyrios Kyrtzidis    BaseClass.base = &BaseEntity;
2826ec43adc39006a7fce94188956d0239bd54c0363Argyrios Kyrtzidis    BaseClass.cursor = MakeCursorObjCSuperClassRef(SuperD, SuperLoc, CXTU);
2836ec43adc39006a7fce94188956d0239bd54c0363Argyrios Kyrtzidis    BaseClass.loc = getIndexLoc(SuperLoc);
2846ec43adc39006a7fce94188956d0239bd54c0363Argyrios Kyrtzidis  }
2856ec43adc39006a7fce94188956d0239bd54c0363Argyrios Kyrtzidis
2866ec43adc39006a7fce94188956d0239bd54c0363Argyrios Kyrtzidis  ObjCProtocolListInfo ProtInfo(D->getReferencedProtocols(), *this, SA);
2876ec43adc39006a7fce94188956d0239bd54c0363Argyrios Kyrtzidis
288c71d55469e7d5f7b376a30620617a175a9442da9Argyrios Kyrtzidis  ObjCInterfaceDeclInfo InterInfo(D);
289c71d55469e7d5f7b376a30620617a175a9442da9Argyrios Kyrtzidis  InterInfo.ObjCProtoListInfo = ProtInfo.getListInfo();
290c71d55469e7d5f7b376a30620617a175a9442da9Argyrios Kyrtzidis  InterInfo.ObjCInterDeclInfo.containerInfo = &InterInfo.ObjCContDeclInfo;
2916ec43adc39006a7fce94188956d0239bd54c0363Argyrios Kyrtzidis  InterInfo.ObjCInterDeclInfo.superInfo = D->getSuperClass() ? &BaseClass : 0;
292c71d55469e7d5f7b376a30620617a175a9442da9Argyrios Kyrtzidis  InterInfo.ObjCInterDeclInfo.protocols = &InterInfo.ObjCProtoListInfo;
2936ec43adc39006a7fce94188956d0239bd54c0363Argyrios Kyrtzidis
294b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis  return handleObjCContainer(D, D->getLocation(), getCursor(D), InterInfo);
295dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis}
2964e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis
297b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidisbool IndexingContext::handleObjCImplementation(
298dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis                                              const ObjCImplementationDecl *D) {
299c71d55469e7d5f7b376a30620617a175a9442da9Argyrios Kyrtzidis  ObjCContainerDeclInfo ContDInfo(/*isForwardRef=*/false,
300e7bbab91f5cc899104d0a1dee6059d8413c70eebArgyrios Kyrtzidis                      /*isRedeclaration=*/true,
301c71d55469e7d5f7b376a30620617a175a9442da9Argyrios Kyrtzidis                      /*isImplementation=*/true);
302b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis  return handleObjCContainer(D, D->getLocation(), getCursor(D), ContDInfo);
303dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis}
3044e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis
305b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidisbool IndexingContext::handleObjCForwardProtocol(const ObjCProtocolDecl *D,
306dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis                                                SourceLocation Loc,
307dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis                                                bool isRedeclaration) {
308c71d55469e7d5f7b376a30620617a175a9442da9Argyrios Kyrtzidis  ObjCContainerDeclInfo ContDInfo(/*isForwardRef=*/true,
309c71d55469e7d5f7b376a30620617a175a9442da9Argyrios Kyrtzidis                                  isRedeclaration,
310c71d55469e7d5f7b376a30620617a175a9442da9Argyrios Kyrtzidis                                  /*isImplementation=*/false);
311b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis  return handleObjCContainer(D, Loc, MakeCursorObjCProtocolRef(D, Loc, CXTU),
312b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis                             ContDInfo);
313dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis}
3144e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis
315b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidisbool IndexingContext::handleObjCProtocol(const ObjCProtocolDecl *D) {
316dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis  StrAdapter SA(*this);
3176ec43adc39006a7fce94188956d0239bd54c0363Argyrios Kyrtzidis  ObjCProtocolListInfo ProtListInfo(D->getReferencedProtocols(), *this, SA);
318dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis
319c71d55469e7d5f7b376a30620617a175a9442da9Argyrios Kyrtzidis  ObjCProtocolDeclInfo ProtInfo(D);
320c71d55469e7d5f7b376a30620617a175a9442da9Argyrios Kyrtzidis  ProtInfo.ObjCProtoRefListInfo = ProtListInfo.getListInfo();
3214e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis
322b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis  return handleObjCContainer(D, D->getLocation(), getCursor(D), ProtInfo);
3234e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis}
3244e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis
325b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidisbool IndexingContext::handleObjCCategory(const ObjCCategoryDecl *D) {
326c71d55469e7d5f7b376a30620617a175a9442da9Argyrios Kyrtzidis  ObjCCategoryDeclInfo CatDInfo(/*isImplementation=*/false);
3272957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis  EntityInfo ClassEntity;
328dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis  StrAdapter SA(*this);
32921ee5707e6e59d982d2f2ae28e079c7ff46dc519Argyrios Kyrtzidis  const ObjCInterfaceDecl *IFaceD = D->getClassInterface();
33021ee5707e6e59d982d2f2ae28e079c7ff46dc519Argyrios Kyrtzidis  SourceLocation ClassLoc = D->getLocation();
331b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis  SourceLocation CategoryLoc = D->IsClassExtension() ? ClassLoc
332b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis                                                     : D->getCategoryNameLoc();
333c6b4a5099588fd21b49c80f730a596a64b2766c6Argyrios Kyrtzidis  getEntityInfo(IFaceD, ClassEntity, SA);
334dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis
3356ec43adc39006a7fce94188956d0239bd54c0363Argyrios Kyrtzidis  CatDInfo.ObjCCatDeclInfo.containerInfo = &CatDInfo.ObjCContDeclInfo;
336c6b4a5099588fd21b49c80f730a596a64b2766c6Argyrios Kyrtzidis  if (IFaceD) {
337c6b4a5099588fd21b49c80f730a596a64b2766c6Argyrios Kyrtzidis    CatDInfo.ObjCCatDeclInfo.objcClass = &ClassEntity;
338c6b4a5099588fd21b49c80f730a596a64b2766c6Argyrios Kyrtzidis    CatDInfo.ObjCCatDeclInfo.classCursor =
339c6b4a5099588fd21b49c80f730a596a64b2766c6Argyrios Kyrtzidis        MakeCursorObjCClassRef(IFaceD, ClassLoc, CXTU);
340c6b4a5099588fd21b49c80f730a596a64b2766c6Argyrios Kyrtzidis  } else {
341c6b4a5099588fd21b49c80f730a596a64b2766c6Argyrios Kyrtzidis    CatDInfo.ObjCCatDeclInfo.objcClass = 0;
342c6b4a5099588fd21b49c80f730a596a64b2766c6Argyrios Kyrtzidis    CatDInfo.ObjCCatDeclInfo.classCursor = clang_getNullCursor();
343c6b4a5099588fd21b49c80f730a596a64b2766c6Argyrios Kyrtzidis  }
34421ee5707e6e59d982d2f2ae28e079c7ff46dc519Argyrios Kyrtzidis  CatDInfo.ObjCCatDeclInfo.classLoc = getIndexLoc(ClassLoc);
345b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis  return handleObjCContainer(D, CategoryLoc, getCursor(D), CatDInfo);
346dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis}
347dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis
348b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidisbool IndexingContext::handleObjCCategoryImpl(const ObjCCategoryImplDecl *D) {
349dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis  const ObjCCategoryDecl *CatD = D->getCategoryDecl();
350c71d55469e7d5f7b376a30620617a175a9442da9Argyrios Kyrtzidis  ObjCCategoryDeclInfo CatDInfo(/*isImplementation=*/true);
3512957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis  EntityInfo ClassEntity;
352dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis  StrAdapter SA(*this);
3533e340a67f4522a2f633a719cb7f3389fe2474374Argyrios Kyrtzidis  const ObjCInterfaceDecl *IFaceD = CatD->getClassInterface();
3543e340a67f4522a2f633a719cb7f3389fe2474374Argyrios Kyrtzidis  SourceLocation ClassLoc = D->getLocation();
3553e340a67f4522a2f633a719cb7f3389fe2474374Argyrios Kyrtzidis  SourceLocation CategoryLoc = ClassLoc; //FIXME: D->getCategoryNameLoc();
3563e340a67f4522a2f633a719cb7f3389fe2474374Argyrios Kyrtzidis  getEntityInfo(IFaceD, ClassEntity, SA);
357dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis
3586ec43adc39006a7fce94188956d0239bd54c0363Argyrios Kyrtzidis  CatDInfo.ObjCCatDeclInfo.containerInfo = &CatDInfo.ObjCContDeclInfo;
3593e340a67f4522a2f633a719cb7f3389fe2474374Argyrios Kyrtzidis  if (IFaceD) {
3603e340a67f4522a2f633a719cb7f3389fe2474374Argyrios Kyrtzidis    CatDInfo.ObjCCatDeclInfo.objcClass = &ClassEntity;
3613e340a67f4522a2f633a719cb7f3389fe2474374Argyrios Kyrtzidis    CatDInfo.ObjCCatDeclInfo.classCursor =
3623e340a67f4522a2f633a719cb7f3389fe2474374Argyrios Kyrtzidis        MakeCursorObjCClassRef(IFaceD, ClassLoc, CXTU);
3633e340a67f4522a2f633a719cb7f3389fe2474374Argyrios Kyrtzidis  } else {
3643e340a67f4522a2f633a719cb7f3389fe2474374Argyrios Kyrtzidis    CatDInfo.ObjCCatDeclInfo.objcClass = 0;
3653e340a67f4522a2f633a719cb7f3389fe2474374Argyrios Kyrtzidis    CatDInfo.ObjCCatDeclInfo.classCursor = clang_getNullCursor();
3663e340a67f4522a2f633a719cb7f3389fe2474374Argyrios Kyrtzidis  }
3673e340a67f4522a2f633a719cb7f3389fe2474374Argyrios Kyrtzidis  CatDInfo.ObjCCatDeclInfo.classLoc = getIndexLoc(ClassLoc);
368b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis  return handleObjCContainer(D, CategoryLoc, getCursor(D), CatDInfo);
3694e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis}
3704e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis
371b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidisbool IndexingContext::handleObjCMethod(const ObjCMethodDecl *D) {
372c71d55469e7d5f7b376a30620617a175a9442da9Argyrios Kyrtzidis  DeclInfo DInfo(!D->isCanonicalDecl(), D->isThisDeclarationADefinition(),
373c71d55469e7d5f7b376a30620617a175a9442da9Argyrios Kyrtzidis                 D->isThisDeclarationADefinition());
374b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis  return handleDecl(D, D->getLocation(), getCursor(D), DInfo);
375b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis}
376b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis
377b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidisbool IndexingContext::handleSynthesizedObjCProperty(
378b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis                                                const ObjCPropertyImplDecl *D) {
379b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis  ObjCPropertyDecl *PD = D->getPropertyDecl();
380b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis  return handleReference(PD, D->getLocation(), getCursor(D), 0, D->getDeclContext());
3814e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis}
3824e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis
383b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidisbool IndexingContext::handleSynthesizedObjCMethod(const ObjCMethodDecl *D,
384b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis                                                  SourceLocation Loc) {
385b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis  DeclInfo DInfo(/*isRedeclaration=*/true, /*isDefinition=*/true,
386b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis                 /*isContainer=*/false);
387b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis  return handleDecl(D, Loc, getCursor(D), DInfo);
388b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis}
389b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis
390b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidisbool IndexingContext::handleObjCProperty(const ObjCPropertyDecl *D) {
391c71d55469e7d5f7b376a30620617a175a9442da9Argyrios Kyrtzidis  DeclInfo DInfo(/*isRedeclaration=*/false, /*isDefinition=*/false,
392c71d55469e7d5f7b376a30620617a175a9442da9Argyrios Kyrtzidis                 /*isContainer=*/false);
393b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis  return handleDecl(D, D->getLocation(), getCursor(D), DInfo);
3944e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis}
3954e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis
3962957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidisbool IndexingContext::handleClassTemplate(const ClassTemplateDecl *D) {
3972957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis  return handleCXXRecordDecl(D->getTemplatedDecl(), D);
3982957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis}
3992957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis
4002957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidisbool IndexingContext::handleFunctionTemplate(const FunctionTemplateDecl *D) {
4012957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis  DeclInfo DInfo(/*isRedeclaration=*/!D->isCanonicalDecl(),
4022957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis                 /*isDefinition=*/D->isThisDeclarationADefinition(),
4032957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis                 /*isContainer=*/D->isThisDeclarationADefinition());
4042957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis  return handleDecl(D, D->getLocation(), getCursor(D), DInfo);
4052957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis}
4062957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis
4072957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidisbool IndexingContext::handleTypeAliasTemplate(const TypeAliasTemplateDecl *D) {
4082957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis  DeclInfo DInfo(/*isRedeclaration=*/!D->isCanonicalDecl(),
4092957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis                 /*isDefinition=*/true, /*isContainer=*/false);
4102957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis  return handleDecl(D, D->getLocation(), getCursor(D), DInfo);
4112957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis}
4122957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis
413b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidisbool IndexingContext::handleReference(const NamedDecl *D, SourceLocation Loc,
4144e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis                                      const NamedDecl *Parent,
4154e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis                                      const DeclContext *DC,
416aca19be8731fc31cff68702de0dc7f30ce908979Argyrios Kyrtzidis                                      const Expr *E,
417aca19be8731fc31cff68702de0dc7f30ce908979Argyrios Kyrtzidis                                      CXIdxEntityRefKind Kind) {
418d6c8209fd1567db9c2721f441b50cb23cdf8d835Argyrios Kyrtzidis  if (!D)
419b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis    return false;
420b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis
421b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis  CXCursor Cursor = E ? MakeCXCursor(const_cast<Expr*>(E),
422b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis                                     const_cast<Decl*>(cast<Decl>(DC)), CXTU)
423b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis                      : getRefCursor(D, Loc);
424b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis  return handleReference(D, Loc, Cursor, Parent, DC, E, Kind);
425b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis}
426b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis
427b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidisbool IndexingContext::handleReference(const NamedDecl *D, SourceLocation Loc,
428b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis                                      CXCursor Cursor,
429b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis                                      const NamedDecl *Parent,
430b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis                                      const DeclContext *DC,
431b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis                                      const Expr *E,
432b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis                                      CXIdxEntityRefKind Kind) {
4332957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis  if (!CB.indexEntityReference)
434b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis    return false;
4352957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis
4362957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis  if (!D)
437b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis    return false;
4384e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis  if (Loc.isInvalid())
439b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis    return false;
4402957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis  if (D->getParentFunctionOrMethod())
441b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis    return false;
4424e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis  if (isNotFromSourceFile(D->getLocation()))
443b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis    return false;
4442957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis  if (D->isImplicit() && shouldIgnoreIfImplicit(D))
4452957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis    return false;
4462957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis
4472957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis  if (suppressRefs()) {
4482957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis    if (markEntityOccurrenceInFile(D, Loc))
4492957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis      return false; // already occurred.
4502957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis  }
451c6b4a5099588fd21b49c80f730a596a64b2766c6Argyrios Kyrtzidis
452144b6c0c50b5523609cbac523f168b9e3cb01175Argyrios Kyrtzidis  StrAdapter SA(*this);
4532957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis  EntityInfo RefEntity, ParentEntity;
454144b6c0c50b5523609cbac523f168b9e3cb01175Argyrios Kyrtzidis  getEntityInfo(D, RefEntity, SA);
455144b6c0c50b5523609cbac523f168b9e3cb01175Argyrios Kyrtzidis  if (!RefEntity.USR)
456b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis    return false;
457144b6c0c50b5523609cbac523f168b9e3cb01175Argyrios Kyrtzidis
458144b6c0c50b5523609cbac523f168b9e3cb01175Argyrios Kyrtzidis  getEntityInfo(Parent, ParentEntity, SA);
459144b6c0c50b5523609cbac523f168b9e3cb01175Argyrios Kyrtzidis
4602957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis  ContainerInfo Container;
4612957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis  getContainerInfo(DC, Container);
462c6b4a5099588fd21b49c80f730a596a64b2766c6Argyrios Kyrtzidis
463854625f7347e4418803fe4aa9131928408e4dc53Benjamin Kramer  CXIdxEntityRefInfo Info = { Cursor,
4644e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis                              getIndexLoc(Loc),
465dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis                              &RefEntity,
466c6b4a5099588fd21b49c80f730a596a64b2766c6Argyrios Kyrtzidis                              Parent ? &ParentEntity : 0,
4672957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis                              &Container,
468aca19be8731fc31cff68702de0dc7f30ce908979Argyrios Kyrtzidis                              Kind };
4694e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis  CB.indexEntityReference(ClientData, &Info);
470b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis  return true;
4714e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis}
4724e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis
4734e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidisbool IndexingContext::isNotFromSourceFile(SourceLocation Loc) const {
4744e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis  if (Loc.isInvalid())
4754e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis    return true;
4764e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis  SourceManager &SM = Ctx->getSourceManager();
4774e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis  SourceLocation FileLoc = SM.getFileLoc(Loc);
4784e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis  FileID FID = SM.getFileID(FileLoc);
4794e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis  return SM.getFileEntryForID(FID) == 0;
4804e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis}
4814e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis
4824e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidisvoid IndexingContext::addContainerInMap(const DeclContext *DC,
483dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis                                        CXIdxClientContainer container) {
4842957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis  if (!DC)
4852957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis    return;
4862957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis
4874e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis  assert(getScopedContext(DC) == DC);
4884e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis  ContainerMapTy::iterator I = ContainerMap.find(DC);
4894e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis  if (I == ContainerMap.end()) {
4904e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis    if (container)
4914e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis      ContainerMap[DC] = container;
4924e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis    return;
4934e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis  }
4944e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis  // Allow changing the container of a previously seen DeclContext so we
4954e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis  // can handle invalid user code, like a function re-definition.
4964e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis  if (container)
4974e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis    I->second = container;
4984e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis  else
4994e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis    ContainerMap.erase(I);
5004e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis}
5014e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis
5022957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios KyrtzidisCXIdxClientEntity IndexingContext::getClientEntity(const Decl *D) const {
5032957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis  if (!D)
5042957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis    return 0;
5052957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis  EntityMapTy::const_iterator I = EntityMap.find(D);
5062957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis  if (I == EntityMap.end())
5072957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis    return 0;
5082957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis  return I->second;
5092957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis}
5102957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis
5112957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidisvoid IndexingContext::setClientEntity(const Decl *D, CXIdxClientEntity client) {
5122957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis  if (!D)
5132957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis    return;
5142957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis  EntityMap[D] = client;
5152957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis}
5162957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis
5172957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidisbool IndexingContext::handleCXXRecordDecl(const CXXRecordDecl *RD,
5182957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis                                          const NamedDecl *OrigD) {
5192957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis  StrAdapter SA(*this);
5202957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis  CXXClassDeclInfo DInfo(/*isRedeclaration=*/!OrigD->isCanonicalDecl(),
5212957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis                         /*isDefinition=*/RD->isThisDeclarationADefinition());
5222957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis  CXXBasesListInfo BaseList(RD, *this, SA);
5232957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis  DInfo.CXXClassInfo.declInfo = &DInfo;
5242957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis  DInfo.CXXClassInfo.bases = BaseList.getBases();
5252957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis  DInfo.CXXClassInfo.numBases = BaseList.getNumBases();
5262957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis
5272957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis  return handleDecl(OrigD, OrigD->getLocation(), getCursor(OrigD), DInfo);
5282957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis}
5292957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis
530b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidisbool IndexingContext::markEntityOccurrenceInFile(const NamedDecl *D,
531b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis                                                 SourceLocation Loc) {
532b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis  SourceManager &SM = Ctx->getSourceManager();
533b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis  SourceLocation FileLoc = SM.getFileLoc(Loc);
534b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis  D = getEntityDecl(D);
535b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis
536b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis  std::pair<FileID, unsigned> LocInfo = SM.getDecomposedLoc(Loc);
537b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis  FileID FID = LocInfo.first;
538b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis  if (FID.isInvalid())
539b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis    return true;
540b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis
541b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis  const FileEntry *FE = SM.getFileEntryForID(FID);
542b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis  if (!FE)
543b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis    return true;
544b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis  RefFileOccurence RefOccur(FE, D);
545b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis  std::pair<llvm::DenseSet<RefFileOccurence>::iterator, bool>
546b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis  res = RefFileOccurences.insert(RefOccur);
547b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis  if (!res.second)
548b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis    return true; // already in map.
549b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis
550b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis  return false;
551b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis}
552b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis
5534e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidisconst NamedDecl *IndexingContext::getEntityDecl(const NamedDecl *D) const {
5544e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis  assert(D);
5554e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis  D = cast<NamedDecl>(D->getCanonicalDecl());
5564e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis
557b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis  if (const ObjCImplementationDecl *
5584e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis               ImplD = dyn_cast<ObjCImplementationDecl>(D)) {
5594e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis    return getEntityDecl(ImplD->getClassInterface());
5604e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis
5614e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis  } else if (const ObjCCategoryImplDecl *
5624e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis               CatImplD = dyn_cast<ObjCCategoryImplDecl>(D)) {
5634e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis    return getEntityDecl(CatImplD->getCategoryDecl());
5642957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis  } else if (const FunctionDecl *FD = dyn_cast<FunctionDecl>(D)) {
5652957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis    if (FunctionTemplateDecl *TemplD = FD->getDescribedFunctionTemplate())
5662957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis      return getEntityDecl(TemplD);
5672957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis  } else if (const CXXRecordDecl *RD = dyn_cast<CXXRecordDecl>(D)) {
5682957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis    if (ClassTemplateDecl *TemplD = RD->getDescribedClassTemplate())
5692957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis      return getEntityDecl(TemplD);
5704e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis  }
5714e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis
5724e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis  return D;
5734e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis}
5744e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis
5754e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidisconst DeclContext *
5762957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios KyrtzidisIndexingContext::getEntityContainer(const Decl *D) const {
5772957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis  const DeclContext *DC = dyn_cast<DeclContext>(D);
5782957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis  if (DC)
5792957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis    return DC;
5802957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis
5812957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis  if (const ClassTemplateDecl *ClassTempl = dyn_cast<ClassTemplateDecl>(D)) {
5822957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis    DC = ClassTempl->getTemplatedDecl();
5832957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis  } if (const FunctionTemplateDecl *
5842957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis          FuncTempl = dyn_cast<FunctionTemplateDecl>(D)) {
5852957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis    DC = FuncTempl->getTemplatedDecl();
5862957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis  }
5872957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis
5882957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis  return DC;
5892957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis}
5902957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis
5912957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidisconst DeclContext *
5924e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios KyrtzidisIndexingContext::getScopedContext(const DeclContext *DC) const {
5934e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis  // Local contexts are ignored for indexing.
5944e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis  const DeclContext *FuncCtx = cast<Decl>(DC)->getParentFunctionOrMethod();
5954e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis  if (FuncCtx)
5964e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis    return FuncCtx;
5974e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis
5984e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis  // We consider enums always scoped for indexing.
5994e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis  if (isa<TagDecl>(DC))
6004e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis    return DC;
6014e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis
6024e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis  if (const NamespaceDecl *NS = dyn_cast<NamespaceDecl>(DC)) {
6034e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis    if (NS->isAnonymousNamespace())
6044e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis      return getScopedContext(NS->getParent());
6054e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis    return NS;
6064e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis  }
6074e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis
6084e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis  return DC->getRedeclContext();
6094e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis}
6104e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis
611dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios KyrtzidisCXIdxClientContainer
6122957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios KyrtzidisIndexingContext::getClientContainerForDC(const DeclContext *DC) const {
6132957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis  if (!DC)
6142957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis    return 0;
6152957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis
6164e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis  DC = getScopedContext(DC);
6174e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis  ContainerMapTy::const_iterator I = ContainerMap.find(DC);
6183e340a67f4522a2f633a719cb7f3389fe2474374Argyrios Kyrtzidis  if (I == ContainerMap.end())
6193e340a67f4522a2f633a719cb7f3389fe2474374Argyrios Kyrtzidis    return 0;
6202957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis
6214e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis  return I->second;
6224e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis}
6234e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis
624dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios KyrtzidisCXIdxClientFile IndexingContext::getIndexFile(const FileEntry *File) {
6254e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis  if (!File)
6264e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis    return 0;
6274e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis
6284e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis  FileMapTy::iterator FI = FileMap.find(File);
6294e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis  if (FI != FileMap.end())
6304e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis    return FI->second;
6314e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis
632dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis  return 0;
6334e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis}
6344e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis
6354e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios KyrtzidisCXIdxLoc IndexingContext::getIndexLoc(SourceLocation Loc) const {
6364e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis  CXIdxLoc idxLoc =  { {0, 0}, 0 };
6374e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis  if (Loc.isInvalid())
6384e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis    return idxLoc;
6394e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis
6404e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis  idxLoc.ptr_data[0] = (void*)this;
6414e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis  idxLoc.int_data = Loc.getRawEncoding();
6424e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis  return idxLoc;
6434e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis}
6444e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis
6454e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidisvoid IndexingContext::translateLoc(SourceLocation Loc,
646dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis                                   CXIdxClientFile *indexFile, CXFile *file,
6474e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis                                   unsigned *line, unsigned *column,
6484e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis                                   unsigned *offset) {
6494e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis  if (Loc.isInvalid())
6504e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis    return;
6514e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis
6524e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis  SourceManager &SM = Ctx->getSourceManager();
6534e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis  Loc = SM.getFileLoc(Loc);
6544e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis
6554e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis  std::pair<FileID, unsigned> LocInfo = SM.getDecomposedLoc(Loc);
6564e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis  FileID FID = LocInfo.first;
6574e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis  unsigned FileOffset = LocInfo.second;
6584e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis
6594e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis  if (FID.isInvalid())
6604e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis    return;
6614e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis
6624e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis  const FileEntry *FE = SM.getFileEntryForID(FID);
6634e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis  if (indexFile)
6644e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis    *indexFile = getIndexFile(FE);
6654e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis  if (file)
6664e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis    *file = (void *)FE;
6674e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis  if (line)
6684e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis    *line = SM.getLineNumber(FID, FileOffset);
6694e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis  if (column)
6704e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis    *column = SM.getColumnNumber(FID, FileOffset);
6714e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis  if (offset)
6724e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis    *offset = FileOffset;
6734e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis}
6744e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis
675dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidisvoid IndexingContext::getEntityInfo(const NamedDecl *D,
6762957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis                                    EntityInfo &EntityInfo,
6772957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis                                    StrAdapter &SA) {
6782957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis  EntityInfo.name = EntityInfo.USR = 0;
679c6b4a5099588fd21b49c80f730a596a64b2766c6Argyrios Kyrtzidis  if (!D)
680c6b4a5099588fd21b49c80f730a596a64b2766c6Argyrios Kyrtzidis    return;
6812957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis
682dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis  D = getEntityDecl(D);
6832957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis  EntityInfo.cursor = getCursor(D);
6842957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis  EntityInfo.Dcl = D;
6852957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis  EntityInfo.IndexCtx = this;
686dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis  EntityInfo.kind = CXIdxEntity_Unexposed;
6872957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis  EntityInfo.templateKind = CXIdxEntity_NonTemplate;
688dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis
689dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis  if (const TagDecl *TD = dyn_cast<TagDecl>(D)) {
690dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis    switch (TD->getTagKind()) {
691dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis    case TTK_Struct:
692dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis      EntityInfo.kind = CXIdxEntity_Struct; break;
693dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis    case TTK_Union:
694dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis      EntityInfo.kind = CXIdxEntity_Union; break;
695dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis    case TTK_Class:
696dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis      EntityInfo.kind = CXIdxEntity_CXXClass; break;
697dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis    case TTK_Enum:
698dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis      EntityInfo.kind = CXIdxEntity_Enum; break;
699dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis    }
7004e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis
7012957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis    if (const CXXRecordDecl *CXXRec = dyn_cast<CXXRecordDecl>(D)) {
7022957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis      if (TD->getTagKind() == TTK_Struct && !CXXRec->isPOD())
7032957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis        EntityInfo.kind = CXIdxEntity_CXXClass;
7042957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis    }
7052957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis
7062957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis    if (isa<ClassTemplatePartialSpecializationDecl>(D)) {
7072957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis      EntityInfo.templateKind = CXIdxEntity_TemplatePartialSpecialization;
7082957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis    } else if (isa<ClassTemplateSpecializationDecl>(D)) {
7092957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis      EntityInfo.templateKind = CXIdxEntity_TemplateSpecialization;
7102957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis    }
7112957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis
712dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis  } else {
713dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis    switch (D->getKind()) {
714dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis    case Decl::Typedef:
715dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis      EntityInfo.kind = CXIdxEntity_Typedef; break;
716dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis    case Decl::Function:
7172957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis      EntityInfo.kind = CXIdxEntity_Function;
7182957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis      break;
719dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis    case Decl::Var:
7202957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis      EntityInfo.kind = CXIdxEntity_Variable;
7212957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis      if (isa<CXXRecordDecl>(D->getDeclContext()))
7222957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis        EntityInfo.kind = CXIdxEntity_CXXStaticVariable;
7232957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis      break;
724dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis    case Decl::Field:
725dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis      EntityInfo.kind = CXIdxEntity_Field; break;
726dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis    case Decl::EnumConstant:
727dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis      EntityInfo.kind = CXIdxEntity_EnumConstant; break;
728dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis    case Decl::ObjCInterface:
729dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis      EntityInfo.kind = CXIdxEntity_ObjCClass; break;
730dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis    case Decl::ObjCProtocol:
731dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis      EntityInfo.kind = CXIdxEntity_ObjCProtocol; break;
732dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis    case Decl::ObjCCategory:
733dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis      EntityInfo.kind = CXIdxEntity_ObjCCategory; break;
734dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis    case Decl::ObjCMethod:
735c71d55469e7d5f7b376a30620617a175a9442da9Argyrios Kyrtzidis      if (cast<ObjCMethodDecl>(D)->isInstanceMethod())
736c71d55469e7d5f7b376a30620617a175a9442da9Argyrios Kyrtzidis        EntityInfo.kind = CXIdxEntity_ObjCInstanceMethod;
737c71d55469e7d5f7b376a30620617a175a9442da9Argyrios Kyrtzidis      else
738c71d55469e7d5f7b376a30620617a175a9442da9Argyrios Kyrtzidis        EntityInfo.kind = CXIdxEntity_ObjCClassMethod;
739c71d55469e7d5f7b376a30620617a175a9442da9Argyrios Kyrtzidis      break;
740dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis    case Decl::ObjCProperty:
741dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis      EntityInfo.kind = CXIdxEntity_ObjCProperty; break;
742dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis    case Decl::ObjCIvar:
743dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis      EntityInfo.kind = CXIdxEntity_ObjCIvar; break;
7442957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis    case Decl::Namespace:
7452957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis      EntityInfo.kind = CXIdxEntity_CXXNamespace; break;
7462957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis    case Decl::NamespaceAlias:
7472957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis      EntityInfo.kind = CXIdxEntity_CXXNamespaceAlias; break;
7482957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis    case Decl::CXXConstructor:
7492957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis      EntityInfo.kind = CXIdxEntity_CXXConstructor; break;
7502957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis    case Decl::CXXDestructor:
7512957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis      EntityInfo.kind = CXIdxEntity_CXXDestructor; break;
7522957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis    case Decl::CXXConversion:
7532957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis      EntityInfo.kind = CXIdxEntity_CXXConversionFunction; break;
7542957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis    case Decl::CXXMethod: {
7552957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis      const CXXMethodDecl *MD = cast<CXXMethodDecl>(D);
7562957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis      if (MD->isStatic())
7572957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis        EntityInfo.kind = CXIdxEntity_CXXStaticMethod;
7582957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis      else
7592957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis        EntityInfo.kind = CXIdxEntity_CXXInstanceMethod;
7602957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis      break;
7612957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis    }
7622957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis    case Decl::ClassTemplate:
7632957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis      EntityInfo.kind = CXIdxEntity_CXXClass;
7642957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis      EntityInfo.templateKind = CXIdxEntity_Template;
7652957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis      break;
7662957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis    case Decl::FunctionTemplate:
7672957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis      EntityInfo.kind = CXIdxEntity_Function;
7682957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis      EntityInfo.templateKind = CXIdxEntity_Template;
7692957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis      if (const CXXMethodDecl *MD = dyn_cast_or_null<CXXMethodDecl>(
7702957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis                           cast<FunctionTemplateDecl>(D)->getTemplatedDecl())) {
7712957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis        if (isa<CXXConstructorDecl>(MD))
7722957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis          EntityInfo.kind = CXIdxEntity_CXXConstructor;
7732957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis        else if (isa<CXXDestructorDecl>(MD))
7742957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis          EntityInfo.kind = CXIdxEntity_CXXDestructor;
7752957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis        else if (isa<CXXConversionDecl>(MD))
7762957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis          EntityInfo.kind = CXIdxEntity_CXXConversionFunction;
7772957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis        else {
7782957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis          if (MD->isStatic())
7792957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis            EntityInfo.kind = CXIdxEntity_CXXStaticMethod;
7802957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis          else
7812957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis            EntityInfo.kind = CXIdxEntity_CXXInstanceMethod;
7822957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis        }
7832957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis      }
7842957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis      break;
7852957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis    case Decl::TypeAliasTemplate:
7862957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis      EntityInfo.kind = CXIdxEntity_CXXTypeAlias;
7872957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis      EntityInfo.templateKind = CXIdxEntity_Template;
7882957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis      break;
7892957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis    case Decl::TypeAlias:
7902957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis      EntityInfo.kind = CXIdxEntity_CXXTypeAlias; break;
791dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis    default:
792dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis      break;
793dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis    }
794dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis  }
7954e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis
7962957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis  if (EntityInfo.kind == CXIdxEntity_Unexposed)
7972957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis    return;
7982957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis
7992957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis  if (const FunctionDecl *FD = dyn_cast<FunctionDecl>(D)) {
8002957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis    if (FD->getTemplatedKind() ==
8012957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis          FunctionDecl::TK_FunctionTemplateSpecialization)
8022957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis      EntityInfo.templateKind = CXIdxEntity_TemplateSpecialization;
8032957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis  }
8042957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis
8054e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis  if (IdentifierInfo *II = D->getIdentifier()) {
8064e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis    EntityInfo.name = SA.toCStr(II->getName());
8074e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis
8084e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis  } else if (isa<RecordDecl>(D) || isa<NamespaceDecl>(D)) {
809dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis    EntityInfo.name = 0; // anonymous record/namespace.
8104e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis
8114e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis  } else {
8124e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis    unsigned Begin = SA.getCurSize();
8134e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis    {
8144e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis      llvm::raw_svector_ostream OS(SA.getBuffer());
8154e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis      D->printName(OS);
8164e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis    }
8174e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis    EntityInfo.name = SA.getCStr(Begin);
8184e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis  }
8194e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis
820dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis  {
821dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis    unsigned Begin = SA.getCurSize();
822dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis    bool Ignore = getDeclCursorUSR(D, SA.getBuffer());
823dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis    if (Ignore) {
824144b6c0c50b5523609cbac523f168b9e3cb01175Argyrios Kyrtzidis      EntityInfo.USR = 0;
825dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis    } else {
826dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis      EntityInfo.USR = SA.getCStr(Begin);
827dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis    }
8284e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis  }
8294e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis}
8304e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis
8312957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidisvoid IndexingContext::getContainerInfo(const DeclContext *DC,
8322957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis                                       ContainerInfo &ContInfo) {
8332957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis  ContInfo.cursor = getCursor(cast<Decl>(DC));
8342957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis  ContInfo.DC = DC;
8352957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis  ContInfo.IndexCtx = this;
8362957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis}
8372957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis
8384e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios KyrtzidisCXCursor IndexingContext::getRefCursor(const NamedDecl *D, SourceLocation Loc) {
8394e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis  if (const TypeDecl *TD = dyn_cast<TypeDecl>(D))
8404e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis    return MakeCursorTypeRef(TD, Loc, CXTU);
8414e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis  if (const ObjCInterfaceDecl *ID = dyn_cast<ObjCInterfaceDecl>(D))
8424e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis    return MakeCursorObjCClassRef(ID, Loc, CXTU);
8434e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis  if (const ObjCProtocolDecl *PD = dyn_cast<ObjCProtocolDecl>(D))
8444e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis    return MakeCursorObjCProtocolRef(PD, Loc, CXTU);
845b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis  if (const TemplateDecl *Template = dyn_cast<TemplateDecl>(D))
846b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis    return MakeCursorTemplateRef(Template, Loc, CXTU);
847b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis  if (const NamespaceDecl *Namespace = dyn_cast<NamespaceDecl>(D))
848b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis    return MakeCursorNamespaceRef(Namespace, Loc, CXTU);
849b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis  if (const NamespaceAliasDecl *Namespace = dyn_cast<NamespaceAliasDecl>(D))
850b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis    return MakeCursorNamespaceRef(Namespace, Loc, CXTU);
851b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis  if (const FieldDecl *Field = dyn_cast<FieldDecl>(D))
852b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis    return MakeCursorMemberRef(Field, Loc, CXTU);
853b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis
8544e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis  return clang_getNullCursor();
8554e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis}
8562957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis
8572957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidisbool IndexingContext::shouldIgnoreIfImplicit(const NamedDecl *D) {
8582957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis  if (isa<ObjCIvarDecl>(D))
8592957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis    return false;
8602957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis  if (isa<ObjCMethodDecl>(D))
8612957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis    return false;
8622957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis  return true;
8632957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis}
864