IndexingContext.cpp revision 2c3e05c266de0d4c465b58ffd129bd0b31604368
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,
25643d3ce93c501d19353f2fa578fee3e97f1d1b4bArgyrios Kyrtzidis                                    ScratchAlloc &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);
3790fd67af4aeec7d1661986dd25eabf924e11a76cArgyrios Kyrtzidis
3858d2dbea680a75de266c5eff77cc15c323cfd48aArgyrios Kyrtzidis    if (IdxCtx.shouldSuppressRefs())
3990fd67af4aeec7d1661986dd25eabf924e11a76cArgyrios Kyrtzidis      IdxCtx.markEntityOccurrenceInFile(PD, Loc);
406ec43adc39006a7fce94188956d0239bd54c0363Argyrios Kyrtzidis  }
416ec43adc39006a7fce94188956d0239bd54c0363Argyrios Kyrtzidis
426ec43adc39006a7fce94188956d0239bd54c0363Argyrios Kyrtzidis  for (unsigned i = 0, e = ProtInfos.size(); i != e; ++i)
436ec43adc39006a7fce94188956d0239bd54c0363Argyrios Kyrtzidis    ProtInfos[i].protocol = &ProtEntities[i];
446ec43adc39006a7fce94188956d0239bd54c0363Argyrios Kyrtzidis
456ec43adc39006a7fce94188956d0239bd54c0363Argyrios Kyrtzidis  for (unsigned i = 0, e = ProtInfos.size(); i != e; ++i)
466ec43adc39006a7fce94188956d0239bd54c0363Argyrios Kyrtzidis    Prots.push_back(&ProtInfos[i]);
476ec43adc39006a7fce94188956d0239bd54c0363Argyrios Kyrtzidis}
486ec43adc39006a7fce94188956d0239bd54c0363Argyrios Kyrtzidis
49643d3ce93c501d19353f2fa578fee3e97f1d1b4bArgyrios Kyrtzidis
50643d3ce93c501d19353f2fa578fee3e97f1d1b4bArgyrios KyrtzidisIBOutletCollectionInfo::IBOutletCollectionInfo(
51643d3ce93c501d19353f2fa578fee3e97f1d1b4bArgyrios Kyrtzidis                                          const IBOutletCollectionInfo &other)
520b28928a715c423b3471c539f1d5499b405c0ec9Argyrios Kyrtzidis  : AttrInfo(CXIdxAttr_IBOutletCollection, other.cursor, other.loc, other.A) {
53643d3ce93c501d19353f2fa578fee3e97f1d1b4bArgyrios Kyrtzidis
54643d3ce93c501d19353f2fa578fee3e97f1d1b4bArgyrios Kyrtzidis  IBCollInfo.attrInfo = this;
55643d3ce93c501d19353f2fa578fee3e97f1d1b4bArgyrios Kyrtzidis  IBCollInfo.classCursor = other.IBCollInfo.classCursor;
56643d3ce93c501d19353f2fa578fee3e97f1d1b4bArgyrios Kyrtzidis  IBCollInfo.classLoc = other.IBCollInfo.classLoc;
57643d3ce93c501d19353f2fa578fee3e97f1d1b4bArgyrios Kyrtzidis  if (other.IBCollInfo.objcClass) {
58643d3ce93c501d19353f2fa578fee3e97f1d1b4bArgyrios Kyrtzidis    ClassInfo = other.ClassInfo;
59643d3ce93c501d19353f2fa578fee3e97f1d1b4bArgyrios Kyrtzidis    IBCollInfo.objcClass = &ClassInfo;
60643d3ce93c501d19353f2fa578fee3e97f1d1b4bArgyrios Kyrtzidis  } else
61643d3ce93c501d19353f2fa578fee3e97f1d1b4bArgyrios Kyrtzidis    IBCollInfo.objcClass = 0;
62643d3ce93c501d19353f2fa578fee3e97f1d1b4bArgyrios Kyrtzidis}
63643d3ce93c501d19353f2fa578fee3e97f1d1b4bArgyrios Kyrtzidis
64d786f1a6331246e7d0eedde277f126ab92089eebArgyrios KyrtzidisAttrListInfo::AttrListInfo(const Decl *D, IndexingContext &IdxCtx)
65d786f1a6331246e7d0eedde277f126ab92089eebArgyrios Kyrtzidis  : SA(IdxCtx), ref_cnt(0) {
66d786f1a6331246e7d0eedde277f126ab92089eebArgyrios Kyrtzidis
67643d3ce93c501d19353f2fa578fee3e97f1d1b4bArgyrios Kyrtzidis  if (!D->hasAttrs())
68643d3ce93c501d19353f2fa578fee3e97f1d1b4bArgyrios Kyrtzidis    return;
69643d3ce93c501d19353f2fa578fee3e97f1d1b4bArgyrios Kyrtzidis
70b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis  for (AttrVec::const_iterator AttrI = D->attr_begin(), AttrE = D->attr_end();
71b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis         AttrI != AttrE; ++AttrI) {
72b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis    const Attr *A = *AttrI;
73b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis    CXCursor C = MakeCXCursor(A, const_cast<Decl *>(D), IdxCtx.CXTU);
74b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis    CXIdxLoc Loc =  IdxCtx.getIndexLoc(A->getLocation());
75b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis    switch (C.kind) {
76b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis    default:
77b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis      Attrs.push_back(AttrInfo(CXIdxAttr_Unexposed, C, Loc, A));
78b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis      break;
79b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis    case CXCursor_IBActionAttr:
80b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis      Attrs.push_back(AttrInfo(CXIdxAttr_IBAction, C, Loc, A));
81b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis      break;
82b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis    case CXCursor_IBOutletAttr:
83b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis      Attrs.push_back(AttrInfo(CXIdxAttr_IBOutlet, C, Loc, A));
84b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis      break;
85b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis    case CXCursor_IBOutletCollectionAttr:
86b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis      IBCollAttrs.push_back(IBOutletCollectionInfo(C, Loc, A));
87b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis      break;
88b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis    }
89b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis  }
90b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis
91b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis  for (unsigned i = 0, e = IBCollAttrs.size(); i != e; ++i) {
92b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis    IBOutletCollectionInfo &IBInfo = IBCollAttrs[i];
93b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis    CXAttrs.push_back(&IBInfo);
94b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis
95b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis    const IBOutletCollectionAttr *
96b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis      IBAttr = cast<IBOutletCollectionAttr>(IBInfo.A);
97b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis    IBInfo.IBCollInfo.attrInfo = &IBInfo;
98b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis    IBInfo.IBCollInfo.classLoc = IdxCtx.getIndexLoc(IBAttr->getInterfaceLoc());
99b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis    IBInfo.IBCollInfo.objcClass = 0;
100b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis    IBInfo.IBCollInfo.classCursor = clang_getNullCursor();
101b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis    QualType Ty = IBAttr->getInterface();
102b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis    if (const ObjCInterfaceType *InterTy = Ty->getAs<ObjCInterfaceType>()) {
103b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis      if (const ObjCInterfaceDecl *InterD = InterTy->getInterface()) {
1042957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis        IdxCtx.getEntityInfo(InterD, IBInfo.ClassInfo, SA);
1052957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis        IBInfo.IBCollInfo.objcClass = &IBInfo.ClassInfo;
106b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis        IBInfo.IBCollInfo.classCursor = MakeCursorObjCClassRef(InterD,
107b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis                                        IBAttr->getInterfaceLoc(), IdxCtx.CXTU);
108b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis      }
109b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis    }
110b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis  }
111b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis
112b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis  for (unsigned i = 0, e = Attrs.size(); i != e; ++i)
113b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis    CXAttrs.push_back(&Attrs[i]);
114b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis}
115b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis
116d786f1a6331246e7d0eedde277f126ab92089eebArgyrios KyrtzidisIntrusiveRefCntPtr<AttrListInfo>
117d786f1a6331246e7d0eedde277f126ab92089eebArgyrios KyrtzidisAttrListInfo::create(const Decl *D, IndexingContext &IdxCtx) {
118d786f1a6331246e7d0eedde277f126ab92089eebArgyrios Kyrtzidis  ScratchAlloc SA(IdxCtx);
119d786f1a6331246e7d0eedde277f126ab92089eebArgyrios Kyrtzidis  AttrListInfo *attrs = SA.allocate<AttrListInfo>();
120d786f1a6331246e7d0eedde277f126ab92089eebArgyrios Kyrtzidis  return new (attrs) AttrListInfo(D, IdxCtx);
121643d3ce93c501d19353f2fa578fee3e97f1d1b4bArgyrios Kyrtzidis}
122643d3ce93c501d19353f2fa578fee3e97f1d1b4bArgyrios Kyrtzidis
1232957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios KyrtzidisIndexingContext::CXXBasesListInfo::CXXBasesListInfo(const CXXRecordDecl *D,
1242957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis                                   IndexingContext &IdxCtx,
125643d3ce93c501d19353f2fa578fee3e97f1d1b4bArgyrios Kyrtzidis                                   ScratchAlloc &SA) {
1262957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis  for (CXXRecordDecl::base_class_const_iterator
1272957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis         I = D->bases_begin(), E = D->bases_end(); I != E; ++I) {
1282957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis    const CXXBaseSpecifier &Base = *I;
1292957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis    BaseEntities.push_back(EntityInfo());
13037f40572c4c78a8c57a7b45266f8b86db172a7c1Argyrios Kyrtzidis    const NamedDecl *BaseD = 0;
131b526a871af40b84d9878eded54a181bf4003b376Argyrios Kyrtzidis    QualType T = Base.getType();
132b526a871af40b84d9878eded54a181bf4003b376Argyrios Kyrtzidis    SourceLocation Loc = getBaseLoc(Base);
133b526a871af40b84d9878eded54a181bf4003b376Argyrios Kyrtzidis
134b526a871af40b84d9878eded54a181bf4003b376Argyrios Kyrtzidis    if (const TypedefType *TDT = T->getAs<TypedefType>()) {
13537f40572c4c78a8c57a7b45266f8b86db172a7c1Argyrios Kyrtzidis      BaseD = TDT->getDecl();
136b526a871af40b84d9878eded54a181bf4003b376Argyrios Kyrtzidis    } else if (const TemplateSpecializationType *
137b526a871af40b84d9878eded54a181bf4003b376Argyrios Kyrtzidis          TST = T->getAs<TemplateSpecializationType>()) {
138b526a871af40b84d9878eded54a181bf4003b376Argyrios Kyrtzidis      BaseD = TST->getTemplateName().getAsTemplateDecl();
139b526a871af40b84d9878eded54a181bf4003b376Argyrios Kyrtzidis    } else if (const RecordType *RT = T->getAs<RecordType>()) {
140b526a871af40b84d9878eded54a181bf4003b376Argyrios Kyrtzidis      BaseD = RT->getDecl();
141b526a871af40b84d9878eded54a181bf4003b376Argyrios Kyrtzidis    }
142b526a871af40b84d9878eded54a181bf4003b376Argyrios Kyrtzidis
14337f40572c4c78a8c57a7b45266f8b86db172a7c1Argyrios Kyrtzidis    if (BaseD)
14437f40572c4c78a8c57a7b45266f8b86db172a7c1Argyrios Kyrtzidis      IdxCtx.getEntityInfo(BaseD, BaseEntities.back(), SA);
1452957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis    CXIdxBaseClassInfo BaseInfo = { 0,
1462957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis                         MakeCursorCXXBaseSpecifier(&Base, IdxCtx.CXTU),
147b526a871af40b84d9878eded54a181bf4003b376Argyrios Kyrtzidis                         IdxCtx.getIndexLoc(Loc) };
1482957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis    BaseInfos.push_back(BaseInfo);
1492957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis  }
1502957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis
1512957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis  for (unsigned i = 0, e = BaseInfos.size(); i != e; ++i) {
15237f40572c4c78a8c57a7b45266f8b86db172a7c1Argyrios Kyrtzidis    if (BaseEntities[i].name && BaseEntities[i].USR)
1532957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis      BaseInfos[i].base = &BaseEntities[i];
1542957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis  }
1552957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis
1562957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis  for (unsigned i = 0, e = BaseInfos.size(); i != e; ++i)
1572957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis    CXBases.push_back(&BaseInfos[i]);
1582957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis}
1592957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis
160b526a871af40b84d9878eded54a181bf4003b376Argyrios KyrtzidisSourceLocation IndexingContext::CXXBasesListInfo::getBaseLoc(
161b526a871af40b84d9878eded54a181bf4003b376Argyrios Kyrtzidis                                           const CXXBaseSpecifier &Base) const {
162b526a871af40b84d9878eded54a181bf4003b376Argyrios Kyrtzidis  SourceLocation Loc = Base.getSourceRange().getBegin();
163b526a871af40b84d9878eded54a181bf4003b376Argyrios Kyrtzidis  TypeLoc TL;
164b526a871af40b84d9878eded54a181bf4003b376Argyrios Kyrtzidis  if (Base.getTypeSourceInfo())
165b526a871af40b84d9878eded54a181bf4003b376Argyrios Kyrtzidis    TL = Base.getTypeSourceInfo()->getTypeLoc();
166b526a871af40b84d9878eded54a181bf4003b376Argyrios Kyrtzidis  if (TL.isNull())
167b526a871af40b84d9878eded54a181bf4003b376Argyrios Kyrtzidis    return Loc;
168b526a871af40b84d9878eded54a181bf4003b376Argyrios Kyrtzidis
169b526a871af40b84d9878eded54a181bf4003b376Argyrios Kyrtzidis  if (const QualifiedTypeLoc *QL = dyn_cast<QualifiedTypeLoc>(&TL))
170b526a871af40b84d9878eded54a181bf4003b376Argyrios Kyrtzidis    TL = QL->getUnqualifiedLoc();
171b526a871af40b84d9878eded54a181bf4003b376Argyrios Kyrtzidis
172b526a871af40b84d9878eded54a181bf4003b376Argyrios Kyrtzidis  if (const ElaboratedTypeLoc *EL = dyn_cast<ElaboratedTypeLoc>(&TL))
173b526a871af40b84d9878eded54a181bf4003b376Argyrios Kyrtzidis    return EL->getNamedTypeLoc().getBeginLoc();
174b526a871af40b84d9878eded54a181bf4003b376Argyrios Kyrtzidis  if (const DependentNameTypeLoc *DL = dyn_cast<DependentNameTypeLoc>(&TL))
175b526a871af40b84d9878eded54a181bf4003b376Argyrios Kyrtzidis    return DL->getNameLoc();
176b526a871af40b84d9878eded54a181bf4003b376Argyrios Kyrtzidis  if (const DependentTemplateSpecializationTypeLoc *
177b526a871af40b84d9878eded54a181bf4003b376Argyrios Kyrtzidis        DTL = dyn_cast<DependentTemplateSpecializationTypeLoc>(&TL))
17855d23c925b058be29b792008ddb7d68f6c4fa9a0Abramo Bagnara    return DTL->getTemplateNameLoc();
179b526a871af40b84d9878eded54a181bf4003b376Argyrios Kyrtzidis
180b526a871af40b84d9878eded54a181bf4003b376Argyrios Kyrtzidis  return Loc;
181b526a871af40b84d9878eded54a181bf4003b376Argyrios Kyrtzidis}
182b526a871af40b84d9878eded54a181bf4003b376Argyrios Kyrtzidis
183643d3ce93c501d19353f2fa578fee3e97f1d1b4bArgyrios Kyrtzidisconst char *ScratchAlloc::toCStr(StringRef Str) {
1844e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis  if (Str.empty())
1854e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis    return "";
1864e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis  if (Str.data()[Str.size()] == '\0')
1874e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis    return Str.data();
18837f40572c4c78a8c57a7b45266f8b86db172a7c1Argyrios Kyrtzidis  return copyCStr(Str);
18937f40572c4c78a8c57a7b45266f8b86db172a7c1Argyrios Kyrtzidis}
19037f40572c4c78a8c57a7b45266f8b86db172a7c1Argyrios Kyrtzidis
191643d3ce93c501d19353f2fa578fee3e97f1d1b4bArgyrios Kyrtzidisconst char *ScratchAlloc::copyCStr(StringRef Str) {
19237f40572c4c78a8c57a7b45266f8b86db172a7c1Argyrios Kyrtzidis  char *buf = IdxCtx.StrScratch.Allocate<char>(Str.size() + 1);
19337f40572c4c78a8c57a7b45266f8b86db172a7c1Argyrios Kyrtzidis  std::uninitialized_copy(Str.begin(), Str.end(), buf);
19437f40572c4c78a8c57a7b45266f8b86db172a7c1Argyrios Kyrtzidis  buf[Str.size()] = '\0';
19537f40572c4c78a8c57a7b45266f8b86db172a7c1Argyrios Kyrtzidis  return buf;
1964e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis}
1974e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis
1984e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidisvoid IndexingContext::setASTContext(ASTContext &ctx) {
1994e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis  Ctx = &ctx;
2004e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis  static_cast<ASTUnit*>(CXTU->TUData)->setASTContext(&ctx);
2014e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis}
2024e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis
2037fe90f3bfa6bd7f779ecfd4ba201a296a3a1c8cbArgyrios Kyrtzidisvoid IndexingContext::setPreprocessor(Preprocessor &PP) {
2047fe90f3bfa6bd7f779ecfd4ba201a296a3a1c8cbArgyrios Kyrtzidis  static_cast<ASTUnit*>(CXTU->TUData)->setPreprocessor(&PP);
2057fe90f3bfa6bd7f779ecfd4ba201a296a3a1c8cbArgyrios Kyrtzidis}
2067fe90f3bfa6bd7f779ecfd4ba201a296a3a1c8cbArgyrios Kyrtzidis
2073bed3d196dbb5ad2ea7442da4b6c2fbf6bb5fcc6Argyrios Kyrtzidisbool IndexingContext::isFunctionLocalDecl(const Decl *D) {
2083bed3d196dbb5ad2ea7442da4b6c2fbf6bb5fcc6Argyrios Kyrtzidis  assert(D);
2093bed3d196dbb5ad2ea7442da4b6c2fbf6bb5fcc6Argyrios Kyrtzidis
2103bed3d196dbb5ad2ea7442da4b6c2fbf6bb5fcc6Argyrios Kyrtzidis  if (!D->getParentFunctionOrMethod())
2113bed3d196dbb5ad2ea7442da4b6c2fbf6bb5fcc6Argyrios Kyrtzidis    return false;
2123bed3d196dbb5ad2ea7442da4b6c2fbf6bb5fcc6Argyrios Kyrtzidis
2133bed3d196dbb5ad2ea7442da4b6c2fbf6bb5fcc6Argyrios Kyrtzidis  if (const NamedDecl *ND = dyn_cast<NamedDecl>(D)) {
2143bed3d196dbb5ad2ea7442da4b6c2fbf6bb5fcc6Argyrios Kyrtzidis    switch (ND->getLinkage()) {
2153bed3d196dbb5ad2ea7442da4b6c2fbf6bb5fcc6Argyrios Kyrtzidis    case NoLinkage:
2163bed3d196dbb5ad2ea7442da4b6c2fbf6bb5fcc6Argyrios Kyrtzidis    case InternalLinkage:
2173bed3d196dbb5ad2ea7442da4b6c2fbf6bb5fcc6Argyrios Kyrtzidis      return true;
2183bed3d196dbb5ad2ea7442da4b6c2fbf6bb5fcc6Argyrios Kyrtzidis    case UniqueExternalLinkage:
2193bed3d196dbb5ad2ea7442da4b6c2fbf6bb5fcc6Argyrios Kyrtzidis    case ExternalLinkage:
2203bed3d196dbb5ad2ea7442da4b6c2fbf6bb5fcc6Argyrios Kyrtzidis      return false;
2213bed3d196dbb5ad2ea7442da4b6c2fbf6bb5fcc6Argyrios Kyrtzidis    }
2223bed3d196dbb5ad2ea7442da4b6c2fbf6bb5fcc6Argyrios Kyrtzidis  }
2233bed3d196dbb5ad2ea7442da4b6c2fbf6bb5fcc6Argyrios Kyrtzidis
2243bed3d196dbb5ad2ea7442da4b6c2fbf6bb5fcc6Argyrios Kyrtzidis  return true;
2253bed3d196dbb5ad2ea7442da4b6c2fbf6bb5fcc6Argyrios Kyrtzidis}
2263bed3d196dbb5ad2ea7442da4b6c2fbf6bb5fcc6Argyrios Kyrtzidis
227b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidisbool IndexingContext::shouldAbort() {
228b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis  if (!CB.abortQuery)
229b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis    return false;
230b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis  return CB.abortQuery(ClientData, 0);
231b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis}
232b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis
233dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidisvoid IndexingContext::enteredMainFile(const FileEntry *File) {
234dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis  if (File && CB.enteredMainFile) {
235dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis    CXIdxClientFile idxFile = CB.enteredMainFile(ClientData, (CXFile)File, 0);
236dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis    FileMap[File] = idxFile;
237dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis  }
238dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis}
239dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis
2404e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidisvoid IndexingContext::ppIncludedFile(SourceLocation hashLoc,
2414e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis                                     StringRef filename,
2424e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis                                     const FileEntry *File,
2434e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis                                     bool isImport, bool isAngled) {
2444e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis  if (!CB.ppIncludedFile)
2454e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis    return;
2464e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis
247643d3ce93c501d19353f2fa578fee3e97f1d1b4bArgyrios Kyrtzidis  ScratchAlloc SA(*this);
2484e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis  CXIdxIncludedFileInfo Info = { getIndexLoc(hashLoc),
2494e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis                                 SA.toCStr(filename),
250dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis                                 (CXFile)File,
2514e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis                                 isImport, isAngled };
252dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis  CXIdxClientFile idxFile = CB.ppIncludedFile(ClientData, &Info);
253dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis  FileMap[File] = idxFile;
2544e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis}
2554e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis
2562c3e05c266de0d4c465b58ffd129bd0b31604368Argyrios Kyrtzidisvoid IndexingContext::importedModule(SourceLocation Loc,
2572c3e05c266de0d4c465b58ffd129bd0b31604368Argyrios Kyrtzidis                                     StringRef name, bool isIncludeDirective,
2582c3e05c266de0d4c465b58ffd129bd0b31604368Argyrios Kyrtzidis                                     const Module *module) {
2592c3e05c266de0d4c465b58ffd129bd0b31604368Argyrios Kyrtzidis  if (!CB.importedASTFile)
2602c3e05c266de0d4c465b58ffd129bd0b31604368Argyrios Kyrtzidis    return;
2612c3e05c266de0d4c465b58ffd129bd0b31604368Argyrios Kyrtzidis
2622c3e05c266de0d4c465b58ffd129bd0b31604368Argyrios Kyrtzidis  std::string ModuleName = module->getFullModuleName();
2632c3e05c266de0d4c465b58ffd129bd0b31604368Argyrios Kyrtzidis
2642c3e05c266de0d4c465b58ffd129bd0b31604368Argyrios Kyrtzidis  ScratchAlloc SA(*this);
2652c3e05c266de0d4c465b58ffd129bd0b31604368Argyrios Kyrtzidis  CXIdxImportedASTFileInfo Info = {
2662c3e05c266de0d4c465b58ffd129bd0b31604368Argyrios Kyrtzidis                                    (CXFile)module->getASTFile(),
2672c3e05c266de0d4c465b58ffd129bd0b31604368Argyrios Kyrtzidis                                    getIndexLoc(Loc),
2682c3e05c266de0d4c465b58ffd129bd0b31604368Argyrios Kyrtzidis                                    /*isModule=*/true,
2692c3e05c266de0d4c465b58ffd129bd0b31604368Argyrios Kyrtzidis                                    isIncludeDirective,
2702c3e05c266de0d4c465b58ffd129bd0b31604368Argyrios Kyrtzidis                                    SA.toCStr(name),
2712c3e05c266de0d4c465b58ffd129bd0b31604368Argyrios Kyrtzidis                                    ModuleName.c_str(),
2722c3e05c266de0d4c465b58ffd129bd0b31604368Argyrios Kyrtzidis                                  };
2732c3e05c266de0d4c465b58ffd129bd0b31604368Argyrios Kyrtzidis  CXIdxClientASTFile astFile = CB.importedASTFile(ClientData, &Info);
2742c3e05c266de0d4c465b58ffd129bd0b31604368Argyrios Kyrtzidis  (void)astFile;
2752c3e05c266de0d4c465b58ffd129bd0b31604368Argyrios Kyrtzidis}
2762c3e05c266de0d4c465b58ffd129bd0b31604368Argyrios Kyrtzidis
2776ec43adc39006a7fce94188956d0239bd54c0363Argyrios Kyrtzidisvoid IndexingContext::startedTranslationUnit() {
278dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis  CXIdxClientContainer idxCont = 0;
2794e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis  if (CB.startedTranslationUnit)
2804e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis    idxCont = CB.startedTranslationUnit(ClientData, 0);
2814e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis  addContainerInMap(Ctx->getTranslationUnitDecl(), idxCont);
2824e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis}
2834e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis
284b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidisvoid IndexingContext::handleDiagnosticSet(CXDiagnostic CXDiagSet) {
2854e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis  if (!CB.diagnostic)
2864e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis    return;
2874e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis
288b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis  CB.diagnostic(ClientData, CXDiagSet, 0);
2894e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis}
2904e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis
291b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidisbool IndexingContext::handleDecl(const NamedDecl *D,
292dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis                                 SourceLocation Loc, CXCursor Cursor,
293f911242f43ae1b0a85c323631fe817df95c9cbe9Argyrios Kyrtzidis                                 DeclInfo &DInfo,
294f911242f43ae1b0a85c323631fe817df95c9cbe9Argyrios Kyrtzidis                                 const DeclContext *LexicalDC) {
295144b6c0c50b5523609cbac523f168b9e3cb01175Argyrios Kyrtzidis  if (!CB.indexDeclaration || !D)
296b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis    return false;
2972957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis  if (D->isImplicit() && shouldIgnoreIfImplicit(D))
2982957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis    return false;
2994e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis
300643d3ce93c501d19353f2fa578fee3e97f1d1b4bArgyrios Kyrtzidis  ScratchAlloc SA(*this);
3012957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis  getEntityInfo(D, DInfo.EntInfo, SA);
30258d2dbea680a75de266c5eff77cc15c323cfd48aArgyrios Kyrtzidis  if ((!shouldIndexFunctionLocalSymbols() && !DInfo.EntInfo.USR)
303db4d7a5f47d13bf346260ac35eaafd2c92e5606eArgyrios Kyrtzidis      || Loc.isInvalid())
304b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis    return false;
305144b6c0c50b5523609cbac523f168b9e3cb01175Argyrios Kyrtzidis
306f911242f43ae1b0a85c323631fe817df95c9cbe9Argyrios Kyrtzidis  if (!LexicalDC)
307f911242f43ae1b0a85c323631fe817df95c9cbe9Argyrios Kyrtzidis    LexicalDC = D->getLexicalDeclContext();
308f911242f43ae1b0a85c323631fe817df95c9cbe9Argyrios Kyrtzidis
30958d2dbea680a75de266c5eff77cc15c323cfd48aArgyrios Kyrtzidis  if (shouldSuppressRefs())
310c2be04eaec94e20fc825fb98b713112d9d82562fArgyrios Kyrtzidis    markEntityOccurrenceInFile(D, Loc);
311b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis
3122957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis  DInfo.entityInfo = &DInfo.EntInfo;
313dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis  DInfo.cursor = Cursor;
314dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis  DInfo.loc = getIndexLoc(Loc);
315c71d55469e7d5f7b376a30620617a175a9442da9Argyrios Kyrtzidis  DInfo.isImplicit = D->isImplicit();
316dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis
317d786f1a6331246e7d0eedde277f126ab92089eebArgyrios Kyrtzidis  DInfo.attributes = DInfo.EntInfo.attributes;
318d786f1a6331246e7d0eedde277f126ab92089eebArgyrios Kyrtzidis  DInfo.numAttributes = DInfo.EntInfo.numAttributes;
319b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis
320b1febb646bf7a2f319ad894c9833968c52d21711Argyrios Kyrtzidis  getContainerInfo(D->getDeclContext(), DInfo.SemanticContainer);
321b1febb646bf7a2f319ad894c9833968c52d21711Argyrios Kyrtzidis  DInfo.semanticContainer = &DInfo.SemanticContainer;
3226d968363877388f0a0268711d59367907b465ae1Argyrios Kyrtzidis
323f911242f43ae1b0a85c323631fe817df95c9cbe9Argyrios Kyrtzidis  if (LexicalDC == D->getDeclContext()) {
3246d968363877388f0a0268711d59367907b465ae1Argyrios Kyrtzidis    DInfo.lexicalContainer = &DInfo.SemanticContainer;
3256d968363877388f0a0268711d59367907b465ae1Argyrios Kyrtzidis  } else if (isTemplateImplicitInstantiation(D)) {
3266d968363877388f0a0268711d59367907b465ae1Argyrios Kyrtzidis    // Implicit instantiations have the lexical context of where they were
3276d968363877388f0a0268711d59367907b465ae1Argyrios Kyrtzidis    // instantiated first. We choose instead the semantic context because:
3286d968363877388f0a0268711d59367907b465ae1Argyrios Kyrtzidis    // 1) at the time that we see the instantiation we have not seen the
3296d968363877388f0a0268711d59367907b465ae1Argyrios Kyrtzidis    //   function where it occurred yet.
3306d968363877388f0a0268711d59367907b465ae1Argyrios Kyrtzidis    // 2) the lexical context of the first instantiation is not useful
3316d968363877388f0a0268711d59367907b465ae1Argyrios Kyrtzidis    //   information anyway.
3326d968363877388f0a0268711d59367907b465ae1Argyrios Kyrtzidis    DInfo.lexicalContainer = &DInfo.SemanticContainer;
3336d968363877388f0a0268711d59367907b465ae1Argyrios Kyrtzidis  } else {
334f911242f43ae1b0a85c323631fe817df95c9cbe9Argyrios Kyrtzidis    getContainerInfo(LexicalDC, DInfo.LexicalContainer);
3356d968363877388f0a0268711d59367907b465ae1Argyrios Kyrtzidis    DInfo.lexicalContainer = &DInfo.LexicalContainer;
3366d968363877388f0a0268711d59367907b465ae1Argyrios Kyrtzidis  }
3376d968363877388f0a0268711d59367907b465ae1Argyrios Kyrtzidis
3382957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis  if (DInfo.isContainer) {
3392957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis    getContainerInfo(getEntityContainer(D), DInfo.DeclAsContainer);
3402957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis    DInfo.declAsContainer = &DInfo.DeclAsContainer;
3412957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis  }
342b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis
3432957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis  CB.indexDeclaration(ClientData, &DInfo);
344b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis  return true;
345dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis}
346dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis
347b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidisbool IndexingContext::handleObjCContainer(const ObjCContainerDecl *D,
348dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis                                          SourceLocation Loc, CXCursor Cursor,
349dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis                                          ObjCContainerDeclInfo &ContDInfo) {
3506ec43adc39006a7fce94188956d0239bd54c0363Argyrios Kyrtzidis  ContDInfo.ObjCContDeclInfo.declInfo = &ContDInfo;
351b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis  return handleDecl(D, Loc, Cursor, ContDInfo);
3524e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis}
3534e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis
354b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidisbool IndexingContext::handleFunction(const FunctionDecl *D) {
355c71d55469e7d5f7b376a30620617a175a9442da9Argyrios Kyrtzidis  DeclInfo DInfo(!D->isFirstDeclaration(), D->isThisDeclarationADefinition(),
356c71d55469e7d5f7b376a30620617a175a9442da9Argyrios Kyrtzidis                 D->isThisDeclarationADefinition());
357b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis  return handleDecl(D, D->getLocation(), getCursor(D), DInfo);
358dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis}
3594e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis
360b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidisbool IndexingContext::handleVar(const VarDecl *D) {
361c71d55469e7d5f7b376a30620617a175a9442da9Argyrios Kyrtzidis  DeclInfo DInfo(!D->isFirstDeclaration(), D->isThisDeclarationADefinition(),
362c71d55469e7d5f7b376a30620617a175a9442da9Argyrios Kyrtzidis                 /*isContainer=*/false);
363b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis  return handleDecl(D, D->getLocation(), getCursor(D), DInfo);
3644e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis}
3654e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis
366b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidisbool IndexingContext::handleField(const FieldDecl *D) {
367c71d55469e7d5f7b376a30620617a175a9442da9Argyrios Kyrtzidis  DeclInfo DInfo(/*isRedeclaration=*/false, /*isDefinition=*/true,
368c71d55469e7d5f7b376a30620617a175a9442da9Argyrios Kyrtzidis                 /*isContainer=*/false);
369b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis  return handleDecl(D, D->getLocation(), getCursor(D), DInfo);
3704e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis}
3714e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis
372b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidisbool IndexingContext::handleEnumerator(const EnumConstantDecl *D) {
373c71d55469e7d5f7b376a30620617a175a9442da9Argyrios Kyrtzidis  DeclInfo DInfo(/*isRedeclaration=*/false, /*isDefinition=*/true,
374c71d55469e7d5f7b376a30620617a175a9442da9Argyrios Kyrtzidis                 /*isContainer=*/false);
375b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis  return handleDecl(D, D->getLocation(), getCursor(D), DInfo);
3764e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis}
3774e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis
378b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidisbool IndexingContext::handleTagDecl(const TagDecl *D) {
3792957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis  if (const CXXRecordDecl *CXXRD = dyn_cast<CXXRecordDecl>(D))
3802957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis    return handleCXXRecordDecl(CXXRD, D);
3812957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis
382c71d55469e7d5f7b376a30620617a175a9442da9Argyrios Kyrtzidis  DeclInfo DInfo(!D->isFirstDeclaration(), D->isThisDeclarationADefinition(),
383c71d55469e7d5f7b376a30620617a175a9442da9Argyrios Kyrtzidis                 D->isThisDeclarationADefinition());
384b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis  return handleDecl(D, D->getLocation(), getCursor(D), DInfo);
3854e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis}
3864e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis
3872957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidisbool IndexingContext::handleTypedefName(const TypedefNameDecl *D) {
388c71d55469e7d5f7b376a30620617a175a9442da9Argyrios Kyrtzidis  DeclInfo DInfo(!D->isFirstDeclaration(), /*isDefinition=*/true,
389c71d55469e7d5f7b376a30620617a175a9442da9Argyrios Kyrtzidis                 /*isContainer=*/false);
390b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis  return handleDecl(D, D->getLocation(), getCursor(D), DInfo);
391dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis}
3924e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis
393375bb1413c041055262c8a416f20d10474a5eda9Douglas Gregorbool IndexingContext::handleObjCInterface(const ObjCInterfaceDecl *D) {
394c2be04eaec94e20fc825fb98b713112d9d82562fArgyrios Kyrtzidis  // For @class forward declarations, suppress them the same way as references.
395375bb1413c041055262c8a416f20d10474a5eda9Douglas Gregor  if (!D->isThisDeclarationADefinition()) {
39658d2dbea680a75de266c5eff77cc15c323cfd48aArgyrios Kyrtzidis    if (shouldSuppressRefs() && markEntityOccurrenceInFile(D, D->getLocation()))
397c2be04eaec94e20fc825fb98b713112d9d82562fArgyrios Kyrtzidis      return false; // already occurred.
398c2be04eaec94e20fc825fb98b713112d9d82562fArgyrios Kyrtzidis
399375bb1413c041055262c8a416f20d10474a5eda9Douglas Gregor    // FIXME: This seems like the wrong definition for redeclaration.
400ef96ee0be5f100789f451641542a69cd719144d2Douglas Gregor    bool isRedeclaration = D->hasDefinition() || D->getPreviousDecl();
401375bb1413c041055262c8a416f20d10474a5eda9Douglas Gregor    ObjCContainerDeclInfo ContDInfo(/*isForwardRef=*/true, isRedeclaration,
402375bb1413c041055262c8a416f20d10474a5eda9Douglas Gregor                                    /*isImplementation=*/false);
403375bb1413c041055262c8a416f20d10474a5eda9Douglas Gregor    return handleObjCContainer(D, D->getLocation(),
404375bb1413c041055262c8a416f20d10474a5eda9Douglas Gregor                               MakeCursorObjCClassRef(D, D->getLocation(),
405375bb1413c041055262c8a416f20d10474a5eda9Douglas Gregor                                                      CXTU),
406375bb1413c041055262c8a416f20d10474a5eda9Douglas Gregor                               ContDInfo);
407375bb1413c041055262c8a416f20d10474a5eda9Douglas Gregor  }
4084e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis
409643d3ce93c501d19353f2fa578fee3e97f1d1b4bArgyrios Kyrtzidis  ScratchAlloc SA(*this);
4106ec43adc39006a7fce94188956d0239bd54c0363Argyrios Kyrtzidis
4116ec43adc39006a7fce94188956d0239bd54c0363Argyrios Kyrtzidis  CXIdxBaseClassInfo BaseClass;
4122957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis  EntityInfo BaseEntity;
4136ec43adc39006a7fce94188956d0239bd54c0363Argyrios Kyrtzidis  BaseClass.cursor = clang_getNullCursor();
4146ec43adc39006a7fce94188956d0239bd54c0363Argyrios Kyrtzidis  if (ObjCInterfaceDecl *SuperD = D->getSuperClass()) {
4156ec43adc39006a7fce94188956d0239bd54c0363Argyrios Kyrtzidis    getEntityInfo(SuperD, BaseEntity, SA);
4166ec43adc39006a7fce94188956d0239bd54c0363Argyrios Kyrtzidis    SourceLocation SuperLoc = D->getSuperClassLoc();
4176ec43adc39006a7fce94188956d0239bd54c0363Argyrios Kyrtzidis    BaseClass.base = &BaseEntity;
4186ec43adc39006a7fce94188956d0239bd54c0363Argyrios Kyrtzidis    BaseClass.cursor = MakeCursorObjCSuperClassRef(SuperD, SuperLoc, CXTU);
4196ec43adc39006a7fce94188956d0239bd54c0363Argyrios Kyrtzidis    BaseClass.loc = getIndexLoc(SuperLoc);
42090fd67af4aeec7d1661986dd25eabf924e11a76cArgyrios Kyrtzidis
42158d2dbea680a75de266c5eff77cc15c323cfd48aArgyrios Kyrtzidis    if (shouldSuppressRefs())
42290fd67af4aeec7d1661986dd25eabf924e11a76cArgyrios Kyrtzidis      markEntityOccurrenceInFile(SuperD, SuperLoc);
4236ec43adc39006a7fce94188956d0239bd54c0363Argyrios Kyrtzidis  }
4246ec43adc39006a7fce94188956d0239bd54c0363Argyrios Kyrtzidis
4252e5c15be82f362611c5928ce853d0685ff98c766Douglas Gregor  ObjCProtocolList EmptyProtoList;
4265e2a1ff9f28d2eab256d2553e76a9c9d54693875Douglas Gregor  ObjCProtocolListInfo ProtInfo(D->isThisDeclarationADefinition()
4275e2a1ff9f28d2eab256d2553e76a9c9d54693875Douglas Gregor                                  ? D->getReferencedProtocols()
4285e2a1ff9f28d2eab256d2553e76a9c9d54693875Douglas Gregor                                  : EmptyProtoList,
4292e5c15be82f362611c5928ce853d0685ff98c766Douglas Gregor                                *this, SA);
4306ec43adc39006a7fce94188956d0239bd54c0363Argyrios Kyrtzidis
431c71d55469e7d5f7b376a30620617a175a9442da9Argyrios Kyrtzidis  ObjCInterfaceDeclInfo InterInfo(D);
432c71d55469e7d5f7b376a30620617a175a9442da9Argyrios Kyrtzidis  InterInfo.ObjCProtoListInfo = ProtInfo.getListInfo();
433c71d55469e7d5f7b376a30620617a175a9442da9Argyrios Kyrtzidis  InterInfo.ObjCInterDeclInfo.containerInfo = &InterInfo.ObjCContDeclInfo;
4346ec43adc39006a7fce94188956d0239bd54c0363Argyrios Kyrtzidis  InterInfo.ObjCInterDeclInfo.superInfo = D->getSuperClass() ? &BaseClass : 0;
435c71d55469e7d5f7b376a30620617a175a9442da9Argyrios Kyrtzidis  InterInfo.ObjCInterDeclInfo.protocols = &InterInfo.ObjCProtoListInfo;
4366ec43adc39006a7fce94188956d0239bd54c0363Argyrios Kyrtzidis
437b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis  return handleObjCContainer(D, D->getLocation(), getCursor(D), InterInfo);
438dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis}
4394e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis
440b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidisbool IndexingContext::handleObjCImplementation(
441dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis                                              const ObjCImplementationDecl *D) {
442c71d55469e7d5f7b376a30620617a175a9442da9Argyrios Kyrtzidis  ObjCContainerDeclInfo ContDInfo(/*isForwardRef=*/false,
443e7bbab91f5cc899104d0a1dee6059d8413c70eebArgyrios Kyrtzidis                      /*isRedeclaration=*/true,
444c71d55469e7d5f7b376a30620617a175a9442da9Argyrios Kyrtzidis                      /*isImplementation=*/true);
445b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis  return handleObjCContainer(D, D->getLocation(), getCursor(D), ContDInfo);
446dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis}
4474e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis
448b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidisbool IndexingContext::handleObjCProtocol(const ObjCProtocolDecl *D) {
449bd9482d859a74bf2c45ef8b8aedec61c0e1c8374Douglas Gregor  if (!D->isThisDeclarationADefinition()) {
45058d2dbea680a75de266c5eff77cc15c323cfd48aArgyrios Kyrtzidis    if (shouldSuppressRefs() && markEntityOccurrenceInFile(D, D->getLocation()))
451bd9482d859a74bf2c45ef8b8aedec61c0e1c8374Douglas Gregor      return false; // already occurred.
452bd9482d859a74bf2c45ef8b8aedec61c0e1c8374Douglas Gregor
453bd9482d859a74bf2c45ef8b8aedec61c0e1c8374Douglas Gregor    // FIXME: This seems like the wrong definition for redeclaration.
454ef96ee0be5f100789f451641542a69cd719144d2Douglas Gregor    bool isRedeclaration = D->hasDefinition() || D->getPreviousDecl();
455bd9482d859a74bf2c45ef8b8aedec61c0e1c8374Douglas Gregor    ObjCContainerDeclInfo ContDInfo(/*isForwardRef=*/true,
456bd9482d859a74bf2c45ef8b8aedec61c0e1c8374Douglas Gregor                                    isRedeclaration,
457bd9482d859a74bf2c45ef8b8aedec61c0e1c8374Douglas Gregor                                    /*isImplementation=*/false);
458bd9482d859a74bf2c45ef8b8aedec61c0e1c8374Douglas Gregor    return handleObjCContainer(D, D->getLocation(),
459bd9482d859a74bf2c45ef8b8aedec61c0e1c8374Douglas Gregor                               MakeCursorObjCProtocolRef(D, D->getLocation(),
460bd9482d859a74bf2c45ef8b8aedec61c0e1c8374Douglas Gregor                                                         CXTU),
461bd9482d859a74bf2c45ef8b8aedec61c0e1c8374Douglas Gregor                               ContDInfo);
462bd9482d859a74bf2c45ef8b8aedec61c0e1c8374Douglas Gregor  }
463bd9482d859a74bf2c45ef8b8aedec61c0e1c8374Douglas Gregor
464643d3ce93c501d19353f2fa578fee3e97f1d1b4bArgyrios Kyrtzidis  ScratchAlloc SA(*this);
4655e2a1ff9f28d2eab256d2553e76a9c9d54693875Douglas Gregor  ObjCProtocolList EmptyProtoList;
4665e2a1ff9f28d2eab256d2553e76a9c9d54693875Douglas Gregor  ObjCProtocolListInfo ProtListInfo(D->isThisDeclarationADefinition()
4675e2a1ff9f28d2eab256d2553e76a9c9d54693875Douglas Gregor                                      ? D->getReferencedProtocols()
4685e2a1ff9f28d2eab256d2553e76a9c9d54693875Douglas Gregor                                      : EmptyProtoList,
4695e2a1ff9f28d2eab256d2553e76a9c9d54693875Douglas Gregor                                    *this, SA);
470dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis
471c71d55469e7d5f7b376a30620617a175a9442da9Argyrios Kyrtzidis  ObjCProtocolDeclInfo ProtInfo(D);
472c71d55469e7d5f7b376a30620617a175a9442da9Argyrios Kyrtzidis  ProtInfo.ObjCProtoRefListInfo = ProtListInfo.getListInfo();
4734e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis
474b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis  return handleObjCContainer(D, D->getLocation(), getCursor(D), ProtInfo);
4754e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis}
4764e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis
477b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidisbool IndexingContext::handleObjCCategory(const ObjCCategoryDecl *D) {
478d786f1a6331246e7d0eedde277f126ab92089eebArgyrios Kyrtzidis  ScratchAlloc SA(*this);
479d786f1a6331246e7d0eedde277f126ab92089eebArgyrios Kyrtzidis
480c71d55469e7d5f7b376a30620617a175a9442da9Argyrios Kyrtzidis  ObjCCategoryDeclInfo CatDInfo(/*isImplementation=*/false);
4812957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis  EntityInfo ClassEntity;
48221ee5707e6e59d982d2f2ae28e079c7ff46dc519Argyrios Kyrtzidis  const ObjCInterfaceDecl *IFaceD = D->getClassInterface();
48321ee5707e6e59d982d2f2ae28e079c7ff46dc519Argyrios Kyrtzidis  SourceLocation ClassLoc = D->getLocation();
484b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis  SourceLocation CategoryLoc = D->IsClassExtension() ? ClassLoc
485b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis                                                     : D->getCategoryNameLoc();
486c6b4a5099588fd21b49c80f730a596a64b2766c6Argyrios Kyrtzidis  getEntityInfo(IFaceD, ClassEntity, SA);
487dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis
48858d2dbea680a75de266c5eff77cc15c323cfd48aArgyrios Kyrtzidis  if (shouldSuppressRefs())
489c2be04eaec94e20fc825fb98b713112d9d82562fArgyrios Kyrtzidis    markEntityOccurrenceInFile(IFaceD, ClassLoc);
490c2be04eaec94e20fc825fb98b713112d9d82562fArgyrios Kyrtzidis
491c10a4c8baff3164bee9b7fc293679a5a5a90eb74Argyrios Kyrtzidis  ObjCProtocolListInfo ProtInfo(D->getReferencedProtocols(), *this, SA);
492c10a4c8baff3164bee9b7fc293679a5a5a90eb74Argyrios Kyrtzidis
4936ec43adc39006a7fce94188956d0239bd54c0363Argyrios Kyrtzidis  CatDInfo.ObjCCatDeclInfo.containerInfo = &CatDInfo.ObjCContDeclInfo;
494c6b4a5099588fd21b49c80f730a596a64b2766c6Argyrios Kyrtzidis  if (IFaceD) {
495c6b4a5099588fd21b49c80f730a596a64b2766c6Argyrios Kyrtzidis    CatDInfo.ObjCCatDeclInfo.objcClass = &ClassEntity;
496c6b4a5099588fd21b49c80f730a596a64b2766c6Argyrios Kyrtzidis    CatDInfo.ObjCCatDeclInfo.classCursor =
497c6b4a5099588fd21b49c80f730a596a64b2766c6Argyrios Kyrtzidis        MakeCursorObjCClassRef(IFaceD, ClassLoc, CXTU);
498c6b4a5099588fd21b49c80f730a596a64b2766c6Argyrios Kyrtzidis  } else {
499c6b4a5099588fd21b49c80f730a596a64b2766c6Argyrios Kyrtzidis    CatDInfo.ObjCCatDeclInfo.objcClass = 0;
500c6b4a5099588fd21b49c80f730a596a64b2766c6Argyrios Kyrtzidis    CatDInfo.ObjCCatDeclInfo.classCursor = clang_getNullCursor();
501c6b4a5099588fd21b49c80f730a596a64b2766c6Argyrios Kyrtzidis  }
50221ee5707e6e59d982d2f2ae28e079c7ff46dc519Argyrios Kyrtzidis  CatDInfo.ObjCCatDeclInfo.classLoc = getIndexLoc(ClassLoc);
503c10a4c8baff3164bee9b7fc293679a5a5a90eb74Argyrios Kyrtzidis  CatDInfo.ObjCProtoListInfo = ProtInfo.getListInfo();
504c10a4c8baff3164bee9b7fc293679a5a5a90eb74Argyrios Kyrtzidis  CatDInfo.ObjCCatDeclInfo.protocols = &CatDInfo.ObjCProtoListInfo;
505c10a4c8baff3164bee9b7fc293679a5a5a90eb74Argyrios Kyrtzidis
506b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis  return handleObjCContainer(D, CategoryLoc, getCursor(D), CatDInfo);
507dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis}
508dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis
509b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidisbool IndexingContext::handleObjCCategoryImpl(const ObjCCategoryImplDecl *D) {
510d786f1a6331246e7d0eedde277f126ab92089eebArgyrios Kyrtzidis  ScratchAlloc SA(*this);
511d786f1a6331246e7d0eedde277f126ab92089eebArgyrios Kyrtzidis
512dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis  const ObjCCategoryDecl *CatD = D->getCategoryDecl();
513c71d55469e7d5f7b376a30620617a175a9442da9Argyrios Kyrtzidis  ObjCCategoryDeclInfo CatDInfo(/*isImplementation=*/true);
5142957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis  EntityInfo ClassEntity;
5153e340a67f4522a2f633a719cb7f3389fe2474374Argyrios Kyrtzidis  const ObjCInterfaceDecl *IFaceD = CatD->getClassInterface();
5163e340a67f4522a2f633a719cb7f3389fe2474374Argyrios Kyrtzidis  SourceLocation ClassLoc = D->getLocation();
517c6994005dc9f677c831b8e90bdab483cc2197c29Argyrios Kyrtzidis  SourceLocation CategoryLoc = D->getCategoryNameLoc();
5183e340a67f4522a2f633a719cb7f3389fe2474374Argyrios Kyrtzidis  getEntityInfo(IFaceD, ClassEntity, SA);
519dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis
52058d2dbea680a75de266c5eff77cc15c323cfd48aArgyrios Kyrtzidis  if (shouldSuppressRefs())
52105b7846d871fb0d3229e4b30fa5935bc858f3547Argyrios Kyrtzidis    markEntityOccurrenceInFile(IFaceD, ClassLoc);
52205b7846d871fb0d3229e4b30fa5935bc858f3547Argyrios Kyrtzidis
5236ec43adc39006a7fce94188956d0239bd54c0363Argyrios Kyrtzidis  CatDInfo.ObjCCatDeclInfo.containerInfo = &CatDInfo.ObjCContDeclInfo;
5243e340a67f4522a2f633a719cb7f3389fe2474374Argyrios Kyrtzidis  if (IFaceD) {
5253e340a67f4522a2f633a719cb7f3389fe2474374Argyrios Kyrtzidis    CatDInfo.ObjCCatDeclInfo.objcClass = &ClassEntity;
5263e340a67f4522a2f633a719cb7f3389fe2474374Argyrios Kyrtzidis    CatDInfo.ObjCCatDeclInfo.classCursor =
5273e340a67f4522a2f633a719cb7f3389fe2474374Argyrios Kyrtzidis        MakeCursorObjCClassRef(IFaceD, ClassLoc, CXTU);
5283e340a67f4522a2f633a719cb7f3389fe2474374Argyrios Kyrtzidis  } else {
5293e340a67f4522a2f633a719cb7f3389fe2474374Argyrios Kyrtzidis    CatDInfo.ObjCCatDeclInfo.objcClass = 0;
5303e340a67f4522a2f633a719cb7f3389fe2474374Argyrios Kyrtzidis    CatDInfo.ObjCCatDeclInfo.classCursor = clang_getNullCursor();
5313e340a67f4522a2f633a719cb7f3389fe2474374Argyrios Kyrtzidis  }
5323e340a67f4522a2f633a719cb7f3389fe2474374Argyrios Kyrtzidis  CatDInfo.ObjCCatDeclInfo.classLoc = getIndexLoc(ClassLoc);
533c10a4c8baff3164bee9b7fc293679a5a5a90eb74Argyrios Kyrtzidis  CatDInfo.ObjCCatDeclInfo.protocols = 0;
534c10a4c8baff3164bee9b7fc293679a5a5a90eb74Argyrios Kyrtzidis
535b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis  return handleObjCContainer(D, CategoryLoc, getCursor(D), CatDInfo);
5364e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis}
5374e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis
538b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidisbool IndexingContext::handleObjCMethod(const ObjCMethodDecl *D) {
539c71d55469e7d5f7b376a30620617a175a9442da9Argyrios Kyrtzidis  DeclInfo DInfo(!D->isCanonicalDecl(), D->isThisDeclarationADefinition(),
540c71d55469e7d5f7b376a30620617a175a9442da9Argyrios Kyrtzidis                 D->isThisDeclarationADefinition());
541b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis  return handleDecl(D, D->getLocation(), getCursor(D), DInfo);
542b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis}
543b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis
544b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidisbool IndexingContext::handleSynthesizedObjCProperty(
545b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis                                                const ObjCPropertyImplDecl *D) {
546b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis  ObjCPropertyDecl *PD = D->getPropertyDecl();
547b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis  return handleReference(PD, D->getLocation(), getCursor(D), 0, D->getDeclContext());
5484e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis}
5494e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis
550b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidisbool IndexingContext::handleSynthesizedObjCMethod(const ObjCMethodDecl *D,
551f911242f43ae1b0a85c323631fe817df95c9cbe9Argyrios Kyrtzidis                                                  SourceLocation Loc,
552f911242f43ae1b0a85c323631fe817df95c9cbe9Argyrios Kyrtzidis                                                 const DeclContext *LexicalDC) {
553b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis  DeclInfo DInfo(/*isRedeclaration=*/true, /*isDefinition=*/true,
554b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis                 /*isContainer=*/false);
555f911242f43ae1b0a85c323631fe817df95c9cbe9Argyrios Kyrtzidis  return handleDecl(D, Loc, getCursor(D), DInfo, LexicalDC);
556b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis}
557b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis
558b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidisbool IndexingContext::handleObjCProperty(const ObjCPropertyDecl *D) {
559d786f1a6331246e7d0eedde277f126ab92089eebArgyrios Kyrtzidis  ScratchAlloc SA(*this);
560d786f1a6331246e7d0eedde277f126ab92089eebArgyrios Kyrtzidis
561792db266f3d2f12a7a16bf37d90074f54bca1e6fArgyrios Kyrtzidis  ObjCPropertyDeclInfo DInfo;
562792db266f3d2f12a7a16bf37d90074f54bca1e6fArgyrios Kyrtzidis  EntityInfo GetterEntity;
563792db266f3d2f12a7a16bf37d90074f54bca1e6fArgyrios Kyrtzidis  EntityInfo SetterEntity;
564792db266f3d2f12a7a16bf37d90074f54bca1e6fArgyrios Kyrtzidis
565792db266f3d2f12a7a16bf37d90074f54bca1e6fArgyrios Kyrtzidis  DInfo.ObjCPropDeclInfo.declInfo = &DInfo;
566792db266f3d2f12a7a16bf37d90074f54bca1e6fArgyrios Kyrtzidis
567792db266f3d2f12a7a16bf37d90074f54bca1e6fArgyrios Kyrtzidis  if (ObjCMethodDecl *Getter = D->getGetterMethodDecl()) {
568792db266f3d2f12a7a16bf37d90074f54bca1e6fArgyrios Kyrtzidis    getEntityInfo(Getter, GetterEntity, SA);
569792db266f3d2f12a7a16bf37d90074f54bca1e6fArgyrios Kyrtzidis    DInfo.ObjCPropDeclInfo.getter = &GetterEntity;
570792db266f3d2f12a7a16bf37d90074f54bca1e6fArgyrios Kyrtzidis  } else {
571792db266f3d2f12a7a16bf37d90074f54bca1e6fArgyrios Kyrtzidis    DInfo.ObjCPropDeclInfo.getter = 0;
572792db266f3d2f12a7a16bf37d90074f54bca1e6fArgyrios Kyrtzidis  }
573792db266f3d2f12a7a16bf37d90074f54bca1e6fArgyrios Kyrtzidis  if (ObjCMethodDecl *Setter = D->getSetterMethodDecl()) {
574792db266f3d2f12a7a16bf37d90074f54bca1e6fArgyrios Kyrtzidis    getEntityInfo(Setter, SetterEntity, SA);
575792db266f3d2f12a7a16bf37d90074f54bca1e6fArgyrios Kyrtzidis    DInfo.ObjCPropDeclInfo.setter = &SetterEntity;
576792db266f3d2f12a7a16bf37d90074f54bca1e6fArgyrios Kyrtzidis  } else {
577792db266f3d2f12a7a16bf37d90074f54bca1e6fArgyrios Kyrtzidis    DInfo.ObjCPropDeclInfo.setter = 0;
578792db266f3d2f12a7a16bf37d90074f54bca1e6fArgyrios Kyrtzidis  }
579792db266f3d2f12a7a16bf37d90074f54bca1e6fArgyrios Kyrtzidis
580b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis  return handleDecl(D, D->getLocation(), getCursor(D), DInfo);
5814e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis}
5824e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis
58368478b0cc1ff03c0d13ceca6800c5becf08791e7Argyrios Kyrtzidisbool IndexingContext::handleNamespace(const NamespaceDecl *D) {
58468478b0cc1ff03c0d13ceca6800c5becf08791e7Argyrios Kyrtzidis  DeclInfo DInfo(/*isRedeclaration=*/!D->isOriginalNamespace(),
58568478b0cc1ff03c0d13ceca6800c5becf08791e7Argyrios Kyrtzidis                 /*isDefinition=*/true,
58668478b0cc1ff03c0d13ceca6800c5becf08791e7Argyrios Kyrtzidis                 /*isContainer=*/true);
58768478b0cc1ff03c0d13ceca6800c5becf08791e7Argyrios Kyrtzidis  return handleDecl(D, D->getLocation(), getCursor(D), DInfo);
58868478b0cc1ff03c0d13ceca6800c5becf08791e7Argyrios Kyrtzidis}
58968478b0cc1ff03c0d13ceca6800c5becf08791e7Argyrios Kyrtzidis
5902957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidisbool IndexingContext::handleClassTemplate(const ClassTemplateDecl *D) {
5912957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis  return handleCXXRecordDecl(D->getTemplatedDecl(), D);
5922957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis}
5932957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis
5942957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidisbool IndexingContext::handleFunctionTemplate(const FunctionTemplateDecl *D) {
5952957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis  DeclInfo DInfo(/*isRedeclaration=*/!D->isCanonicalDecl(),
5962957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis                 /*isDefinition=*/D->isThisDeclarationADefinition(),
5972957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis                 /*isContainer=*/D->isThisDeclarationADefinition());
5982957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis  return handleDecl(D, D->getLocation(), getCursor(D), DInfo);
5992957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis}
6002957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis
6012957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidisbool IndexingContext::handleTypeAliasTemplate(const TypeAliasTemplateDecl *D) {
6022957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis  DeclInfo DInfo(/*isRedeclaration=*/!D->isCanonicalDecl(),
6032957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis                 /*isDefinition=*/true, /*isContainer=*/false);
6042957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis  return handleDecl(D, D->getLocation(), getCursor(D), DInfo);
6052957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis}
6062957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis
607b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidisbool IndexingContext::handleReference(const NamedDecl *D, SourceLocation Loc,
6084e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis                                      const NamedDecl *Parent,
6094e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis                                      const DeclContext *DC,
610aca19be8731fc31cff68702de0dc7f30ce908979Argyrios Kyrtzidis                                      const Expr *E,
611aca19be8731fc31cff68702de0dc7f30ce908979Argyrios Kyrtzidis                                      CXIdxEntityRefKind Kind) {
612d6c8209fd1567db9c2721f441b50cb23cdf8d835Argyrios Kyrtzidis  if (!D)
613b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis    return false;
614b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis
615b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis  CXCursor Cursor = E ? MakeCXCursor(const_cast<Expr*>(E),
616b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis                                     const_cast<Decl*>(cast<Decl>(DC)), CXTU)
617b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis                      : getRefCursor(D, Loc);
618b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis  return handleReference(D, Loc, Cursor, Parent, DC, E, Kind);
619b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis}
620b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis
621b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidisbool IndexingContext::handleReference(const NamedDecl *D, SourceLocation Loc,
622b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis                                      CXCursor Cursor,
623b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis                                      const NamedDecl *Parent,
624b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis                                      const DeclContext *DC,
625b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis                                      const Expr *E,
626b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis                                      CXIdxEntityRefKind Kind) {
6272957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis  if (!CB.indexEntityReference)
628b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis    return false;
6292957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis
6302957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis  if (!D)
631b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis    return false;
6324e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis  if (Loc.isInvalid())
633b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis    return false;
6343bed3d196dbb5ad2ea7442da4b6c2fbf6bb5fcc6Argyrios Kyrtzidis  if (!shouldIndexFunctionLocalSymbols() && isFunctionLocalDecl(D))
635b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis    return false;
6364e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis  if (isNotFromSourceFile(D->getLocation()))
637b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis    return false;
6382957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis  if (D->isImplicit() && shouldIgnoreIfImplicit(D))
6392957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis    return false;
6402957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis
64158d2dbea680a75de266c5eff77cc15c323cfd48aArgyrios Kyrtzidis  if (shouldSuppressRefs()) {
6422957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis    if (markEntityOccurrenceInFile(D, Loc))
6432957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis      return false; // already occurred.
6442957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis  }
645c6b4a5099588fd21b49c80f730a596a64b2766c6Argyrios Kyrtzidis
646643d3ce93c501d19353f2fa578fee3e97f1d1b4bArgyrios Kyrtzidis  ScratchAlloc SA(*this);
6472957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis  EntityInfo RefEntity, ParentEntity;
648144b6c0c50b5523609cbac523f168b9e3cb01175Argyrios Kyrtzidis  getEntityInfo(D, RefEntity, SA);
649144b6c0c50b5523609cbac523f168b9e3cb01175Argyrios Kyrtzidis  if (!RefEntity.USR)
650b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis    return false;
651144b6c0c50b5523609cbac523f168b9e3cb01175Argyrios Kyrtzidis
652144b6c0c50b5523609cbac523f168b9e3cb01175Argyrios Kyrtzidis  getEntityInfo(Parent, ParentEntity, SA);
653144b6c0c50b5523609cbac523f168b9e3cb01175Argyrios Kyrtzidis
6542957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis  ContainerInfo Container;
6552957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis  getContainerInfo(DC, Container);
656c6b4a5099588fd21b49c80f730a596a64b2766c6Argyrios Kyrtzidis
657b1febb646bf7a2f319ad894c9833968c52d21711Argyrios Kyrtzidis  CXIdxEntityRefInfo Info = { Kind,
658b1febb646bf7a2f319ad894c9833968c52d21711Argyrios Kyrtzidis                              Cursor,
6594e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis                              getIndexLoc(Loc),
660dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis                              &RefEntity,
661c6b4a5099588fd21b49c80f730a596a64b2766c6Argyrios Kyrtzidis                              Parent ? &ParentEntity : 0,
662b1febb646bf7a2f319ad894c9833968c52d21711Argyrios Kyrtzidis                              &Container };
6634e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis  CB.indexEntityReference(ClientData, &Info);
664b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis  return true;
6654e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis}
6664e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis
6674e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidisbool IndexingContext::isNotFromSourceFile(SourceLocation Loc) const {
6684e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis  if (Loc.isInvalid())
6694e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis    return true;
6704e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis  SourceManager &SM = Ctx->getSourceManager();
6714e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis  SourceLocation FileLoc = SM.getFileLoc(Loc);
6724e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis  FileID FID = SM.getFileID(FileLoc);
6734e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis  return SM.getFileEntryForID(FID) == 0;
6744e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis}
6754e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis
6764e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidisvoid IndexingContext::addContainerInMap(const DeclContext *DC,
677dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis                                        CXIdxClientContainer container) {
6782957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis  if (!DC)
6792957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis    return;
6802957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis
6814e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis  ContainerMapTy::iterator I = ContainerMap.find(DC);
6824e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis  if (I == ContainerMap.end()) {
6834e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis    if (container)
6844e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis      ContainerMap[DC] = container;
6854e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis    return;
6864e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis  }
6874e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis  // Allow changing the container of a previously seen DeclContext so we
6884e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis  // can handle invalid user code, like a function re-definition.
6894e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis  if (container)
6904e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis    I->second = container;
6914e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis  else
6924e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis    ContainerMap.erase(I);
6934e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis}
6944e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis
6952957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios KyrtzidisCXIdxClientEntity IndexingContext::getClientEntity(const Decl *D) const {
6962957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis  if (!D)
6972957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis    return 0;
6982957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis  EntityMapTy::const_iterator I = EntityMap.find(D);
6992957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis  if (I == EntityMap.end())
7002957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis    return 0;
7012957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis  return I->second;
7022957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis}
7032957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis
7042957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidisvoid IndexingContext::setClientEntity(const Decl *D, CXIdxClientEntity client) {
7052957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis  if (!D)
7062957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis    return;
7072957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis  EntityMap[D] = client;
7082957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis}
7092957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis
7102957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidisbool IndexingContext::handleCXXRecordDecl(const CXXRecordDecl *RD,
7112957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis                                          const NamedDecl *OrigD) {
71237f40572c4c78a8c57a7b45266f8b86db172a7c1Argyrios Kyrtzidis  if (RD->isThisDeclarationADefinition()) {
713643d3ce93c501d19353f2fa578fee3e97f1d1b4bArgyrios Kyrtzidis    ScratchAlloc SA(*this);
71437f40572c4c78a8c57a7b45266f8b86db172a7c1Argyrios Kyrtzidis    CXXClassDeclInfo CXXDInfo(/*isRedeclaration=*/!OrigD->isCanonicalDecl(),
71537f40572c4c78a8c57a7b45266f8b86db172a7c1Argyrios Kyrtzidis                           /*isDefinition=*/RD->isThisDeclarationADefinition());
71637f40572c4c78a8c57a7b45266f8b86db172a7c1Argyrios Kyrtzidis    CXXBasesListInfo BaseList(RD, *this, SA);
71737f40572c4c78a8c57a7b45266f8b86db172a7c1Argyrios Kyrtzidis    CXXDInfo.CXXClassInfo.declInfo = &CXXDInfo;
71837f40572c4c78a8c57a7b45266f8b86db172a7c1Argyrios Kyrtzidis    CXXDInfo.CXXClassInfo.bases = BaseList.getBases();
71937f40572c4c78a8c57a7b45266f8b86db172a7c1Argyrios Kyrtzidis    CXXDInfo.CXXClassInfo.numBases = BaseList.getNumBases();
72037f40572c4c78a8c57a7b45266f8b86db172a7c1Argyrios Kyrtzidis
72158d2dbea680a75de266c5eff77cc15c323cfd48aArgyrios Kyrtzidis    if (shouldSuppressRefs()) {
7227b318d16992cb68567c3ee217b86cac2ed11d5d8Argyrios Kyrtzidis      // Go through bases and mark them as referenced.
7237b318d16992cb68567c3ee217b86cac2ed11d5d8Argyrios Kyrtzidis      for (unsigned i = 0, e = BaseList.getNumBases(); i != e; ++i) {
7247b318d16992cb68567c3ee217b86cac2ed11d5d8Argyrios Kyrtzidis        const CXIdxBaseClassInfo *baseInfo = BaseList.getBases()[i];
7257b318d16992cb68567c3ee217b86cac2ed11d5d8Argyrios Kyrtzidis        if (baseInfo->base) {
7267b318d16992cb68567c3ee217b86cac2ed11d5d8Argyrios Kyrtzidis          const NamedDecl *BaseD = BaseList.BaseEntities[i].Dcl;
7277b318d16992cb68567c3ee217b86cac2ed11d5d8Argyrios Kyrtzidis          SourceLocation
7287b318d16992cb68567c3ee217b86cac2ed11d5d8Argyrios Kyrtzidis            Loc = SourceLocation::getFromRawEncoding(baseInfo->loc.int_data);
7297b318d16992cb68567c3ee217b86cac2ed11d5d8Argyrios Kyrtzidis          markEntityOccurrenceInFile(BaseD, Loc);
7307b318d16992cb68567c3ee217b86cac2ed11d5d8Argyrios Kyrtzidis        }
7317b318d16992cb68567c3ee217b86cac2ed11d5d8Argyrios Kyrtzidis      }
7327b318d16992cb68567c3ee217b86cac2ed11d5d8Argyrios Kyrtzidis    }
7337b318d16992cb68567c3ee217b86cac2ed11d5d8Argyrios Kyrtzidis
73437f40572c4c78a8c57a7b45266f8b86db172a7c1Argyrios Kyrtzidis    return handleDecl(OrigD, OrigD->getLocation(), getCursor(OrigD), CXXDInfo);
73537f40572c4c78a8c57a7b45266f8b86db172a7c1Argyrios Kyrtzidis  }
7362957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis
73737f40572c4c78a8c57a7b45266f8b86db172a7c1Argyrios Kyrtzidis  DeclInfo DInfo(/*isRedeclaration=*/!OrigD->isCanonicalDecl(),
73837f40572c4c78a8c57a7b45266f8b86db172a7c1Argyrios Kyrtzidis                 /*isDefinition=*/RD->isThisDeclarationADefinition(),
73937f40572c4c78a8c57a7b45266f8b86db172a7c1Argyrios Kyrtzidis                 /*isContainer=*/RD->isThisDeclarationADefinition());
7402957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis  return handleDecl(OrigD, OrigD->getLocation(), getCursor(OrigD), DInfo);
7412957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis}
7422957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis
743b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidisbool IndexingContext::markEntityOccurrenceInFile(const NamedDecl *D,
744b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis                                                 SourceLocation Loc) {
745c2be04eaec94e20fc825fb98b713112d9d82562fArgyrios Kyrtzidis  if (!D || Loc.isInvalid())
746c2be04eaec94e20fc825fb98b713112d9d82562fArgyrios Kyrtzidis    return true;
747c2be04eaec94e20fc825fb98b713112d9d82562fArgyrios Kyrtzidis
748b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis  SourceManager &SM = Ctx->getSourceManager();
749b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis  D = getEntityDecl(D);
750b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis
751c2be04eaec94e20fc825fb98b713112d9d82562fArgyrios Kyrtzidis  std::pair<FileID, unsigned> LocInfo = SM.getDecomposedLoc(SM.getFileLoc(Loc));
752b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis  FileID FID = LocInfo.first;
753b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis  if (FID.isInvalid())
754b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis    return true;
755b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis
756b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis  const FileEntry *FE = SM.getFileEntryForID(FID);
757b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis  if (!FE)
758b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis    return true;
759b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis  RefFileOccurence RefOccur(FE, D);
760b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis  std::pair<llvm::DenseSet<RefFileOccurence>::iterator, bool>
761b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis  res = RefFileOccurences.insert(RefOccur);
762b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis  if (!res.second)
763b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis    return true; // already in map.
764b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis
765b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis  return false;
766b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis}
767b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis
7684e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidisconst NamedDecl *IndexingContext::getEntityDecl(const NamedDecl *D) const {
7694e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis  assert(D);
7704e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis  D = cast<NamedDecl>(D->getCanonicalDecl());
7714e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis
772b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis  if (const ObjCImplementationDecl *
7734e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis               ImplD = dyn_cast<ObjCImplementationDecl>(D)) {
7744e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis    return getEntityDecl(ImplD->getClassInterface());
7754e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis
7764e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis  } else if (const ObjCCategoryImplDecl *
7774e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis               CatImplD = dyn_cast<ObjCCategoryImplDecl>(D)) {
7784e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis    return getEntityDecl(CatImplD->getCategoryDecl());
7792957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis  } else if (const FunctionDecl *FD = dyn_cast<FunctionDecl>(D)) {
7802957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis    if (FunctionTemplateDecl *TemplD = FD->getDescribedFunctionTemplate())
7812957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis      return getEntityDecl(TemplD);
7822957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis  } else if (const CXXRecordDecl *RD = dyn_cast<CXXRecordDecl>(D)) {
7832957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis    if (ClassTemplateDecl *TemplD = RD->getDescribedClassTemplate())
7842957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis      return getEntityDecl(TemplD);
7854e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis  }
7864e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis
7874e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis  return D;
7884e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis}
7894e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis
7904e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidisconst DeclContext *
7912957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios KyrtzidisIndexingContext::getEntityContainer(const Decl *D) const {
7922957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis  const DeclContext *DC = dyn_cast<DeclContext>(D);
7932957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis  if (DC)
7942957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis    return DC;
7952957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis
7962957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis  if (const ClassTemplateDecl *ClassTempl = dyn_cast<ClassTemplateDecl>(D)) {
7972957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis    DC = ClassTempl->getTemplatedDecl();
7982957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis  } if (const FunctionTemplateDecl *
7992957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis          FuncTempl = dyn_cast<FunctionTemplateDecl>(D)) {
8002957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis    DC = FuncTempl->getTemplatedDecl();
8012957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis  }
8022957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis
8032957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis  return DC;
8042957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis}
8052957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis
806dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios KyrtzidisCXIdxClientContainer
8072957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios KyrtzidisIndexingContext::getClientContainerForDC(const DeclContext *DC) const {
8082957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis  if (!DC)
8092957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis    return 0;
8102957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis
8114e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis  ContainerMapTy::const_iterator I = ContainerMap.find(DC);
8123e340a67f4522a2f633a719cb7f3389fe2474374Argyrios Kyrtzidis  if (I == ContainerMap.end())
8133e340a67f4522a2f633a719cb7f3389fe2474374Argyrios Kyrtzidis    return 0;
8142957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis
8154e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis  return I->second;
8164e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis}
8174e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis
818dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios KyrtzidisCXIdxClientFile IndexingContext::getIndexFile(const FileEntry *File) {
8194e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis  if (!File)
8204e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis    return 0;
8214e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis
8224e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis  FileMapTy::iterator FI = FileMap.find(File);
8234e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis  if (FI != FileMap.end())
8244e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis    return FI->second;
8254e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis
826dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis  return 0;
8274e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis}
8284e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis
8294e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios KyrtzidisCXIdxLoc IndexingContext::getIndexLoc(SourceLocation Loc) const {
8304e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis  CXIdxLoc idxLoc =  { {0, 0}, 0 };
8314e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis  if (Loc.isInvalid())
8324e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis    return idxLoc;
8334e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis
8344e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis  idxLoc.ptr_data[0] = (void*)this;
8354e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis  idxLoc.int_data = Loc.getRawEncoding();
8364e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis  return idxLoc;
8374e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis}
8384e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis
8394e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidisvoid IndexingContext::translateLoc(SourceLocation Loc,
840dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis                                   CXIdxClientFile *indexFile, CXFile *file,
8414e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis                                   unsigned *line, unsigned *column,
8424e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis                                   unsigned *offset) {
8434e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis  if (Loc.isInvalid())
8444e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis    return;
8454e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis
8464e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis  SourceManager &SM = Ctx->getSourceManager();
8474e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis  Loc = SM.getFileLoc(Loc);
8484e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis
8494e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis  std::pair<FileID, unsigned> LocInfo = SM.getDecomposedLoc(Loc);
8504e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis  FileID FID = LocInfo.first;
8514e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis  unsigned FileOffset = LocInfo.second;
8524e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis
8534e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis  if (FID.isInvalid())
8544e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis    return;
8554e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis
8564e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis  const FileEntry *FE = SM.getFileEntryForID(FID);
8574e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis  if (indexFile)
8584e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis    *indexFile = getIndexFile(FE);
8594e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis  if (file)
8604e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis    *file = (void *)FE;
8614e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis  if (line)
8624e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis    *line = SM.getLineNumber(FID, FileOffset);
8634e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis  if (column)
8644e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis    *column = SM.getColumnNumber(FID, FileOffset);
8654e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis  if (offset)
8664e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis    *offset = FileOffset;
8674e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis}
8684e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis
869dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidisvoid IndexingContext::getEntityInfo(const NamedDecl *D,
8702957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis                                    EntityInfo &EntityInfo,
871643d3ce93c501d19353f2fa578fee3e97f1d1b4bArgyrios Kyrtzidis                                    ScratchAlloc &SA) {
872c6b4a5099588fd21b49c80f730a596a64b2766c6Argyrios Kyrtzidis  if (!D)
873c6b4a5099588fd21b49c80f730a596a64b2766c6Argyrios Kyrtzidis    return;
8742957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis
875dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis  D = getEntityDecl(D);
8762957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis  EntityInfo.cursor = getCursor(D);
8772957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis  EntityInfo.Dcl = D;
8782957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis  EntityInfo.IndexCtx = this;
879dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis  EntityInfo.kind = CXIdxEntity_Unexposed;
8802957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis  EntityInfo.templateKind = CXIdxEntity_NonTemplate;
881838d3c23204f52ae27a9f5e9a254238a7ac5d41bArgyrios Kyrtzidis  EntityInfo.lang = CXIdxEntityLang_C;
882dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis
883643d3ce93c501d19353f2fa578fee3e97f1d1b4bArgyrios Kyrtzidis  if (D->hasAttrs()) {
884d786f1a6331246e7d0eedde277f126ab92089eebArgyrios Kyrtzidis    EntityInfo.AttrList = AttrListInfo::create(D, *this);
885d786f1a6331246e7d0eedde277f126ab92089eebArgyrios Kyrtzidis    EntityInfo.attributes = EntityInfo.AttrList->getAttrs();
886d786f1a6331246e7d0eedde277f126ab92089eebArgyrios Kyrtzidis    EntityInfo.numAttributes = EntityInfo.AttrList->getNumAttrs();
887643d3ce93c501d19353f2fa578fee3e97f1d1b4bArgyrios Kyrtzidis  }
888643d3ce93c501d19353f2fa578fee3e97f1d1b4bArgyrios Kyrtzidis
889dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis  if (const TagDecl *TD = dyn_cast<TagDecl>(D)) {
890dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis    switch (TD->getTagKind()) {
891dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis    case TTK_Struct:
892dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis      EntityInfo.kind = CXIdxEntity_Struct; break;
893dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis    case TTK_Union:
894dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis      EntityInfo.kind = CXIdxEntity_Union; break;
895dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis    case TTK_Class:
89617d35c36fbae764fcd68fa8b31624078a033aabcJoao Matos      EntityInfo.kind = CXIdxEntity_CXXClass;
89717d35c36fbae764fcd68fa8b31624078a033aabcJoao Matos      EntityInfo.lang = CXIdxEntityLang_CXX;
89817d35c36fbae764fcd68fa8b31624078a033aabcJoao Matos      break;
89917d35c36fbae764fcd68fa8b31624078a033aabcJoao Matos    case TTK_Interface:
90017d35c36fbae764fcd68fa8b31624078a033aabcJoao Matos      EntityInfo.kind = CXIdxEntity_CXXInterface;
90117d35c36fbae764fcd68fa8b31624078a033aabcJoao Matos      EntityInfo.lang = CXIdxEntityLang_CXX;
90217d35c36fbae764fcd68fa8b31624078a033aabcJoao Matos      break;
90317d35c36fbae764fcd68fa8b31624078a033aabcJoao Matos    case TTK_Enum:
90417d35c36fbae764fcd68fa8b31624078a033aabcJoao Matos      EntityInfo.kind = CXIdxEntity_Enum; break;
90517d35c36fbae764fcd68fa8b31624078a033aabcJoao Matos    }
9064e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis
907277b15684582193d26f6c15b40e90a6e45299857Argyrios Kyrtzidis    if (const CXXRecordDecl *CXXRec = dyn_cast<CXXRecordDecl>(D))
908277b15684582193d26f6c15b40e90a6e45299857Argyrios Kyrtzidis      if (!CXXRec->isCLike())
909838d3c23204f52ae27a9f5e9a254238a7ac5d41bArgyrios Kyrtzidis        EntityInfo.lang = CXIdxEntityLang_CXX;
9102957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis
9112957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis    if (isa<ClassTemplatePartialSpecializationDecl>(D)) {
9122957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis      EntityInfo.templateKind = CXIdxEntity_TemplatePartialSpecialization;
9132957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis    } else if (isa<ClassTemplateSpecializationDecl>(D)) {
9142957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis      EntityInfo.templateKind = CXIdxEntity_TemplateSpecialization;
9152957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis    }
9162957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis
917dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis  } else {
918dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis    switch (D->getKind()) {
919dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis    case Decl::Typedef:
920dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis      EntityInfo.kind = CXIdxEntity_Typedef; break;
921dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis    case Decl::Function:
9222957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis      EntityInfo.kind = CXIdxEntity_Function;
9232957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis      break;
924db4d7a5f47d13bf346260ac35eaafd2c92e5606eArgyrios Kyrtzidis    case Decl::ParmVar:
925db4d7a5f47d13bf346260ac35eaafd2c92e5606eArgyrios Kyrtzidis      EntityInfo.kind = CXIdxEntity_Variable;
926db4d7a5f47d13bf346260ac35eaafd2c92e5606eArgyrios Kyrtzidis      break;
927dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis    case Decl::Var:
9282957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis      EntityInfo.kind = CXIdxEntity_Variable;
929838d3c23204f52ae27a9f5e9a254238a7ac5d41bArgyrios Kyrtzidis      if (isa<CXXRecordDecl>(D->getDeclContext())) {
9302957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis        EntityInfo.kind = CXIdxEntity_CXXStaticVariable;
931838d3c23204f52ae27a9f5e9a254238a7ac5d41bArgyrios Kyrtzidis        EntityInfo.lang = CXIdxEntityLang_CXX;
932838d3c23204f52ae27a9f5e9a254238a7ac5d41bArgyrios Kyrtzidis      }
9332957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis      break;
934dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis    case Decl::Field:
935da5f2d2360ace0ea32e4f3194906be4899a76c7dArgyrios Kyrtzidis      EntityInfo.kind = CXIdxEntity_Field;
936da5f2d2360ace0ea32e4f3194906be4899a76c7dArgyrios Kyrtzidis      if (const CXXRecordDecl *
937838d3c23204f52ae27a9f5e9a254238a7ac5d41bArgyrios Kyrtzidis            CXXRec = dyn_cast<CXXRecordDecl>(D->getDeclContext())) {
938838d3c23204f52ae27a9f5e9a254238a7ac5d41bArgyrios Kyrtzidis        // FIXME: isPOD check is not sufficient, a POD can contain methods,
939838d3c23204f52ae27a9f5e9a254238a7ac5d41bArgyrios Kyrtzidis        // we want a isCStructLike check.
940da5f2d2360ace0ea32e4f3194906be4899a76c7dArgyrios Kyrtzidis        if (!CXXRec->isPOD())
941838d3c23204f52ae27a9f5e9a254238a7ac5d41bArgyrios Kyrtzidis          EntityInfo.lang = CXIdxEntityLang_CXX;
942838d3c23204f52ae27a9f5e9a254238a7ac5d41bArgyrios Kyrtzidis      }
943da5f2d2360ace0ea32e4f3194906be4899a76c7dArgyrios Kyrtzidis      break;
944dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis    case Decl::EnumConstant:
945dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis      EntityInfo.kind = CXIdxEntity_EnumConstant; break;
946dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis    case Decl::ObjCInterface:
947838d3c23204f52ae27a9f5e9a254238a7ac5d41bArgyrios Kyrtzidis      EntityInfo.kind = CXIdxEntity_ObjCClass;
948838d3c23204f52ae27a9f5e9a254238a7ac5d41bArgyrios Kyrtzidis      EntityInfo.lang = CXIdxEntityLang_ObjC;
949838d3c23204f52ae27a9f5e9a254238a7ac5d41bArgyrios Kyrtzidis      break;
950dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis    case Decl::ObjCProtocol:
951838d3c23204f52ae27a9f5e9a254238a7ac5d41bArgyrios Kyrtzidis      EntityInfo.kind = CXIdxEntity_ObjCProtocol;
952838d3c23204f52ae27a9f5e9a254238a7ac5d41bArgyrios Kyrtzidis      EntityInfo.lang = CXIdxEntityLang_ObjC;
953838d3c23204f52ae27a9f5e9a254238a7ac5d41bArgyrios Kyrtzidis      break;
954dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis    case Decl::ObjCCategory:
955838d3c23204f52ae27a9f5e9a254238a7ac5d41bArgyrios Kyrtzidis      EntityInfo.kind = CXIdxEntity_ObjCCategory;
956838d3c23204f52ae27a9f5e9a254238a7ac5d41bArgyrios Kyrtzidis      EntityInfo.lang = CXIdxEntityLang_ObjC;
957838d3c23204f52ae27a9f5e9a254238a7ac5d41bArgyrios Kyrtzidis      break;
958dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis    case Decl::ObjCMethod:
959c71d55469e7d5f7b376a30620617a175a9442da9Argyrios Kyrtzidis      if (cast<ObjCMethodDecl>(D)->isInstanceMethod())
960c71d55469e7d5f7b376a30620617a175a9442da9Argyrios Kyrtzidis        EntityInfo.kind = CXIdxEntity_ObjCInstanceMethod;
961c71d55469e7d5f7b376a30620617a175a9442da9Argyrios Kyrtzidis      else
962c71d55469e7d5f7b376a30620617a175a9442da9Argyrios Kyrtzidis        EntityInfo.kind = CXIdxEntity_ObjCClassMethod;
963838d3c23204f52ae27a9f5e9a254238a7ac5d41bArgyrios Kyrtzidis      EntityInfo.lang = CXIdxEntityLang_ObjC;
964c71d55469e7d5f7b376a30620617a175a9442da9Argyrios Kyrtzidis      break;
965dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis    case Decl::ObjCProperty:
966838d3c23204f52ae27a9f5e9a254238a7ac5d41bArgyrios Kyrtzidis      EntityInfo.kind = CXIdxEntity_ObjCProperty;
967838d3c23204f52ae27a9f5e9a254238a7ac5d41bArgyrios Kyrtzidis      EntityInfo.lang = CXIdxEntityLang_ObjC;
968838d3c23204f52ae27a9f5e9a254238a7ac5d41bArgyrios Kyrtzidis      break;
969dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis    case Decl::ObjCIvar:
970838d3c23204f52ae27a9f5e9a254238a7ac5d41bArgyrios Kyrtzidis      EntityInfo.kind = CXIdxEntity_ObjCIvar;
971838d3c23204f52ae27a9f5e9a254238a7ac5d41bArgyrios Kyrtzidis      EntityInfo.lang = CXIdxEntityLang_ObjC;
972838d3c23204f52ae27a9f5e9a254238a7ac5d41bArgyrios Kyrtzidis      break;
9732957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis    case Decl::Namespace:
974838d3c23204f52ae27a9f5e9a254238a7ac5d41bArgyrios Kyrtzidis      EntityInfo.kind = CXIdxEntity_CXXNamespace;
975838d3c23204f52ae27a9f5e9a254238a7ac5d41bArgyrios Kyrtzidis      EntityInfo.lang = CXIdxEntityLang_CXX;
976838d3c23204f52ae27a9f5e9a254238a7ac5d41bArgyrios Kyrtzidis      break;
9772957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis    case Decl::NamespaceAlias:
978838d3c23204f52ae27a9f5e9a254238a7ac5d41bArgyrios Kyrtzidis      EntityInfo.kind = CXIdxEntity_CXXNamespaceAlias;
979838d3c23204f52ae27a9f5e9a254238a7ac5d41bArgyrios Kyrtzidis      EntityInfo.lang = CXIdxEntityLang_CXX;
980838d3c23204f52ae27a9f5e9a254238a7ac5d41bArgyrios Kyrtzidis      break;
9812957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis    case Decl::CXXConstructor:
982838d3c23204f52ae27a9f5e9a254238a7ac5d41bArgyrios Kyrtzidis      EntityInfo.kind = CXIdxEntity_CXXConstructor;
983838d3c23204f52ae27a9f5e9a254238a7ac5d41bArgyrios Kyrtzidis      EntityInfo.lang = CXIdxEntityLang_CXX;
984838d3c23204f52ae27a9f5e9a254238a7ac5d41bArgyrios Kyrtzidis      break;
9852957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis    case Decl::CXXDestructor:
986838d3c23204f52ae27a9f5e9a254238a7ac5d41bArgyrios Kyrtzidis      EntityInfo.kind = CXIdxEntity_CXXDestructor;
987838d3c23204f52ae27a9f5e9a254238a7ac5d41bArgyrios Kyrtzidis      EntityInfo.lang = CXIdxEntityLang_CXX;
988838d3c23204f52ae27a9f5e9a254238a7ac5d41bArgyrios Kyrtzidis      break;
9892957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis    case Decl::CXXConversion:
990838d3c23204f52ae27a9f5e9a254238a7ac5d41bArgyrios Kyrtzidis      EntityInfo.kind = CXIdxEntity_CXXConversionFunction;
991838d3c23204f52ae27a9f5e9a254238a7ac5d41bArgyrios Kyrtzidis      EntityInfo.lang = CXIdxEntityLang_CXX;
992838d3c23204f52ae27a9f5e9a254238a7ac5d41bArgyrios Kyrtzidis      break;
9932957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis    case Decl::CXXMethod: {
9942957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis      const CXXMethodDecl *MD = cast<CXXMethodDecl>(D);
9952957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis      if (MD->isStatic())
9962957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis        EntityInfo.kind = CXIdxEntity_CXXStaticMethod;
9972957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis      else
9982957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis        EntityInfo.kind = CXIdxEntity_CXXInstanceMethod;
999838d3c23204f52ae27a9f5e9a254238a7ac5d41bArgyrios Kyrtzidis      EntityInfo.lang = CXIdxEntityLang_CXX;
10002957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis      break;
10012957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis    }
10022957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis    case Decl::ClassTemplate:
10032957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis      EntityInfo.kind = CXIdxEntity_CXXClass;
10042957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis      EntityInfo.templateKind = CXIdxEntity_Template;
10052957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis      break;
10062957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis    case Decl::FunctionTemplate:
10072957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis      EntityInfo.kind = CXIdxEntity_Function;
10082957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis      EntityInfo.templateKind = CXIdxEntity_Template;
10092957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis      if (const CXXMethodDecl *MD = dyn_cast_or_null<CXXMethodDecl>(
10102957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis                           cast<FunctionTemplateDecl>(D)->getTemplatedDecl())) {
10112957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis        if (isa<CXXConstructorDecl>(MD))
10122957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis          EntityInfo.kind = CXIdxEntity_CXXConstructor;
10132957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis        else if (isa<CXXDestructorDecl>(MD))
10142957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis          EntityInfo.kind = CXIdxEntity_CXXDestructor;
10152957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis        else if (isa<CXXConversionDecl>(MD))
10162957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis          EntityInfo.kind = CXIdxEntity_CXXConversionFunction;
10172957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis        else {
10182957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis          if (MD->isStatic())
10192957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis            EntityInfo.kind = CXIdxEntity_CXXStaticMethod;
10202957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis          else
10212957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis            EntityInfo.kind = CXIdxEntity_CXXInstanceMethod;
10222957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis        }
10232957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis      }
10242957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis      break;
10252957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis    case Decl::TypeAliasTemplate:
10262957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis      EntityInfo.kind = CXIdxEntity_CXXTypeAlias;
10272957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis      EntityInfo.templateKind = CXIdxEntity_Template;
10282957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis      break;
10292957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis    case Decl::TypeAlias:
1030838d3c23204f52ae27a9f5e9a254238a7ac5d41bArgyrios Kyrtzidis      EntityInfo.kind = CXIdxEntity_CXXTypeAlias;
1031838d3c23204f52ae27a9f5e9a254238a7ac5d41bArgyrios Kyrtzidis      EntityInfo.lang = CXIdxEntityLang_CXX;
1032838d3c23204f52ae27a9f5e9a254238a7ac5d41bArgyrios Kyrtzidis      break;
1033dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis    default:
1034dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis      break;
1035dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis    }
1036dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis  }
10374e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis
10382957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis  if (EntityInfo.kind == CXIdxEntity_Unexposed)
10392957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis    return;
10402957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis
10412957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis  if (const FunctionDecl *FD = dyn_cast<FunctionDecl>(D)) {
10422957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis    if (FD->getTemplatedKind() ==
10432957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis          FunctionDecl::TK_FunctionTemplateSpecialization)
10442957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis      EntityInfo.templateKind = CXIdxEntity_TemplateSpecialization;
10452957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis  }
10462957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis
1047838d3c23204f52ae27a9f5e9a254238a7ac5d41bArgyrios Kyrtzidis  if (EntityInfo.templateKind != CXIdxEntity_NonTemplate)
1048838d3c23204f52ae27a9f5e9a254238a7ac5d41bArgyrios Kyrtzidis    EntityInfo.lang = CXIdxEntityLang_CXX;
1049838d3c23204f52ae27a9f5e9a254238a7ac5d41bArgyrios Kyrtzidis
10504e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis  if (IdentifierInfo *II = D->getIdentifier()) {
10514e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis    EntityInfo.name = SA.toCStr(II->getName());
10524e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis
105337f40572c4c78a8c57a7b45266f8b86db172a7c1Argyrios Kyrtzidis  } else if (isa<TagDecl>(D) || isa<FieldDecl>(D) || isa<NamespaceDecl>(D)) {
105437f40572c4c78a8c57a7b45266f8b86db172a7c1Argyrios Kyrtzidis    EntityInfo.name = 0; // anonymous tag/field/namespace.
10554e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis
10564e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis  } else {
105736d592718ff342f762e32cbde73d1113f88cb275Dylan Noblesmith    SmallString<256> StrBuf;
10584e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis    {
105937f40572c4c78a8c57a7b45266f8b86db172a7c1Argyrios Kyrtzidis      llvm::raw_svector_ostream OS(StrBuf);
10604e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis      D->printName(OS);
10614e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis    }
106237f40572c4c78a8c57a7b45266f8b86db172a7c1Argyrios Kyrtzidis    EntityInfo.name = SA.copyCStr(StrBuf.str());
10634e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis  }
10644e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis
1065dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis  {
106636d592718ff342f762e32cbde73d1113f88cb275Dylan Noblesmith    SmallString<512> StrBuf;
106737f40572c4c78a8c57a7b45266f8b86db172a7c1Argyrios Kyrtzidis    bool Ignore = getDeclCursorUSR(D, StrBuf);
1068dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis    if (Ignore) {
1069144b6c0c50b5523609cbac523f168b9e3cb01175Argyrios Kyrtzidis      EntityInfo.USR = 0;
1070dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis    } else {
107137f40572c4c78a8c57a7b45266f8b86db172a7c1Argyrios Kyrtzidis      EntityInfo.USR = SA.copyCStr(StrBuf.str());
1072dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis    }
10734e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis  }
10744e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis}
10754e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis
10762957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidisvoid IndexingContext::getContainerInfo(const DeclContext *DC,
10772957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis                                       ContainerInfo &ContInfo) {
10782957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis  ContInfo.cursor = getCursor(cast<Decl>(DC));
10792957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis  ContInfo.DC = DC;
10802957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis  ContInfo.IndexCtx = this;
10812957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis}
10822957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis
10834e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios KyrtzidisCXCursor IndexingContext::getRefCursor(const NamedDecl *D, SourceLocation Loc) {
10844e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis  if (const TypeDecl *TD = dyn_cast<TypeDecl>(D))
10854e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis    return MakeCursorTypeRef(TD, Loc, CXTU);
10864e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis  if (const ObjCInterfaceDecl *ID = dyn_cast<ObjCInterfaceDecl>(D))
10874e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis    return MakeCursorObjCClassRef(ID, Loc, CXTU);
10884e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis  if (const ObjCProtocolDecl *PD = dyn_cast<ObjCProtocolDecl>(D))
10894e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis    return MakeCursorObjCProtocolRef(PD, Loc, CXTU);
1090b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis  if (const TemplateDecl *Template = dyn_cast<TemplateDecl>(D))
1091b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis    return MakeCursorTemplateRef(Template, Loc, CXTU);
1092b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis  if (const NamespaceDecl *Namespace = dyn_cast<NamespaceDecl>(D))
1093b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis    return MakeCursorNamespaceRef(Namespace, Loc, CXTU);
1094b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis  if (const NamespaceAliasDecl *Namespace = dyn_cast<NamespaceAliasDecl>(D))
1095b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis    return MakeCursorNamespaceRef(Namespace, Loc, CXTU);
1096b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis  if (const FieldDecl *Field = dyn_cast<FieldDecl>(D))
1097b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis    return MakeCursorMemberRef(Field, Loc, CXTU);
1098011d8b93b7cfa8492b8a9c909a850d6577e08dcaDouglas Gregor  if (const VarDecl *Var = dyn_cast<VarDecl>(D))
1099011d8b93b7cfa8492b8a9c909a850d6577e08dcaDouglas Gregor    return MakeCursorVariableRef(Var, Loc, CXTU);
1100011d8b93b7cfa8492b8a9c909a850d6577e08dcaDouglas Gregor
11014e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis  return clang_getNullCursor();
11024e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis}
11032957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis
1104d08900848307fdaea19d52249bdced94eefdb9bbArgyrios Kyrtzidisbool IndexingContext::shouldIgnoreIfImplicit(const Decl *D) {
110537f40572c4c78a8c57a7b45266f8b86db172a7c1Argyrios Kyrtzidis  if (isa<ObjCInterfaceDecl>(D))
110637f40572c4c78a8c57a7b45266f8b86db172a7c1Argyrios Kyrtzidis    return false;
110737f40572c4c78a8c57a7b45266f8b86db172a7c1Argyrios Kyrtzidis  if (isa<ObjCCategoryDecl>(D))
110837f40572c4c78a8c57a7b45266f8b86db172a7c1Argyrios Kyrtzidis    return false;
11092957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis  if (isa<ObjCIvarDecl>(D))
11102957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis    return false;
11112957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis  if (isa<ObjCMethodDecl>(D))
11122957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis    return false;
11132957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis  return true;
11142957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis}
11156d968363877388f0a0268711d59367907b465ae1Argyrios Kyrtzidis
11166d968363877388f0a0268711d59367907b465ae1Argyrios Kyrtzidisbool IndexingContext::isTemplateImplicitInstantiation(const Decl *D) {
11176d968363877388f0a0268711d59367907b465ae1Argyrios Kyrtzidis  if (const ClassTemplateSpecializationDecl *
11186d968363877388f0a0268711d59367907b465ae1Argyrios Kyrtzidis        SD = dyn_cast<ClassTemplateSpecializationDecl>(D)) {
11196d968363877388f0a0268711d59367907b465ae1Argyrios Kyrtzidis    return SD->getSpecializationKind() == TSK_ImplicitInstantiation;
11206d968363877388f0a0268711d59367907b465ae1Argyrios Kyrtzidis  }
11216d968363877388f0a0268711d59367907b465ae1Argyrios Kyrtzidis  if (const FunctionDecl *FD = dyn_cast<FunctionDecl>(D)) {
11226d968363877388f0a0268711d59367907b465ae1Argyrios Kyrtzidis    return FD->getTemplateSpecializationKind() == TSK_ImplicitInstantiation;
11236d968363877388f0a0268711d59367907b465ae1Argyrios Kyrtzidis  }
11246d968363877388f0a0268711d59367907b465ae1Argyrios Kyrtzidis  return false;
11256d968363877388f0a0268711d59367907b465ae1Argyrios Kyrtzidis}
1126