IndexingContext.cpp revision b1febb646bf7a2f319ad894c9833968c52d21711
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());
10237f40572c4c78a8c57a7b45266f8b86db172a7c1Argyrios Kyrtzidis    const NamedDecl *BaseD = 0;
103b526a871af40b84d9878eded54a181bf4003b376Argyrios Kyrtzidis    QualType T = Base.getType();
104b526a871af40b84d9878eded54a181bf4003b376Argyrios Kyrtzidis    SourceLocation Loc = getBaseLoc(Base);
105b526a871af40b84d9878eded54a181bf4003b376Argyrios Kyrtzidis
106b526a871af40b84d9878eded54a181bf4003b376Argyrios Kyrtzidis    if (const TypedefType *TDT = T->getAs<TypedefType>()) {
10737f40572c4c78a8c57a7b45266f8b86db172a7c1Argyrios Kyrtzidis      BaseD = TDT->getDecl();
108b526a871af40b84d9878eded54a181bf4003b376Argyrios Kyrtzidis    } else if (const TemplateSpecializationType *
109b526a871af40b84d9878eded54a181bf4003b376Argyrios Kyrtzidis          TST = T->getAs<TemplateSpecializationType>()) {
110b526a871af40b84d9878eded54a181bf4003b376Argyrios Kyrtzidis      BaseD = TST->getTemplateName().getAsTemplateDecl();
111b526a871af40b84d9878eded54a181bf4003b376Argyrios Kyrtzidis    } else if (const RecordType *RT = T->getAs<RecordType>()) {
112b526a871af40b84d9878eded54a181bf4003b376Argyrios Kyrtzidis      BaseD = RT->getDecl();
113b526a871af40b84d9878eded54a181bf4003b376Argyrios Kyrtzidis    }
114b526a871af40b84d9878eded54a181bf4003b376Argyrios Kyrtzidis
11537f40572c4c78a8c57a7b45266f8b86db172a7c1Argyrios Kyrtzidis    if (BaseD)
11637f40572c4c78a8c57a7b45266f8b86db172a7c1Argyrios Kyrtzidis      IdxCtx.getEntityInfo(BaseD, BaseEntities.back(), SA);
1172957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis    CXIdxBaseClassInfo BaseInfo = { 0,
1182957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis                         MakeCursorCXXBaseSpecifier(&Base, IdxCtx.CXTU),
119b526a871af40b84d9878eded54a181bf4003b376Argyrios Kyrtzidis                         IdxCtx.getIndexLoc(Loc) };
1202957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis    BaseInfos.push_back(BaseInfo);
1212957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis  }
1222957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis
1232957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis  for (unsigned i = 0, e = BaseInfos.size(); i != e; ++i) {
12437f40572c4c78a8c57a7b45266f8b86db172a7c1Argyrios Kyrtzidis    if (BaseEntities[i].name && BaseEntities[i].USR)
1252957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis      BaseInfos[i].base = &BaseEntities[i];
1262957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis  }
1272957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis
1282957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis  for (unsigned i = 0, e = BaseInfos.size(); i != e; ++i)
1292957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis    CXBases.push_back(&BaseInfos[i]);
1302957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis}
1312957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis
132b526a871af40b84d9878eded54a181bf4003b376Argyrios KyrtzidisSourceLocation IndexingContext::CXXBasesListInfo::getBaseLoc(
133b526a871af40b84d9878eded54a181bf4003b376Argyrios Kyrtzidis                                           const CXXBaseSpecifier &Base) const {
134b526a871af40b84d9878eded54a181bf4003b376Argyrios Kyrtzidis  SourceLocation Loc = Base.getSourceRange().getBegin();
135b526a871af40b84d9878eded54a181bf4003b376Argyrios Kyrtzidis  TypeLoc TL;
136b526a871af40b84d9878eded54a181bf4003b376Argyrios Kyrtzidis  if (Base.getTypeSourceInfo())
137b526a871af40b84d9878eded54a181bf4003b376Argyrios Kyrtzidis    TL = Base.getTypeSourceInfo()->getTypeLoc();
138b526a871af40b84d9878eded54a181bf4003b376Argyrios Kyrtzidis  if (TL.isNull())
139b526a871af40b84d9878eded54a181bf4003b376Argyrios Kyrtzidis    return Loc;
140b526a871af40b84d9878eded54a181bf4003b376Argyrios Kyrtzidis
141b526a871af40b84d9878eded54a181bf4003b376Argyrios Kyrtzidis  if (const QualifiedTypeLoc *QL = dyn_cast<QualifiedTypeLoc>(&TL))
142b526a871af40b84d9878eded54a181bf4003b376Argyrios Kyrtzidis    TL = QL->getUnqualifiedLoc();
143b526a871af40b84d9878eded54a181bf4003b376Argyrios Kyrtzidis
144b526a871af40b84d9878eded54a181bf4003b376Argyrios Kyrtzidis  if (const ElaboratedTypeLoc *EL = dyn_cast<ElaboratedTypeLoc>(&TL))
145b526a871af40b84d9878eded54a181bf4003b376Argyrios Kyrtzidis    return EL->getNamedTypeLoc().getBeginLoc();
146b526a871af40b84d9878eded54a181bf4003b376Argyrios Kyrtzidis  if (const DependentNameTypeLoc *DL = dyn_cast<DependentNameTypeLoc>(&TL))
147b526a871af40b84d9878eded54a181bf4003b376Argyrios Kyrtzidis    return DL->getNameLoc();
148b526a871af40b84d9878eded54a181bf4003b376Argyrios Kyrtzidis  if (const DependentTemplateSpecializationTypeLoc *
149b526a871af40b84d9878eded54a181bf4003b376Argyrios Kyrtzidis        DTL = dyn_cast<DependentTemplateSpecializationTypeLoc>(&TL))
150b526a871af40b84d9878eded54a181bf4003b376Argyrios Kyrtzidis    return DTL->getNameLoc();
151b526a871af40b84d9878eded54a181bf4003b376Argyrios Kyrtzidis
152b526a871af40b84d9878eded54a181bf4003b376Argyrios Kyrtzidis  return Loc;
153b526a871af40b84d9878eded54a181bf4003b376Argyrios Kyrtzidis}
154b526a871af40b84d9878eded54a181bf4003b376Argyrios Kyrtzidis
1554e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidisconst char *IndexingContext::StrAdapter::toCStr(StringRef Str) {
1564e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis  if (Str.empty())
1574e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis    return "";
1584e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis  if (Str.data()[Str.size()] == '\0')
1594e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis    return Str.data();
16037f40572c4c78a8c57a7b45266f8b86db172a7c1Argyrios Kyrtzidis  return copyCStr(Str);
16137f40572c4c78a8c57a7b45266f8b86db172a7c1Argyrios Kyrtzidis}
16237f40572c4c78a8c57a7b45266f8b86db172a7c1Argyrios Kyrtzidis
16337f40572c4c78a8c57a7b45266f8b86db172a7c1Argyrios Kyrtzidisconst char *IndexingContext::StrAdapter::copyCStr(StringRef Str) {
16437f40572c4c78a8c57a7b45266f8b86db172a7c1Argyrios Kyrtzidis  char *buf = IdxCtx.StrScratch.Allocate<char>(Str.size() + 1);
16537f40572c4c78a8c57a7b45266f8b86db172a7c1Argyrios Kyrtzidis  std::uninitialized_copy(Str.begin(), Str.end(), buf);
16637f40572c4c78a8c57a7b45266f8b86db172a7c1Argyrios Kyrtzidis  buf[Str.size()] = '\0';
16737f40572c4c78a8c57a7b45266f8b86db172a7c1Argyrios Kyrtzidis  return buf;
1684e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis}
1694e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis
1704e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidisvoid IndexingContext::setASTContext(ASTContext &ctx) {
1714e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis  Ctx = &ctx;
1724e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis  static_cast<ASTUnit*>(CXTU->TUData)->setASTContext(&ctx);
1734e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis}
1744e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis
175b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidisbool IndexingContext::shouldAbort() {
176b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis  if (!CB.abortQuery)
177b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis    return false;
178b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis  return CB.abortQuery(ClientData, 0);
179b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis}
180b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis
181dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidisvoid IndexingContext::enteredMainFile(const FileEntry *File) {
182dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis  if (File && CB.enteredMainFile) {
183dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis    CXIdxClientFile idxFile = CB.enteredMainFile(ClientData, (CXFile)File, 0);
184dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis    FileMap[File] = idxFile;
185dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis  }
186dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis}
187dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis
1884e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidisvoid IndexingContext::ppIncludedFile(SourceLocation hashLoc,
1894e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis                                     StringRef filename,
1904e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis                                     const FileEntry *File,
1914e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis                                     bool isImport, bool isAngled) {
1924e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis  if (!CB.ppIncludedFile)
1934e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis    return;
1944e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis
195dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis  StrAdapter SA(*this);
1964e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis  CXIdxIncludedFileInfo Info = { getIndexLoc(hashLoc),
1974e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis                                 SA.toCStr(filename),
198dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis                                 (CXFile)File,
1994e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis                                 isImport, isAngled };
200dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis  CXIdxClientFile idxFile = CB.ppIncludedFile(ClientData, &Info);
201dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis  FileMap[File] = idxFile;
2024e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis}
2034e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis
2046ec43adc39006a7fce94188956d0239bd54c0363Argyrios Kyrtzidisvoid IndexingContext::startedTranslationUnit() {
205dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis  CXIdxClientContainer idxCont = 0;
2064e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis  if (CB.startedTranslationUnit)
2074e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis    idxCont = CB.startedTranslationUnit(ClientData, 0);
2084e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis  addContainerInMap(Ctx->getTranslationUnitDecl(), idxCont);
2094e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis}
2104e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis
211b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidisvoid IndexingContext::handleDiagnosticSet(CXDiagnostic CXDiagSet) {
2124e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis  if (!CB.diagnostic)
2134e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis    return;
2144e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis
215b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis  CB.diagnostic(ClientData, CXDiagSet, 0);
2164e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis}
2174e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis
218b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidisbool IndexingContext::handleDecl(const NamedDecl *D,
219dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis                                 SourceLocation Loc, CXCursor Cursor,
220dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis                                 DeclInfo &DInfo) {
221144b6c0c50b5523609cbac523f168b9e3cb01175Argyrios Kyrtzidis  if (!CB.indexDeclaration || !D)
222b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis    return false;
2232957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis  if (D->isImplicit() && shouldIgnoreIfImplicit(D))
2242957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis    return false;
2254e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis
226dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis  StrAdapter SA(*this);
2272957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis  getEntityInfo(D, DInfo.EntInfo, SA);
2282957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis  if (!DInfo.EntInfo.USR || Loc.isInvalid())
229b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis    return false;
230144b6c0c50b5523609cbac523f168b9e3cb01175Argyrios Kyrtzidis
231b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis  markEntityOccurrenceInFile(D, Loc);
232b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis
2332957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis  DInfo.entityInfo = &DInfo.EntInfo;
234dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis  DInfo.cursor = Cursor;
235dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis  DInfo.loc = getIndexLoc(Loc);
236c71d55469e7d5f7b376a30620617a175a9442da9Argyrios Kyrtzidis  DInfo.isImplicit = D->isImplicit();
237dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis
238b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis  AttrListInfo AttrList(D, *this, SA);
239b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis  DInfo.attributes = AttrList.getAttrs();
240b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis  DInfo.numAttributes = AttrList.getNumAttrs();
241b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis
242b1febb646bf7a2f319ad894c9833968c52d21711Argyrios Kyrtzidis  getContainerInfo(D->getDeclContext(), DInfo.SemanticContainer);
243b1febb646bf7a2f319ad894c9833968c52d21711Argyrios Kyrtzidis  getContainerInfo(D->getLexicalDeclContext(), DInfo.LexicalContainer);
244b1febb646bf7a2f319ad894c9833968c52d21711Argyrios Kyrtzidis  DInfo.semanticContainer = &DInfo.SemanticContainer;
245b1febb646bf7a2f319ad894c9833968c52d21711Argyrios Kyrtzidis  DInfo.lexicalContainer = &DInfo.LexicalContainer;
2462957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis  if (DInfo.isContainer) {
2472957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis    getContainerInfo(getEntityContainer(D), DInfo.DeclAsContainer);
2482957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis    DInfo.declAsContainer = &DInfo.DeclAsContainer;
2492957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis  }
250b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis
2512957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis  CB.indexDeclaration(ClientData, &DInfo);
252b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis  return true;
253dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis}
254dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis
255b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidisbool IndexingContext::handleObjCContainer(const ObjCContainerDecl *D,
256dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis                                          SourceLocation Loc, CXCursor Cursor,
257dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis                                          ObjCContainerDeclInfo &ContDInfo) {
2586ec43adc39006a7fce94188956d0239bd54c0363Argyrios Kyrtzidis  ContDInfo.ObjCContDeclInfo.declInfo = &ContDInfo;
259b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis  return handleDecl(D, Loc, Cursor, ContDInfo);
2604e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis}
2614e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis
262b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidisbool IndexingContext::handleFunction(const FunctionDecl *D) {
263c71d55469e7d5f7b376a30620617a175a9442da9Argyrios Kyrtzidis  DeclInfo DInfo(!D->isFirstDeclaration(), D->isThisDeclarationADefinition(),
264c71d55469e7d5f7b376a30620617a175a9442da9Argyrios Kyrtzidis                 D->isThisDeclarationADefinition());
265b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis  return handleDecl(D, D->getLocation(), getCursor(D), DInfo);
266dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis}
2674e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis
268b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidisbool IndexingContext::handleVar(const VarDecl *D) {
269c71d55469e7d5f7b376a30620617a175a9442da9Argyrios Kyrtzidis  DeclInfo DInfo(!D->isFirstDeclaration(), D->isThisDeclarationADefinition(),
270c71d55469e7d5f7b376a30620617a175a9442da9Argyrios Kyrtzidis                 /*isContainer=*/false);
271b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis  return handleDecl(D, D->getLocation(), getCursor(D), DInfo);
2724e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis}
2734e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis
274b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidisbool IndexingContext::handleField(const FieldDecl *D) {
275c71d55469e7d5f7b376a30620617a175a9442da9Argyrios Kyrtzidis  DeclInfo DInfo(/*isRedeclaration=*/false, /*isDefinition=*/true,
276c71d55469e7d5f7b376a30620617a175a9442da9Argyrios Kyrtzidis                 /*isContainer=*/false);
277b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis  return handleDecl(D, D->getLocation(), getCursor(D), DInfo);
2784e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis}
2794e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis
280b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidisbool IndexingContext::handleEnumerator(const EnumConstantDecl *D) {
281c71d55469e7d5f7b376a30620617a175a9442da9Argyrios Kyrtzidis  DeclInfo DInfo(/*isRedeclaration=*/false, /*isDefinition=*/true,
282c71d55469e7d5f7b376a30620617a175a9442da9Argyrios Kyrtzidis                 /*isContainer=*/false);
283b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis  return handleDecl(D, D->getLocation(), getCursor(D), DInfo);
2844e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis}
2854e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis
286b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidisbool IndexingContext::handleTagDecl(const TagDecl *D) {
2872957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis  if (const CXXRecordDecl *CXXRD = dyn_cast<CXXRecordDecl>(D))
2882957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis    return handleCXXRecordDecl(CXXRD, D);
2892957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis
290c71d55469e7d5f7b376a30620617a175a9442da9Argyrios Kyrtzidis  DeclInfo DInfo(!D->isFirstDeclaration(), D->isThisDeclarationADefinition(),
291c71d55469e7d5f7b376a30620617a175a9442da9Argyrios Kyrtzidis                 D->isThisDeclarationADefinition());
292b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis  return handleDecl(D, D->getLocation(), getCursor(D), DInfo);
2934e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis}
2944e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis
2952957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidisbool IndexingContext::handleTypedefName(const TypedefNameDecl *D) {
296c71d55469e7d5f7b376a30620617a175a9442da9Argyrios Kyrtzidis  DeclInfo DInfo(!D->isFirstDeclaration(), /*isDefinition=*/true,
297c71d55469e7d5f7b376a30620617a175a9442da9Argyrios Kyrtzidis                 /*isContainer=*/false);
298b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis  return handleDecl(D, D->getLocation(), getCursor(D), DInfo);
299dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis}
3004e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis
301b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidisbool IndexingContext::handleObjCClass(const ObjCClassDecl *D) {
302dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis  const ObjCClassDecl::ObjCClassRef *Ref = D->getForwardDecl();
303dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis  ObjCInterfaceDecl *IFaceD = Ref->getInterface();
304dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis  SourceLocation Loc = Ref->getLocation();
305dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis  bool isRedeclaration = IFaceD->getLocation() != Loc;
306c71d55469e7d5f7b376a30620617a175a9442da9Argyrios Kyrtzidis
307c71d55469e7d5f7b376a30620617a175a9442da9Argyrios Kyrtzidis  ObjCContainerDeclInfo ContDInfo(/*isForwardRef=*/true, isRedeclaration,
308c71d55469e7d5f7b376a30620617a175a9442da9Argyrios Kyrtzidis                                  /*isImplementation=*/false);
309b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis  return handleObjCContainer(IFaceD, Loc,
310b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis                          MakeCursorObjCClassRef(IFaceD, Loc, CXTU), ContDInfo);
3114e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis}
3124e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis
313b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidisbool IndexingContext::handleObjCInterface(const ObjCInterfaceDecl *D) {
3146ec43adc39006a7fce94188956d0239bd54c0363Argyrios Kyrtzidis  StrAdapter SA(*this);
3156ec43adc39006a7fce94188956d0239bd54c0363Argyrios Kyrtzidis
3166ec43adc39006a7fce94188956d0239bd54c0363Argyrios Kyrtzidis  CXIdxBaseClassInfo BaseClass;
3172957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis  EntityInfo BaseEntity;
3186ec43adc39006a7fce94188956d0239bd54c0363Argyrios Kyrtzidis  BaseClass.cursor = clang_getNullCursor();
3196ec43adc39006a7fce94188956d0239bd54c0363Argyrios Kyrtzidis  if (ObjCInterfaceDecl *SuperD = D->getSuperClass()) {
3206ec43adc39006a7fce94188956d0239bd54c0363Argyrios Kyrtzidis    getEntityInfo(SuperD, BaseEntity, SA);
3216ec43adc39006a7fce94188956d0239bd54c0363Argyrios Kyrtzidis    SourceLocation SuperLoc = D->getSuperClassLoc();
3226ec43adc39006a7fce94188956d0239bd54c0363Argyrios Kyrtzidis    BaseClass.base = &BaseEntity;
3236ec43adc39006a7fce94188956d0239bd54c0363Argyrios Kyrtzidis    BaseClass.cursor = MakeCursorObjCSuperClassRef(SuperD, SuperLoc, CXTU);
3246ec43adc39006a7fce94188956d0239bd54c0363Argyrios Kyrtzidis    BaseClass.loc = getIndexLoc(SuperLoc);
3256ec43adc39006a7fce94188956d0239bd54c0363Argyrios Kyrtzidis  }
3266ec43adc39006a7fce94188956d0239bd54c0363Argyrios Kyrtzidis
3276ec43adc39006a7fce94188956d0239bd54c0363Argyrios Kyrtzidis  ObjCProtocolListInfo ProtInfo(D->getReferencedProtocols(), *this, SA);
3286ec43adc39006a7fce94188956d0239bd54c0363Argyrios Kyrtzidis
329c71d55469e7d5f7b376a30620617a175a9442da9Argyrios Kyrtzidis  ObjCInterfaceDeclInfo InterInfo(D);
330c71d55469e7d5f7b376a30620617a175a9442da9Argyrios Kyrtzidis  InterInfo.ObjCProtoListInfo = ProtInfo.getListInfo();
331c71d55469e7d5f7b376a30620617a175a9442da9Argyrios Kyrtzidis  InterInfo.ObjCInterDeclInfo.containerInfo = &InterInfo.ObjCContDeclInfo;
3326ec43adc39006a7fce94188956d0239bd54c0363Argyrios Kyrtzidis  InterInfo.ObjCInterDeclInfo.superInfo = D->getSuperClass() ? &BaseClass : 0;
333c71d55469e7d5f7b376a30620617a175a9442da9Argyrios Kyrtzidis  InterInfo.ObjCInterDeclInfo.protocols = &InterInfo.ObjCProtoListInfo;
3346ec43adc39006a7fce94188956d0239bd54c0363Argyrios Kyrtzidis
335b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis  return handleObjCContainer(D, D->getLocation(), getCursor(D), InterInfo);
336dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis}
3374e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis
338b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidisbool IndexingContext::handleObjCImplementation(
339dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis                                              const ObjCImplementationDecl *D) {
340c71d55469e7d5f7b376a30620617a175a9442da9Argyrios Kyrtzidis  ObjCContainerDeclInfo ContDInfo(/*isForwardRef=*/false,
341e7bbab91f5cc899104d0a1dee6059d8413c70eebArgyrios Kyrtzidis                      /*isRedeclaration=*/true,
342c71d55469e7d5f7b376a30620617a175a9442da9Argyrios Kyrtzidis                      /*isImplementation=*/true);
343b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis  return handleObjCContainer(D, D->getLocation(), getCursor(D), ContDInfo);
344dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis}
3454e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis
346b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidisbool IndexingContext::handleObjCForwardProtocol(const ObjCProtocolDecl *D,
347dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis                                                SourceLocation Loc,
348dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis                                                bool isRedeclaration) {
349c71d55469e7d5f7b376a30620617a175a9442da9Argyrios Kyrtzidis  ObjCContainerDeclInfo ContDInfo(/*isForwardRef=*/true,
350c71d55469e7d5f7b376a30620617a175a9442da9Argyrios Kyrtzidis                                  isRedeclaration,
351c71d55469e7d5f7b376a30620617a175a9442da9Argyrios Kyrtzidis                                  /*isImplementation=*/false);
352b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis  return handleObjCContainer(D, Loc, MakeCursorObjCProtocolRef(D, Loc, CXTU),
353b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis                             ContDInfo);
354dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis}
3554e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis
356b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidisbool IndexingContext::handleObjCProtocol(const ObjCProtocolDecl *D) {
357dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis  StrAdapter SA(*this);
3586ec43adc39006a7fce94188956d0239bd54c0363Argyrios Kyrtzidis  ObjCProtocolListInfo ProtListInfo(D->getReferencedProtocols(), *this, SA);
359dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis
360c71d55469e7d5f7b376a30620617a175a9442da9Argyrios Kyrtzidis  ObjCProtocolDeclInfo ProtInfo(D);
361c71d55469e7d5f7b376a30620617a175a9442da9Argyrios Kyrtzidis  ProtInfo.ObjCProtoRefListInfo = ProtListInfo.getListInfo();
3624e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis
363b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis  return handleObjCContainer(D, D->getLocation(), getCursor(D), ProtInfo);
3644e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis}
3654e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis
366b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidisbool IndexingContext::handleObjCCategory(const ObjCCategoryDecl *D) {
367c71d55469e7d5f7b376a30620617a175a9442da9Argyrios Kyrtzidis  ObjCCategoryDeclInfo CatDInfo(/*isImplementation=*/false);
3682957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis  EntityInfo ClassEntity;
369dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis  StrAdapter SA(*this);
37021ee5707e6e59d982d2f2ae28e079c7ff46dc519Argyrios Kyrtzidis  const ObjCInterfaceDecl *IFaceD = D->getClassInterface();
37121ee5707e6e59d982d2f2ae28e079c7ff46dc519Argyrios Kyrtzidis  SourceLocation ClassLoc = D->getLocation();
372b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis  SourceLocation CategoryLoc = D->IsClassExtension() ? ClassLoc
373b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis                                                     : D->getCategoryNameLoc();
374c6b4a5099588fd21b49c80f730a596a64b2766c6Argyrios Kyrtzidis  getEntityInfo(IFaceD, ClassEntity, SA);
375dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis
3766ec43adc39006a7fce94188956d0239bd54c0363Argyrios Kyrtzidis  CatDInfo.ObjCCatDeclInfo.containerInfo = &CatDInfo.ObjCContDeclInfo;
377c6b4a5099588fd21b49c80f730a596a64b2766c6Argyrios Kyrtzidis  if (IFaceD) {
378c6b4a5099588fd21b49c80f730a596a64b2766c6Argyrios Kyrtzidis    CatDInfo.ObjCCatDeclInfo.objcClass = &ClassEntity;
379c6b4a5099588fd21b49c80f730a596a64b2766c6Argyrios Kyrtzidis    CatDInfo.ObjCCatDeclInfo.classCursor =
380c6b4a5099588fd21b49c80f730a596a64b2766c6Argyrios Kyrtzidis        MakeCursorObjCClassRef(IFaceD, ClassLoc, CXTU);
381c6b4a5099588fd21b49c80f730a596a64b2766c6Argyrios Kyrtzidis  } else {
382c6b4a5099588fd21b49c80f730a596a64b2766c6Argyrios Kyrtzidis    CatDInfo.ObjCCatDeclInfo.objcClass = 0;
383c6b4a5099588fd21b49c80f730a596a64b2766c6Argyrios Kyrtzidis    CatDInfo.ObjCCatDeclInfo.classCursor = clang_getNullCursor();
384c6b4a5099588fd21b49c80f730a596a64b2766c6Argyrios Kyrtzidis  }
38521ee5707e6e59d982d2f2ae28e079c7ff46dc519Argyrios Kyrtzidis  CatDInfo.ObjCCatDeclInfo.classLoc = getIndexLoc(ClassLoc);
386b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis  return handleObjCContainer(D, CategoryLoc, getCursor(D), CatDInfo);
387dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis}
388dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis
389b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidisbool IndexingContext::handleObjCCategoryImpl(const ObjCCategoryImplDecl *D) {
390dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis  const ObjCCategoryDecl *CatD = D->getCategoryDecl();
391c71d55469e7d5f7b376a30620617a175a9442da9Argyrios Kyrtzidis  ObjCCategoryDeclInfo CatDInfo(/*isImplementation=*/true);
3922957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis  EntityInfo ClassEntity;
393dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis  StrAdapter SA(*this);
3943e340a67f4522a2f633a719cb7f3389fe2474374Argyrios Kyrtzidis  const ObjCInterfaceDecl *IFaceD = CatD->getClassInterface();
3953e340a67f4522a2f633a719cb7f3389fe2474374Argyrios Kyrtzidis  SourceLocation ClassLoc = D->getLocation();
3963e340a67f4522a2f633a719cb7f3389fe2474374Argyrios Kyrtzidis  SourceLocation CategoryLoc = ClassLoc; //FIXME: D->getCategoryNameLoc();
3973e340a67f4522a2f633a719cb7f3389fe2474374Argyrios Kyrtzidis  getEntityInfo(IFaceD, ClassEntity, SA);
398dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis
3996ec43adc39006a7fce94188956d0239bd54c0363Argyrios Kyrtzidis  CatDInfo.ObjCCatDeclInfo.containerInfo = &CatDInfo.ObjCContDeclInfo;
4003e340a67f4522a2f633a719cb7f3389fe2474374Argyrios Kyrtzidis  if (IFaceD) {
4013e340a67f4522a2f633a719cb7f3389fe2474374Argyrios Kyrtzidis    CatDInfo.ObjCCatDeclInfo.objcClass = &ClassEntity;
4023e340a67f4522a2f633a719cb7f3389fe2474374Argyrios Kyrtzidis    CatDInfo.ObjCCatDeclInfo.classCursor =
4033e340a67f4522a2f633a719cb7f3389fe2474374Argyrios Kyrtzidis        MakeCursorObjCClassRef(IFaceD, ClassLoc, CXTU);
4043e340a67f4522a2f633a719cb7f3389fe2474374Argyrios Kyrtzidis  } else {
4053e340a67f4522a2f633a719cb7f3389fe2474374Argyrios Kyrtzidis    CatDInfo.ObjCCatDeclInfo.objcClass = 0;
4063e340a67f4522a2f633a719cb7f3389fe2474374Argyrios Kyrtzidis    CatDInfo.ObjCCatDeclInfo.classCursor = clang_getNullCursor();
4073e340a67f4522a2f633a719cb7f3389fe2474374Argyrios Kyrtzidis  }
4083e340a67f4522a2f633a719cb7f3389fe2474374Argyrios Kyrtzidis  CatDInfo.ObjCCatDeclInfo.classLoc = getIndexLoc(ClassLoc);
409b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis  return handleObjCContainer(D, CategoryLoc, getCursor(D), CatDInfo);
4104e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis}
4114e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis
412b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidisbool IndexingContext::handleObjCMethod(const ObjCMethodDecl *D) {
413c71d55469e7d5f7b376a30620617a175a9442da9Argyrios Kyrtzidis  DeclInfo DInfo(!D->isCanonicalDecl(), D->isThisDeclarationADefinition(),
414c71d55469e7d5f7b376a30620617a175a9442da9Argyrios Kyrtzidis                 D->isThisDeclarationADefinition());
415b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis  return handleDecl(D, D->getLocation(), getCursor(D), DInfo);
416b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis}
417b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis
418b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidisbool IndexingContext::handleSynthesizedObjCProperty(
419b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis                                                const ObjCPropertyImplDecl *D) {
420b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis  ObjCPropertyDecl *PD = D->getPropertyDecl();
421b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis  return handleReference(PD, D->getLocation(), getCursor(D), 0, D->getDeclContext());
4224e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis}
4234e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis
424b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidisbool IndexingContext::handleSynthesizedObjCMethod(const ObjCMethodDecl *D,
425b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis                                                  SourceLocation Loc) {
426b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis  DeclInfo DInfo(/*isRedeclaration=*/true, /*isDefinition=*/true,
427b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis                 /*isContainer=*/false);
428b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis  return handleDecl(D, Loc, getCursor(D), DInfo);
429b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis}
430b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis
431b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidisbool IndexingContext::handleObjCProperty(const ObjCPropertyDecl *D) {
432c71d55469e7d5f7b376a30620617a175a9442da9Argyrios Kyrtzidis  DeclInfo DInfo(/*isRedeclaration=*/false, /*isDefinition=*/false,
433c71d55469e7d5f7b376a30620617a175a9442da9Argyrios Kyrtzidis                 /*isContainer=*/false);
434b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis  return handleDecl(D, D->getLocation(), getCursor(D), DInfo);
4354e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis}
4364e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis
43768478b0cc1ff03c0d13ceca6800c5becf08791e7Argyrios Kyrtzidisbool IndexingContext::handleNamespace(const NamespaceDecl *D) {
43868478b0cc1ff03c0d13ceca6800c5becf08791e7Argyrios Kyrtzidis  DeclInfo DInfo(/*isRedeclaration=*/!D->isOriginalNamespace(),
43968478b0cc1ff03c0d13ceca6800c5becf08791e7Argyrios Kyrtzidis                 /*isDefinition=*/true,
44068478b0cc1ff03c0d13ceca6800c5becf08791e7Argyrios Kyrtzidis                 /*isContainer=*/true);
44168478b0cc1ff03c0d13ceca6800c5becf08791e7Argyrios Kyrtzidis  return handleDecl(D, D->getLocation(), getCursor(D), DInfo);
44268478b0cc1ff03c0d13ceca6800c5becf08791e7Argyrios Kyrtzidis}
44368478b0cc1ff03c0d13ceca6800c5becf08791e7Argyrios Kyrtzidis
4442957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidisbool IndexingContext::handleClassTemplate(const ClassTemplateDecl *D) {
4452957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis  return handleCXXRecordDecl(D->getTemplatedDecl(), D);
4462957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis}
4472957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis
4482957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidisbool IndexingContext::handleFunctionTemplate(const FunctionTemplateDecl *D) {
4492957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis  DeclInfo DInfo(/*isRedeclaration=*/!D->isCanonicalDecl(),
4502957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis                 /*isDefinition=*/D->isThisDeclarationADefinition(),
4512957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis                 /*isContainer=*/D->isThisDeclarationADefinition());
4522957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis  return handleDecl(D, D->getLocation(), getCursor(D), DInfo);
4532957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis}
4542957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis
4552957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidisbool IndexingContext::handleTypeAliasTemplate(const TypeAliasTemplateDecl *D) {
4562957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis  DeclInfo DInfo(/*isRedeclaration=*/!D->isCanonicalDecl(),
4572957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis                 /*isDefinition=*/true, /*isContainer=*/false);
4582957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis  return handleDecl(D, D->getLocation(), getCursor(D), DInfo);
4592957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis}
4602957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis
461b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidisbool IndexingContext::handleReference(const NamedDecl *D, SourceLocation Loc,
4624e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis                                      const NamedDecl *Parent,
4634e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis                                      const DeclContext *DC,
464aca19be8731fc31cff68702de0dc7f30ce908979Argyrios Kyrtzidis                                      const Expr *E,
465aca19be8731fc31cff68702de0dc7f30ce908979Argyrios Kyrtzidis                                      CXIdxEntityRefKind Kind) {
466d6c8209fd1567db9c2721f441b50cb23cdf8d835Argyrios Kyrtzidis  if (!D)
467b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis    return false;
468b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis
469b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis  CXCursor Cursor = E ? MakeCXCursor(const_cast<Expr*>(E),
470b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis                                     const_cast<Decl*>(cast<Decl>(DC)), CXTU)
471b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis                      : getRefCursor(D, Loc);
472b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis  return handleReference(D, Loc, Cursor, Parent, DC, E, Kind);
473b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis}
474b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis
475b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidisbool IndexingContext::handleReference(const NamedDecl *D, SourceLocation Loc,
476b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis                                      CXCursor Cursor,
477b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis                                      const NamedDecl *Parent,
478b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis                                      const DeclContext *DC,
479b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis                                      const Expr *E,
480b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis                                      CXIdxEntityRefKind Kind) {
4812957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis  if (!CB.indexEntityReference)
482b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis    return false;
4832957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis
4842957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis  if (!D)
485b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis    return false;
4864e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis  if (Loc.isInvalid())
487b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis    return false;
4882957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis  if (D->getParentFunctionOrMethod())
489b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis    return false;
4904e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis  if (isNotFromSourceFile(D->getLocation()))
491b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis    return false;
4922957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis  if (D->isImplicit() && shouldIgnoreIfImplicit(D))
4932957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis    return false;
4942957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis
4952957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis  if (suppressRefs()) {
4962957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis    if (markEntityOccurrenceInFile(D, Loc))
4972957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis      return false; // already occurred.
4982957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis  }
499c6b4a5099588fd21b49c80f730a596a64b2766c6Argyrios Kyrtzidis
500144b6c0c50b5523609cbac523f168b9e3cb01175Argyrios Kyrtzidis  StrAdapter SA(*this);
5012957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis  EntityInfo RefEntity, ParentEntity;
502144b6c0c50b5523609cbac523f168b9e3cb01175Argyrios Kyrtzidis  getEntityInfo(D, RefEntity, SA);
503144b6c0c50b5523609cbac523f168b9e3cb01175Argyrios Kyrtzidis  if (!RefEntity.USR)
504b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis    return false;
505144b6c0c50b5523609cbac523f168b9e3cb01175Argyrios Kyrtzidis
506144b6c0c50b5523609cbac523f168b9e3cb01175Argyrios Kyrtzidis  getEntityInfo(Parent, ParentEntity, SA);
507144b6c0c50b5523609cbac523f168b9e3cb01175Argyrios Kyrtzidis
5082957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis  ContainerInfo Container;
5092957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis  getContainerInfo(DC, Container);
510c6b4a5099588fd21b49c80f730a596a64b2766c6Argyrios Kyrtzidis
511b1febb646bf7a2f319ad894c9833968c52d21711Argyrios Kyrtzidis  CXIdxEntityRefInfo Info = { Kind,
512b1febb646bf7a2f319ad894c9833968c52d21711Argyrios Kyrtzidis                              Cursor,
5134e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis                              getIndexLoc(Loc),
514dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis                              &RefEntity,
515c6b4a5099588fd21b49c80f730a596a64b2766c6Argyrios Kyrtzidis                              Parent ? &ParentEntity : 0,
516b1febb646bf7a2f319ad894c9833968c52d21711Argyrios Kyrtzidis                              &Container };
5174e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis  CB.indexEntityReference(ClientData, &Info);
518b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis  return true;
5194e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis}
5204e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis
5214e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidisbool IndexingContext::isNotFromSourceFile(SourceLocation Loc) const {
5224e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis  if (Loc.isInvalid())
5234e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis    return true;
5244e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis  SourceManager &SM = Ctx->getSourceManager();
5254e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis  SourceLocation FileLoc = SM.getFileLoc(Loc);
5264e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis  FileID FID = SM.getFileID(FileLoc);
5274e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis  return SM.getFileEntryForID(FID) == 0;
5284e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis}
5294e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis
5304e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidisvoid IndexingContext::addContainerInMap(const DeclContext *DC,
531dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis                                        CXIdxClientContainer container) {
5322957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis  if (!DC)
5332957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis    return;
5342957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis
5354e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis  assert(getScopedContext(DC) == DC);
5364e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis  ContainerMapTy::iterator I = ContainerMap.find(DC);
5374e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis  if (I == ContainerMap.end()) {
5384e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis    if (container)
5394e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis      ContainerMap[DC] = container;
5404e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis    return;
5414e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis  }
5424e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis  // Allow changing the container of a previously seen DeclContext so we
5434e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis  // can handle invalid user code, like a function re-definition.
5444e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis  if (container)
5454e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis    I->second = container;
5464e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis  else
5474e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis    ContainerMap.erase(I);
5484e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis}
5494e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis
5502957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios KyrtzidisCXIdxClientEntity IndexingContext::getClientEntity(const Decl *D) const {
5512957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis  if (!D)
5522957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis    return 0;
5532957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis  EntityMapTy::const_iterator I = EntityMap.find(D);
5542957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis  if (I == EntityMap.end())
5552957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis    return 0;
5562957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis  return I->second;
5572957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis}
5582957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis
5592957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidisvoid IndexingContext::setClientEntity(const Decl *D, CXIdxClientEntity client) {
5602957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis  if (!D)
5612957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis    return;
5622957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis  EntityMap[D] = client;
5632957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis}
5642957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis
5652957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidisbool IndexingContext::handleCXXRecordDecl(const CXXRecordDecl *RD,
5662957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis                                          const NamedDecl *OrigD) {
56737f40572c4c78a8c57a7b45266f8b86db172a7c1Argyrios Kyrtzidis  if (RD->isThisDeclarationADefinition()) {
56837f40572c4c78a8c57a7b45266f8b86db172a7c1Argyrios Kyrtzidis    StrAdapter SA(*this);
56937f40572c4c78a8c57a7b45266f8b86db172a7c1Argyrios Kyrtzidis    CXXClassDeclInfo CXXDInfo(/*isRedeclaration=*/!OrigD->isCanonicalDecl(),
57037f40572c4c78a8c57a7b45266f8b86db172a7c1Argyrios Kyrtzidis                           /*isDefinition=*/RD->isThisDeclarationADefinition());
57137f40572c4c78a8c57a7b45266f8b86db172a7c1Argyrios Kyrtzidis    CXXBasesListInfo BaseList(RD, *this, SA);
57237f40572c4c78a8c57a7b45266f8b86db172a7c1Argyrios Kyrtzidis    CXXDInfo.CXXClassInfo.declInfo = &CXXDInfo;
57337f40572c4c78a8c57a7b45266f8b86db172a7c1Argyrios Kyrtzidis    CXXDInfo.CXXClassInfo.bases = BaseList.getBases();
57437f40572c4c78a8c57a7b45266f8b86db172a7c1Argyrios Kyrtzidis    CXXDInfo.CXXClassInfo.numBases = BaseList.getNumBases();
57537f40572c4c78a8c57a7b45266f8b86db172a7c1Argyrios Kyrtzidis
57637f40572c4c78a8c57a7b45266f8b86db172a7c1Argyrios Kyrtzidis    return handleDecl(OrigD, OrigD->getLocation(), getCursor(OrigD), CXXDInfo);
57737f40572c4c78a8c57a7b45266f8b86db172a7c1Argyrios Kyrtzidis  }
5782957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis
57937f40572c4c78a8c57a7b45266f8b86db172a7c1Argyrios Kyrtzidis  DeclInfo DInfo(/*isRedeclaration=*/!OrigD->isCanonicalDecl(),
58037f40572c4c78a8c57a7b45266f8b86db172a7c1Argyrios Kyrtzidis                 /*isDefinition=*/RD->isThisDeclarationADefinition(),
58137f40572c4c78a8c57a7b45266f8b86db172a7c1Argyrios Kyrtzidis                 /*isContainer=*/RD->isThisDeclarationADefinition());
5822957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis  return handleDecl(OrigD, OrigD->getLocation(), getCursor(OrigD), DInfo);
5832957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis}
5842957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis
585b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidisbool IndexingContext::markEntityOccurrenceInFile(const NamedDecl *D,
586b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis                                                 SourceLocation Loc) {
587b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis  SourceManager &SM = Ctx->getSourceManager();
588b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis  D = getEntityDecl(D);
589b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis
590b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis  std::pair<FileID, unsigned> LocInfo = SM.getDecomposedLoc(Loc);
591b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis  FileID FID = LocInfo.first;
592b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis  if (FID.isInvalid())
593b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis    return true;
594b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis
595b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis  const FileEntry *FE = SM.getFileEntryForID(FID);
596b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis  if (!FE)
597b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis    return true;
598b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis  RefFileOccurence RefOccur(FE, D);
599b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis  std::pair<llvm::DenseSet<RefFileOccurence>::iterator, bool>
600b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis  res = RefFileOccurences.insert(RefOccur);
601b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis  if (!res.second)
602b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis    return true; // already in map.
603b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis
604b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis  return false;
605b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis}
606b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis
6074e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidisconst NamedDecl *IndexingContext::getEntityDecl(const NamedDecl *D) const {
6084e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis  assert(D);
6094e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis  D = cast<NamedDecl>(D->getCanonicalDecl());
6104e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis
611b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis  if (const ObjCImplementationDecl *
6124e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis               ImplD = dyn_cast<ObjCImplementationDecl>(D)) {
6134e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis    return getEntityDecl(ImplD->getClassInterface());
6144e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis
6154e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis  } else if (const ObjCCategoryImplDecl *
6164e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis               CatImplD = dyn_cast<ObjCCategoryImplDecl>(D)) {
6174e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis    return getEntityDecl(CatImplD->getCategoryDecl());
6182957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis  } else if (const FunctionDecl *FD = dyn_cast<FunctionDecl>(D)) {
6192957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis    if (FunctionTemplateDecl *TemplD = FD->getDescribedFunctionTemplate())
6202957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis      return getEntityDecl(TemplD);
6212957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis  } else if (const CXXRecordDecl *RD = dyn_cast<CXXRecordDecl>(D)) {
6222957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis    if (ClassTemplateDecl *TemplD = RD->getDescribedClassTemplate())
6232957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis      return getEntityDecl(TemplD);
6244e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis  }
6254e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis
6264e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis  return D;
6274e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis}
6284e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis
6294e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidisconst DeclContext *
6302957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios KyrtzidisIndexingContext::getEntityContainer(const Decl *D) const {
6312957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis  const DeclContext *DC = dyn_cast<DeclContext>(D);
6322957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis  if (DC)
6332957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis    return DC;
6342957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis
6352957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis  if (const ClassTemplateDecl *ClassTempl = dyn_cast<ClassTemplateDecl>(D)) {
6362957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis    DC = ClassTempl->getTemplatedDecl();
6372957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis  } if (const FunctionTemplateDecl *
6382957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis          FuncTempl = dyn_cast<FunctionTemplateDecl>(D)) {
6392957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis    DC = FuncTempl->getTemplatedDecl();
6402957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis  }
6412957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis
6422957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis  return DC;
6432957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis}
6442957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis
6452957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidisconst DeclContext *
6464e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios KyrtzidisIndexingContext::getScopedContext(const DeclContext *DC) const {
6474e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis  // Local contexts are ignored for indexing.
6484e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis  const DeclContext *FuncCtx = cast<Decl>(DC)->getParentFunctionOrMethod();
6494e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis  if (FuncCtx)
6504e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis    return FuncCtx;
6514e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis
6524e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis  // We consider enums always scoped for indexing.
6534e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis  if (isa<TagDecl>(DC))
6544e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis    return DC;
6554e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis
6564e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis  if (const NamespaceDecl *NS = dyn_cast<NamespaceDecl>(DC)) {
6574e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis    if (NS->isAnonymousNamespace())
6584e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis      return getScopedContext(NS->getParent());
6594e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis    return NS;
6604e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis  }
6614e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis
6624e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis  return DC->getRedeclContext();
6634e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis}
6644e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis
665dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios KyrtzidisCXIdxClientContainer
6662957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios KyrtzidisIndexingContext::getClientContainerForDC(const DeclContext *DC) const {
6672957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis  if (!DC)
6682957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis    return 0;
6692957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis
6704e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis  DC = getScopedContext(DC);
6714e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis  ContainerMapTy::const_iterator I = ContainerMap.find(DC);
6723e340a67f4522a2f633a719cb7f3389fe2474374Argyrios Kyrtzidis  if (I == ContainerMap.end())
6733e340a67f4522a2f633a719cb7f3389fe2474374Argyrios Kyrtzidis    return 0;
6742957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis
6754e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis  return I->second;
6764e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis}
6774e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis
678dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios KyrtzidisCXIdxClientFile IndexingContext::getIndexFile(const FileEntry *File) {
6794e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis  if (!File)
6804e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis    return 0;
6814e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis
6824e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis  FileMapTy::iterator FI = FileMap.find(File);
6834e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis  if (FI != FileMap.end())
6844e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis    return FI->second;
6854e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis
686dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis  return 0;
6874e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis}
6884e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis
6894e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios KyrtzidisCXIdxLoc IndexingContext::getIndexLoc(SourceLocation Loc) const {
6904e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis  CXIdxLoc idxLoc =  { {0, 0}, 0 };
6914e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis  if (Loc.isInvalid())
6924e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis    return idxLoc;
6934e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis
6944e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis  idxLoc.ptr_data[0] = (void*)this;
6954e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis  idxLoc.int_data = Loc.getRawEncoding();
6964e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis  return idxLoc;
6974e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis}
6984e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis
6994e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidisvoid IndexingContext::translateLoc(SourceLocation Loc,
700dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis                                   CXIdxClientFile *indexFile, CXFile *file,
7014e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis                                   unsigned *line, unsigned *column,
7024e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis                                   unsigned *offset) {
7034e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis  if (Loc.isInvalid())
7044e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis    return;
7054e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis
7064e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis  SourceManager &SM = Ctx->getSourceManager();
7074e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis  Loc = SM.getFileLoc(Loc);
7084e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis
7094e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis  std::pair<FileID, unsigned> LocInfo = SM.getDecomposedLoc(Loc);
7104e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis  FileID FID = LocInfo.first;
7114e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis  unsigned FileOffset = LocInfo.second;
7124e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis
7134e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis  if (FID.isInvalid())
7144e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis    return;
7154e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis
7164e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis  const FileEntry *FE = SM.getFileEntryForID(FID);
7174e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis  if (indexFile)
7184e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis    *indexFile = getIndexFile(FE);
7194e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis  if (file)
7204e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis    *file = (void *)FE;
7214e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis  if (line)
7224e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis    *line = SM.getLineNumber(FID, FileOffset);
7234e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis  if (column)
7244e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis    *column = SM.getColumnNumber(FID, FileOffset);
7254e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis  if (offset)
7264e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis    *offset = FileOffset;
7274e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis}
7284e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis
729dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidisvoid IndexingContext::getEntityInfo(const NamedDecl *D,
7302957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis                                    EntityInfo &EntityInfo,
7312957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis                                    StrAdapter &SA) {
732c6b4a5099588fd21b49c80f730a596a64b2766c6Argyrios Kyrtzidis  if (!D)
733c6b4a5099588fd21b49c80f730a596a64b2766c6Argyrios Kyrtzidis    return;
7342957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis
735dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis  D = getEntityDecl(D);
7362957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis  EntityInfo.cursor = getCursor(D);
7372957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis  EntityInfo.Dcl = D;
7382957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis  EntityInfo.IndexCtx = this;
739dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis  EntityInfo.kind = CXIdxEntity_Unexposed;
7402957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis  EntityInfo.templateKind = CXIdxEntity_NonTemplate;
741838d3c23204f52ae27a9f5e9a254238a7ac5d41bArgyrios Kyrtzidis  EntityInfo.lang = CXIdxEntityLang_C;
742dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis
743dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis  if (const TagDecl *TD = dyn_cast<TagDecl>(D)) {
744dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis    switch (TD->getTagKind()) {
745dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis    case TTK_Struct:
746dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis      EntityInfo.kind = CXIdxEntity_Struct; break;
747dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis    case TTK_Union:
748dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis      EntityInfo.kind = CXIdxEntity_Union; break;
749dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis    case TTK_Class:
750838d3c23204f52ae27a9f5e9a254238a7ac5d41bArgyrios Kyrtzidis      EntityInfo.kind = CXIdxEntity_CXXClass;
751838d3c23204f52ae27a9f5e9a254238a7ac5d41bArgyrios Kyrtzidis      EntityInfo.lang = CXIdxEntityLang_CXX;
752838d3c23204f52ae27a9f5e9a254238a7ac5d41bArgyrios Kyrtzidis      break;
753dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis    case TTK_Enum:
754dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis      EntityInfo.kind = CXIdxEntity_Enum; break;
755dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis    }
7564e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis
7572957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis    if (const CXXRecordDecl *CXXRec = dyn_cast<CXXRecordDecl>(D)) {
758838d3c23204f52ae27a9f5e9a254238a7ac5d41bArgyrios Kyrtzidis      // FIXME: isPOD check is not sufficient, a POD can contain methods,
759838d3c23204f52ae27a9f5e9a254238a7ac5d41bArgyrios Kyrtzidis      // we want a isCStructLike check.
760838d3c23204f52ae27a9f5e9a254238a7ac5d41bArgyrios Kyrtzidis      if (CXXRec->hasDefinition() && !CXXRec->isPOD())
761838d3c23204f52ae27a9f5e9a254238a7ac5d41bArgyrios Kyrtzidis        EntityInfo.lang = CXIdxEntityLang_CXX;
7622957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis    }
7632957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis
7642957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis    if (isa<ClassTemplatePartialSpecializationDecl>(D)) {
7652957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis      EntityInfo.templateKind = CXIdxEntity_TemplatePartialSpecialization;
7662957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis    } else if (isa<ClassTemplateSpecializationDecl>(D)) {
7672957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis      EntityInfo.templateKind = CXIdxEntity_TemplateSpecialization;
7682957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis    }
7692957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis
770dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis  } else {
771dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis    switch (D->getKind()) {
772dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis    case Decl::Typedef:
773dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis      EntityInfo.kind = CXIdxEntity_Typedef; break;
774dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis    case Decl::Function:
7752957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis      EntityInfo.kind = CXIdxEntity_Function;
7762957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis      break;
777dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis    case Decl::Var:
7782957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis      EntityInfo.kind = CXIdxEntity_Variable;
779838d3c23204f52ae27a9f5e9a254238a7ac5d41bArgyrios Kyrtzidis      if (isa<CXXRecordDecl>(D->getDeclContext())) {
7802957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis        EntityInfo.kind = CXIdxEntity_CXXStaticVariable;
781838d3c23204f52ae27a9f5e9a254238a7ac5d41bArgyrios Kyrtzidis        EntityInfo.lang = CXIdxEntityLang_CXX;
782838d3c23204f52ae27a9f5e9a254238a7ac5d41bArgyrios Kyrtzidis      }
7832957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis      break;
784dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis    case Decl::Field:
785da5f2d2360ace0ea32e4f3194906be4899a76c7dArgyrios Kyrtzidis      EntityInfo.kind = CXIdxEntity_Field;
786da5f2d2360ace0ea32e4f3194906be4899a76c7dArgyrios Kyrtzidis      if (const CXXRecordDecl *
787838d3c23204f52ae27a9f5e9a254238a7ac5d41bArgyrios Kyrtzidis            CXXRec = dyn_cast<CXXRecordDecl>(D->getDeclContext())) {
788838d3c23204f52ae27a9f5e9a254238a7ac5d41bArgyrios Kyrtzidis        // FIXME: isPOD check is not sufficient, a POD can contain methods,
789838d3c23204f52ae27a9f5e9a254238a7ac5d41bArgyrios Kyrtzidis        // we want a isCStructLike check.
790da5f2d2360ace0ea32e4f3194906be4899a76c7dArgyrios Kyrtzidis        if (!CXXRec->isPOD())
791838d3c23204f52ae27a9f5e9a254238a7ac5d41bArgyrios Kyrtzidis          EntityInfo.lang = CXIdxEntityLang_CXX;
792838d3c23204f52ae27a9f5e9a254238a7ac5d41bArgyrios Kyrtzidis      }
793da5f2d2360ace0ea32e4f3194906be4899a76c7dArgyrios Kyrtzidis      break;
794dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis    case Decl::EnumConstant:
795dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis      EntityInfo.kind = CXIdxEntity_EnumConstant; break;
796dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis    case Decl::ObjCInterface:
797838d3c23204f52ae27a9f5e9a254238a7ac5d41bArgyrios Kyrtzidis      EntityInfo.kind = CXIdxEntity_ObjCClass;
798838d3c23204f52ae27a9f5e9a254238a7ac5d41bArgyrios Kyrtzidis      EntityInfo.lang = CXIdxEntityLang_ObjC;
799838d3c23204f52ae27a9f5e9a254238a7ac5d41bArgyrios Kyrtzidis      break;
800dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis    case Decl::ObjCProtocol:
801838d3c23204f52ae27a9f5e9a254238a7ac5d41bArgyrios Kyrtzidis      EntityInfo.kind = CXIdxEntity_ObjCProtocol;
802838d3c23204f52ae27a9f5e9a254238a7ac5d41bArgyrios Kyrtzidis      EntityInfo.lang = CXIdxEntityLang_ObjC;
803838d3c23204f52ae27a9f5e9a254238a7ac5d41bArgyrios Kyrtzidis      break;
804dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis    case Decl::ObjCCategory:
805838d3c23204f52ae27a9f5e9a254238a7ac5d41bArgyrios Kyrtzidis      EntityInfo.kind = CXIdxEntity_ObjCCategory;
806838d3c23204f52ae27a9f5e9a254238a7ac5d41bArgyrios Kyrtzidis      EntityInfo.lang = CXIdxEntityLang_ObjC;
807838d3c23204f52ae27a9f5e9a254238a7ac5d41bArgyrios Kyrtzidis      break;
808dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis    case Decl::ObjCMethod:
809c71d55469e7d5f7b376a30620617a175a9442da9Argyrios Kyrtzidis      if (cast<ObjCMethodDecl>(D)->isInstanceMethod())
810c71d55469e7d5f7b376a30620617a175a9442da9Argyrios Kyrtzidis        EntityInfo.kind = CXIdxEntity_ObjCInstanceMethod;
811c71d55469e7d5f7b376a30620617a175a9442da9Argyrios Kyrtzidis      else
812c71d55469e7d5f7b376a30620617a175a9442da9Argyrios Kyrtzidis        EntityInfo.kind = CXIdxEntity_ObjCClassMethod;
813838d3c23204f52ae27a9f5e9a254238a7ac5d41bArgyrios Kyrtzidis      EntityInfo.lang = CXIdxEntityLang_ObjC;
814c71d55469e7d5f7b376a30620617a175a9442da9Argyrios Kyrtzidis      break;
815dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis    case Decl::ObjCProperty:
816838d3c23204f52ae27a9f5e9a254238a7ac5d41bArgyrios Kyrtzidis      EntityInfo.kind = CXIdxEntity_ObjCProperty;
817838d3c23204f52ae27a9f5e9a254238a7ac5d41bArgyrios Kyrtzidis      EntityInfo.lang = CXIdxEntityLang_ObjC;
818838d3c23204f52ae27a9f5e9a254238a7ac5d41bArgyrios Kyrtzidis      break;
819dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis    case Decl::ObjCIvar:
820838d3c23204f52ae27a9f5e9a254238a7ac5d41bArgyrios Kyrtzidis      EntityInfo.kind = CXIdxEntity_ObjCIvar;
821838d3c23204f52ae27a9f5e9a254238a7ac5d41bArgyrios Kyrtzidis      EntityInfo.lang = CXIdxEntityLang_ObjC;
822838d3c23204f52ae27a9f5e9a254238a7ac5d41bArgyrios Kyrtzidis      break;
8232957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis    case Decl::Namespace:
824838d3c23204f52ae27a9f5e9a254238a7ac5d41bArgyrios Kyrtzidis      EntityInfo.kind = CXIdxEntity_CXXNamespace;
825838d3c23204f52ae27a9f5e9a254238a7ac5d41bArgyrios Kyrtzidis      EntityInfo.lang = CXIdxEntityLang_CXX;
826838d3c23204f52ae27a9f5e9a254238a7ac5d41bArgyrios Kyrtzidis      break;
8272957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis    case Decl::NamespaceAlias:
828838d3c23204f52ae27a9f5e9a254238a7ac5d41bArgyrios Kyrtzidis      EntityInfo.kind = CXIdxEntity_CXXNamespaceAlias;
829838d3c23204f52ae27a9f5e9a254238a7ac5d41bArgyrios Kyrtzidis      EntityInfo.lang = CXIdxEntityLang_CXX;
830838d3c23204f52ae27a9f5e9a254238a7ac5d41bArgyrios Kyrtzidis      break;
8312957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis    case Decl::CXXConstructor:
832838d3c23204f52ae27a9f5e9a254238a7ac5d41bArgyrios Kyrtzidis      EntityInfo.kind = CXIdxEntity_CXXConstructor;
833838d3c23204f52ae27a9f5e9a254238a7ac5d41bArgyrios Kyrtzidis      EntityInfo.lang = CXIdxEntityLang_CXX;
834838d3c23204f52ae27a9f5e9a254238a7ac5d41bArgyrios Kyrtzidis      break;
8352957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis    case Decl::CXXDestructor:
836838d3c23204f52ae27a9f5e9a254238a7ac5d41bArgyrios Kyrtzidis      EntityInfo.kind = CXIdxEntity_CXXDestructor;
837838d3c23204f52ae27a9f5e9a254238a7ac5d41bArgyrios Kyrtzidis      EntityInfo.lang = CXIdxEntityLang_CXX;
838838d3c23204f52ae27a9f5e9a254238a7ac5d41bArgyrios Kyrtzidis      break;
8392957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis    case Decl::CXXConversion:
840838d3c23204f52ae27a9f5e9a254238a7ac5d41bArgyrios Kyrtzidis      EntityInfo.kind = CXIdxEntity_CXXConversionFunction;
841838d3c23204f52ae27a9f5e9a254238a7ac5d41bArgyrios Kyrtzidis      EntityInfo.lang = CXIdxEntityLang_CXX;
842838d3c23204f52ae27a9f5e9a254238a7ac5d41bArgyrios Kyrtzidis      break;
8432957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis    case Decl::CXXMethod: {
8442957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis      const CXXMethodDecl *MD = cast<CXXMethodDecl>(D);
8452957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis      if (MD->isStatic())
8462957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis        EntityInfo.kind = CXIdxEntity_CXXStaticMethod;
8472957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis      else
8482957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis        EntityInfo.kind = CXIdxEntity_CXXInstanceMethod;
849838d3c23204f52ae27a9f5e9a254238a7ac5d41bArgyrios Kyrtzidis      EntityInfo.lang = CXIdxEntityLang_CXX;
8502957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis      break;
8512957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis    }
8522957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis    case Decl::ClassTemplate:
8532957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis      EntityInfo.kind = CXIdxEntity_CXXClass;
8542957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis      EntityInfo.templateKind = CXIdxEntity_Template;
8552957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis      break;
8562957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis    case Decl::FunctionTemplate:
8572957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis      EntityInfo.kind = CXIdxEntity_Function;
8582957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis      EntityInfo.templateKind = CXIdxEntity_Template;
8592957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis      if (const CXXMethodDecl *MD = dyn_cast_or_null<CXXMethodDecl>(
8602957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis                           cast<FunctionTemplateDecl>(D)->getTemplatedDecl())) {
8612957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis        if (isa<CXXConstructorDecl>(MD))
8622957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis          EntityInfo.kind = CXIdxEntity_CXXConstructor;
8632957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis        else if (isa<CXXDestructorDecl>(MD))
8642957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis          EntityInfo.kind = CXIdxEntity_CXXDestructor;
8652957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis        else if (isa<CXXConversionDecl>(MD))
8662957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis          EntityInfo.kind = CXIdxEntity_CXXConversionFunction;
8672957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis        else {
8682957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis          if (MD->isStatic())
8692957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis            EntityInfo.kind = CXIdxEntity_CXXStaticMethod;
8702957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis          else
8712957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis            EntityInfo.kind = CXIdxEntity_CXXInstanceMethod;
8722957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis        }
8732957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis      }
8742957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis      break;
8752957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis    case Decl::TypeAliasTemplate:
8762957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis      EntityInfo.kind = CXIdxEntity_CXXTypeAlias;
8772957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis      EntityInfo.templateKind = CXIdxEntity_Template;
8782957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis      break;
8792957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis    case Decl::TypeAlias:
880838d3c23204f52ae27a9f5e9a254238a7ac5d41bArgyrios Kyrtzidis      EntityInfo.kind = CXIdxEntity_CXXTypeAlias;
881838d3c23204f52ae27a9f5e9a254238a7ac5d41bArgyrios Kyrtzidis      EntityInfo.lang = CXIdxEntityLang_CXX;
882838d3c23204f52ae27a9f5e9a254238a7ac5d41bArgyrios Kyrtzidis      break;
883dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis    default:
884dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis      break;
885dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis    }
886dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis  }
8874e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis
8882957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis  if (EntityInfo.kind == CXIdxEntity_Unexposed)
8892957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis    return;
8902957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis
8912957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis  if (const FunctionDecl *FD = dyn_cast<FunctionDecl>(D)) {
8922957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis    if (FD->getTemplatedKind() ==
8932957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis          FunctionDecl::TK_FunctionTemplateSpecialization)
8942957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis      EntityInfo.templateKind = CXIdxEntity_TemplateSpecialization;
8952957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis  }
8962957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis
897838d3c23204f52ae27a9f5e9a254238a7ac5d41bArgyrios Kyrtzidis  if (EntityInfo.templateKind != CXIdxEntity_NonTemplate)
898838d3c23204f52ae27a9f5e9a254238a7ac5d41bArgyrios Kyrtzidis    EntityInfo.lang = CXIdxEntityLang_CXX;
899838d3c23204f52ae27a9f5e9a254238a7ac5d41bArgyrios Kyrtzidis
9004e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis  if (IdentifierInfo *II = D->getIdentifier()) {
9014e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis    EntityInfo.name = SA.toCStr(II->getName());
9024e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis
90337f40572c4c78a8c57a7b45266f8b86db172a7c1Argyrios Kyrtzidis  } else if (isa<TagDecl>(D) || isa<FieldDecl>(D) || isa<NamespaceDecl>(D)) {
90437f40572c4c78a8c57a7b45266f8b86db172a7c1Argyrios Kyrtzidis    EntityInfo.name = 0; // anonymous tag/field/namespace.
9054e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis
9064e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis  } else {
90737f40572c4c78a8c57a7b45266f8b86db172a7c1Argyrios Kyrtzidis    llvm::SmallString<256> StrBuf;
9084e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis    {
90937f40572c4c78a8c57a7b45266f8b86db172a7c1Argyrios Kyrtzidis      llvm::raw_svector_ostream OS(StrBuf);
9104e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis      D->printName(OS);
9114e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis    }
91237f40572c4c78a8c57a7b45266f8b86db172a7c1Argyrios Kyrtzidis    EntityInfo.name = SA.copyCStr(StrBuf.str());
9134e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis  }
9144e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis
915dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis  {
91637f40572c4c78a8c57a7b45266f8b86db172a7c1Argyrios Kyrtzidis    llvm::SmallString<512> StrBuf;
91737f40572c4c78a8c57a7b45266f8b86db172a7c1Argyrios Kyrtzidis    bool Ignore = getDeclCursorUSR(D, StrBuf);
918dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis    if (Ignore) {
919144b6c0c50b5523609cbac523f168b9e3cb01175Argyrios Kyrtzidis      EntityInfo.USR = 0;
920dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis    } else {
92137f40572c4c78a8c57a7b45266f8b86db172a7c1Argyrios Kyrtzidis      EntityInfo.USR = SA.copyCStr(StrBuf.str());
922dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis    }
9234e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis  }
9244e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis}
9254e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis
9262957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidisvoid IndexingContext::getContainerInfo(const DeclContext *DC,
9272957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis                                       ContainerInfo &ContInfo) {
9282957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis  ContInfo.cursor = getCursor(cast<Decl>(DC));
9292957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis  ContInfo.DC = DC;
9302957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis  ContInfo.IndexCtx = this;
9312957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis}
9322957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis
9334e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios KyrtzidisCXCursor IndexingContext::getRefCursor(const NamedDecl *D, SourceLocation Loc) {
9344e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis  if (const TypeDecl *TD = dyn_cast<TypeDecl>(D))
9354e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis    return MakeCursorTypeRef(TD, Loc, CXTU);
9364e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis  if (const ObjCInterfaceDecl *ID = dyn_cast<ObjCInterfaceDecl>(D))
9374e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis    return MakeCursorObjCClassRef(ID, Loc, CXTU);
9384e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis  if (const ObjCProtocolDecl *PD = dyn_cast<ObjCProtocolDecl>(D))
9394e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis    return MakeCursorObjCProtocolRef(PD, Loc, CXTU);
940b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis  if (const TemplateDecl *Template = dyn_cast<TemplateDecl>(D))
941b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis    return MakeCursorTemplateRef(Template, Loc, CXTU);
942b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis  if (const NamespaceDecl *Namespace = dyn_cast<NamespaceDecl>(D))
943b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis    return MakeCursorNamespaceRef(Namespace, Loc, CXTU);
944b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis  if (const NamespaceAliasDecl *Namespace = dyn_cast<NamespaceAliasDecl>(D))
945b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis    return MakeCursorNamespaceRef(Namespace, Loc, CXTU);
946b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis  if (const FieldDecl *Field = dyn_cast<FieldDecl>(D))
947b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis    return MakeCursorMemberRef(Field, Loc, CXTU);
948b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis
9494e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis  return clang_getNullCursor();
9504e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis}
9512957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis
9522957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidisbool IndexingContext::shouldIgnoreIfImplicit(const NamedDecl *D) {
95337f40572c4c78a8c57a7b45266f8b86db172a7c1Argyrios Kyrtzidis  if (isa<ObjCInterfaceDecl>(D))
95437f40572c4c78a8c57a7b45266f8b86db172a7c1Argyrios Kyrtzidis    return false;
95537f40572c4c78a8c57a7b45266f8b86db172a7c1Argyrios Kyrtzidis  if (isa<ObjCCategoryDecl>(D))
95637f40572c4c78a8c57a7b45266f8b86db172a7c1Argyrios Kyrtzidis    return false;
9572957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis  if (isa<ObjCIvarDecl>(D))
9582957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis    return false;
9592957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis  if (isa<ObjCMethodDecl>(D))
9602957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis    return false;
9612957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis  return true;
9622957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis}
963