blob: c9097c5e6ee54c7ce9ce153674505a11c341629e [file] [log] [blame]
Nick Lewyckyeb86dcc2012-10-29 06:02:59 +00001//===- IndexingContext.h - Higher level API functions -----------*- C++ -*-===//
Argyrios Kyrtzidis4e7064f2011-10-17 19:48:19 +00002//
3// The LLVM Compiler Infrastructure
4//
5// This file is distributed under the University of Illinois Open Source
6// License. See LICENSE.TXT for details.
7//
8//===----------------------------------------------------------------------===//
9
Argyrios Kyrtzidis4e7064f2011-10-17 19:48:19 +000010#include "CXCursor.h"
Chandler Carruthf59edb92012-12-04 09:25:21 +000011#include "Index_Internal.h"
Argyrios Kyrtzidis4e7064f2011-10-17 19:48:19 +000012#include "clang/AST/DeclGroup.h"
Chandler Carruthf59edb92012-12-04 09:25:21 +000013#include "clang/AST/DeclObjC.h"
Argyrios Kyrtzidisc6b4a502011-11-16 02:34:59 +000014#include "llvm/ADT/DenseSet.h"
Argyrios Kyrtzidis30a28052012-03-23 23:24:18 +000015#include <deque>
Argyrios Kyrtzidis4e7064f2011-10-17 19:48:19 +000016
17namespace clang {
18 class FileEntry;
19 class ObjCPropertyDecl;
Argyrios Kyrtzidis2957e6f2011-11-22 07:24:51 +000020 class ClassTemplateDecl;
21 class FunctionTemplateDecl;
22 class TypeAliasTemplateDecl;
Argyrios Kyrtzidis6d968362012-02-10 20:10:44 +000023 class ClassTemplateSpecializationDecl;
Argyrios Kyrtzidis4e7064f2011-10-17 19:48:19 +000024
25namespace cxindex {
26 class IndexingContext;
Argyrios Kyrtzidis643d3ce2011-12-15 00:05:00 +000027 class AttrListInfo;
Argyrios Kyrtzidis4e7064f2011-10-17 19:48:19 +000028
Argyrios Kyrtzidisd786f1a2012-03-31 01:14:06 +000029class ScratchAlloc {
30 IndexingContext &IdxCtx;
31
32public:
33 explicit ScratchAlloc(IndexingContext &indexCtx);
34 ScratchAlloc(const ScratchAlloc &SA);
35
36 ~ScratchAlloc();
37
38 const char *toCStr(StringRef Str);
39 const char *copyCStr(StringRef Str);
40
41 template <typename T>
42 T *allocate();
43};
44
Argyrios Kyrtzidis2957e6f2011-11-22 07:24:51 +000045struct EntityInfo : public CXIdxEntityInfo {
46 const NamedDecl *Dcl;
47 IndexingContext *IndexCtx;
Dylan Noblesmithc93dc782012-02-20 14:00:23 +000048 IntrusiveRefCntPtr<AttrListInfo> AttrList;
Argyrios Kyrtzidis37f40572011-11-23 20:27:26 +000049
50 EntityInfo() {
51 name = USR = 0;
Argyrios Kyrtzidis643d3ce2011-12-15 00:05:00 +000052 attributes = 0;
53 numAttributes = 0;
Argyrios Kyrtzidis37f40572011-11-23 20:27:26 +000054 }
Argyrios Kyrtzidis2957e6f2011-11-22 07:24:51 +000055};
56
57struct ContainerInfo : public CXIdxContainerInfo {
58 const DeclContext *DC;
59 IndexingContext *IndexCtx;
60};
61
Argyrios Kyrtzidisdd93c592011-11-11 00:23:36 +000062struct DeclInfo : public CXIdxDeclInfo {
Argyrios Kyrtzidisc71d5542011-11-14 22:39:19 +000063 enum DInfoKind {
64 Info_Decl,
65
66 Info_ObjCContainer,
67 Info_ObjCInterface,
68 Info_ObjCProtocol,
Argyrios Kyrtzidis2957e6f2011-11-22 07:24:51 +000069 Info_ObjCCategory,
70
Argyrios Kyrtzidis792db262012-02-28 17:50:33 +000071 Info_ObjCProperty,
72
Argyrios Kyrtzidis2957e6f2011-11-22 07:24:51 +000073 Info_CXXClass
Argyrios Kyrtzidisc71d5542011-11-14 22:39:19 +000074 };
75
76 DInfoKind Kind;
77
Argyrios Kyrtzidis2957e6f2011-11-22 07:24:51 +000078 EntityInfo EntInfo;
Argyrios Kyrtzidisb1febb62011-12-07 20:44:19 +000079 ContainerInfo SemanticContainer;
80 ContainerInfo LexicalContainer;
Argyrios Kyrtzidis2957e6f2011-11-22 07:24:51 +000081 ContainerInfo DeclAsContainer;
82
Argyrios Kyrtzidisc71d5542011-11-14 22:39:19 +000083 DeclInfo(bool isRedeclaration, bool isDefinition, bool isContainer)
84 : Kind(Info_Decl) {
85 this->isRedeclaration = isRedeclaration;
86 this->isDefinition = isDefinition;
87 this->isContainer = isContainer;
Argyrios Kyrtzidisb395c632011-11-18 00:26:51 +000088 attributes = 0;
89 numAttributes = 0;
Argyrios Kyrtzidisb1febb62011-12-07 20:44:19 +000090 declAsContainer = semanticContainer = lexicalContainer = 0;
Argyrios Kyrtzidis838eb7e2012-12-06 19:41:16 +000091 flags = 0;
Argyrios Kyrtzidisc71d5542011-11-14 22:39:19 +000092 }
93 DeclInfo(DInfoKind K,
94 bool isRedeclaration, bool isDefinition, bool isContainer)
95 : Kind(K) {
96 this->isRedeclaration = isRedeclaration;
97 this->isDefinition = isDefinition;
98 this->isContainer = isContainer;
Argyrios Kyrtzidisb395c632011-11-18 00:26:51 +000099 attributes = 0;
100 numAttributes = 0;
Argyrios Kyrtzidisb1febb62011-12-07 20:44:19 +0000101 declAsContainer = semanticContainer = lexicalContainer = 0;
Argyrios Kyrtzidis838eb7e2012-12-06 19:41:16 +0000102 flags = 0;
Argyrios Kyrtzidisc71d5542011-11-14 22:39:19 +0000103 }
Argyrios Kyrtzidisdd93c592011-11-11 00:23:36 +0000104};
105
Argyrios Kyrtzidisdd93c592011-11-11 00:23:36 +0000106struct ObjCContainerDeclInfo : public DeclInfo {
Argyrios Kyrtzidis6ec43ad2011-11-12 02:16:30 +0000107 CXIdxObjCContainerDeclInfo ObjCContDeclInfo;
Argyrios Kyrtzidisc71d5542011-11-14 22:39:19 +0000108
109 ObjCContainerDeclInfo(bool isForwardRef,
110 bool isRedeclaration,
111 bool isImplementation)
112 : DeclInfo(Info_ObjCContainer, isRedeclaration,
113 /*isDefinition=*/!isForwardRef, /*isContainer=*/!isForwardRef) {
114 init(isForwardRef, isImplementation);
115 }
116 ObjCContainerDeclInfo(DInfoKind K,
117 bool isForwardRef,
118 bool isRedeclaration,
119 bool isImplementation)
120 : DeclInfo(K, isRedeclaration, /*isDefinition=*/!isForwardRef,
121 /*isContainer=*/!isForwardRef) {
122 init(isForwardRef, isImplementation);
123 }
124
125 static bool classof(const DeclInfo *D) {
126 return Info_ObjCContainer <= D->Kind && D->Kind <= Info_ObjCCategory;
127 }
Argyrios Kyrtzidisc71d5542011-11-14 22:39:19 +0000128
129private:
130 void init(bool isForwardRef, bool isImplementation) {
131 if (isForwardRef)
132 ObjCContDeclInfo.kind = CXIdxObjCContainer_ForwardRef;
133 else if (isImplementation)
134 ObjCContDeclInfo.kind = CXIdxObjCContainer_Implementation;
135 else
136 ObjCContDeclInfo.kind = CXIdxObjCContainer_Interface;
137 }
138};
139
140struct ObjCInterfaceDeclInfo : public ObjCContainerDeclInfo {
141 CXIdxObjCInterfaceDeclInfo ObjCInterDeclInfo;
142 CXIdxObjCProtocolRefListInfo ObjCProtoListInfo;
143
144 ObjCInterfaceDeclInfo(const ObjCInterfaceDecl *D)
145 : ObjCContainerDeclInfo(Info_ObjCInterface,
146 /*isForwardRef=*/false,
Douglas Gregoref96ee02012-01-14 16:38:05 +0000147 /*isRedeclaration=*/D->getPreviousDecl() != 0,
Argyrios Kyrtzidisc71d5542011-11-14 22:39:19 +0000148 /*isImplementation=*/false) { }
149
150 static bool classof(const DeclInfo *D) {
151 return D->Kind == Info_ObjCInterface;
152 }
Argyrios Kyrtzidisc71d5542011-11-14 22:39:19 +0000153};
154
155struct ObjCProtocolDeclInfo : public ObjCContainerDeclInfo {
156 CXIdxObjCProtocolRefListInfo ObjCProtoRefListInfo;
157
158 ObjCProtocolDeclInfo(const ObjCProtocolDecl *D)
159 : ObjCContainerDeclInfo(Info_ObjCProtocol,
160 /*isForwardRef=*/false,
Douglas Gregoref96ee02012-01-14 16:38:05 +0000161 /*isRedeclaration=*/D->getPreviousDecl(),
Argyrios Kyrtzidisc71d5542011-11-14 22:39:19 +0000162 /*isImplementation=*/false) { }
163
164 static bool classof(const DeclInfo *D) {
165 return D->Kind == Info_ObjCProtocol;
166 }
Argyrios Kyrtzidisdd93c592011-11-11 00:23:36 +0000167};
168
169struct ObjCCategoryDeclInfo : public ObjCContainerDeclInfo {
Argyrios Kyrtzidis6ec43ad2011-11-12 02:16:30 +0000170 CXIdxObjCCategoryDeclInfo ObjCCatDeclInfo;
Argyrios Kyrtzidisc10a4c82011-12-13 18:47:45 +0000171 CXIdxObjCProtocolRefListInfo ObjCProtoListInfo;
Argyrios Kyrtzidis6ec43ad2011-11-12 02:16:30 +0000172
Argyrios Kyrtzidisc71d5542011-11-14 22:39:19 +0000173 explicit ObjCCategoryDeclInfo(bool isImplementation)
174 : ObjCContainerDeclInfo(Info_ObjCCategory,
175 /*isForwardRef=*/false,
176 /*isRedeclaration=*/isImplementation,
177 /*isImplementation=*/isImplementation) { }
Argyrios Kyrtzidis6ec43ad2011-11-12 02:16:30 +0000178
Argyrios Kyrtzidisc71d5542011-11-14 22:39:19 +0000179 static bool classof(const DeclInfo *D) {
180 return D->Kind == Info_ObjCCategory;
181 }
Argyrios Kyrtzidisdd93c592011-11-11 00:23:36 +0000182};
183
Argyrios Kyrtzidis792db262012-02-28 17:50:33 +0000184struct ObjCPropertyDeclInfo : public DeclInfo {
185 CXIdxObjCPropertyDeclInfo ObjCPropDeclInfo;
186
187 ObjCPropertyDeclInfo()
188 : DeclInfo(Info_ObjCProperty,
189 /*isRedeclaration=*/false, /*isDefinition=*/false,
190 /*isContainer=*/false) { }
191
192 static bool classof(const DeclInfo *D) {
193 return D->Kind == Info_ObjCProperty;
194 }
Argyrios Kyrtzidis792db262012-02-28 17:50:33 +0000195};
196
Argyrios Kyrtzidis2957e6f2011-11-22 07:24:51 +0000197struct CXXClassDeclInfo : public DeclInfo {
198 CXIdxCXXClassDeclInfo CXXClassInfo;
199
200 CXXClassDeclInfo(bool isRedeclaration, bool isDefinition)
201 : DeclInfo(Info_CXXClass, isRedeclaration, isDefinition, isDefinition) { }
202
203 static bool classof(const DeclInfo *D) {
204 return D->Kind == Info_CXXClass;
205 }
Argyrios Kyrtzidis2957e6f2011-11-22 07:24:51 +0000206};
207
Argyrios Kyrtzidisb395c632011-11-18 00:26:51 +0000208struct AttrInfo : public CXIdxAttrInfo {
209 const Attr *A;
210
211 AttrInfo(CXIdxAttrKind Kind, CXCursor C, CXIdxLoc Loc, const Attr *A) {
212 kind = Kind;
213 cursor = C;
214 loc = Loc;
215 this->A = A;
216 }
Argyrios Kyrtzidisb395c632011-11-18 00:26:51 +0000217};
218
219struct IBOutletCollectionInfo : public AttrInfo {
Argyrios Kyrtzidis2957e6f2011-11-22 07:24:51 +0000220 EntityInfo ClassInfo;
Argyrios Kyrtzidisb395c632011-11-18 00:26:51 +0000221 CXIdxIBOutletCollectionAttrInfo IBCollInfo;
222
223 IBOutletCollectionInfo(CXCursor C, CXIdxLoc Loc, const Attr *A) :
224 AttrInfo(CXIdxAttr_IBOutletCollection, C, Loc, A) {
225 assert(C.kind == CXCursor_IBOutletCollectionAttr);
Argyrios Kyrtzidis643d3ce2011-12-15 00:05:00 +0000226 IBCollInfo.objcClass = 0;
Argyrios Kyrtzidisb395c632011-11-18 00:26:51 +0000227 }
228
Argyrios Kyrtzidis643d3ce2011-12-15 00:05:00 +0000229 IBOutletCollectionInfo(const IBOutletCollectionInfo &other);
230
Argyrios Kyrtzidisb395c632011-11-18 00:26:51 +0000231 static bool classof(const AttrInfo *A) {
232 return A->kind == CXIdxAttr_IBOutletCollection;
233 }
Argyrios Kyrtzidisb395c632011-11-18 00:26:51 +0000234};
235
Argyrios Kyrtzidis643d3ce2011-12-15 00:05:00 +0000236class AttrListInfo {
Argyrios Kyrtzidisd786f1a2012-03-31 01:14:06 +0000237 ScratchAlloc SA;
238
Argyrios Kyrtzidis643d3ce2011-12-15 00:05:00 +0000239 SmallVector<AttrInfo, 2> Attrs;
240 SmallVector<IBOutletCollectionInfo, 2> IBCollAttrs;
241 SmallVector<CXIdxAttrInfo *, 2> CXAttrs;
242 unsigned ref_cnt;
243
Dmitri Gribenkof56faa02012-09-15 20:20:27 +0000244 AttrListInfo(const AttrListInfo &) LLVM_DELETED_FUNCTION;
245 void operator=(const AttrListInfo &) LLVM_DELETED_FUNCTION;
Argyrios Kyrtzidis643d3ce2011-12-15 00:05:00 +0000246public:
Argyrios Kyrtzidisd786f1a2012-03-31 01:14:06 +0000247 AttrListInfo(const Decl *D, IndexingContext &IdxCtx);
248
249 static IntrusiveRefCntPtr<AttrListInfo> create(const Decl *D,
250 IndexingContext &IdxCtx);
Argyrios Kyrtzidis643d3ce2011-12-15 00:05:00 +0000251
252 const CXIdxAttrInfo *const *getAttrs() const {
253 if (CXAttrs.empty())
254 return 0;
255 return CXAttrs.data();
256 }
257 unsigned getNumAttrs() const { return (unsigned)CXAttrs.size(); }
258
259 /// \brief Retain/Release only useful when we allocate a AttrListInfo from the
260 /// BumpPtrAllocator, and not from the stack; so that we keep a pointer
261 // in the EntityInfo
262 void Retain() { ++ref_cnt; }
263 void Release() {
264 assert (ref_cnt > 0 && "Reference count is already zero.");
265 if (--ref_cnt == 0) {
266 // Memory is allocated from a BumpPtrAllocator, no need to delete it.
267 this->~AttrListInfo();
268 }
269 }
270};
271
Argyrios Kyrtzidisc6b4a502011-11-16 02:34:59 +0000272struct RefFileOccurence {
273 const FileEntry *File;
274 const Decl *Dcl;
275
276 RefFileOccurence(const FileEntry *File, const Decl *Dcl)
277 : File(File), Dcl(Dcl) { }
278};
279
Argyrios Kyrtzidis4e7064f2011-10-17 19:48:19 +0000280class IndexingContext {
281 ASTContext *Ctx;
282 CXClientData ClientData;
283 IndexerCallbacks &CB;
284 unsigned IndexOptions;
285 CXTranslationUnit CXTU;
286
Argyrios Kyrtzidisdd93c592011-11-11 00:23:36 +0000287 typedef llvm::DenseMap<const FileEntry *, CXIdxClientFile> FileMapTy;
Argyrios Kyrtzidis2957e6f2011-11-22 07:24:51 +0000288 typedef llvm::DenseMap<const DeclContext *, CXIdxClientContainer>
289 ContainerMapTy;
290 typedef llvm::DenseMap<const Decl *, CXIdxClientEntity> EntityMapTy;
291
Argyrios Kyrtzidis4e7064f2011-10-17 19:48:19 +0000292 FileMapTy FileMap;
Argyrios Kyrtzidis4e7064f2011-10-17 19:48:19 +0000293 ContainerMapTy ContainerMap;
Argyrios Kyrtzidis2957e6f2011-11-22 07:24:51 +0000294 EntityMapTy EntityMap;
Argyrios Kyrtzidis4e7064f2011-10-17 19:48:19 +0000295
Argyrios Kyrtzidisc6b4a502011-11-16 02:34:59 +0000296 llvm::DenseSet<RefFileOccurence> RefFileOccurences;
297
Argyrios Kyrtzidis30a28052012-03-23 23:24:18 +0000298 std::deque<DeclGroupRef> TUDeclsInObjCContainer;
Argyrios Kyrtzidis4e7064f2011-10-17 19:48:19 +0000299
Argyrios Kyrtzidis37f40572011-11-23 20:27:26 +0000300 llvm::BumpPtrAllocator StrScratch;
Argyrios Kyrtzidisdd93c592011-11-11 00:23:36 +0000301 unsigned StrAdapterCount;
Argyrios Kyrtzidis643d3ce2011-12-15 00:05:00 +0000302 friend class ScratchAlloc;
Argyrios Kyrtzidis4e7064f2011-10-17 19:48:19 +0000303
Argyrios Kyrtzidis6ec43ad2011-11-12 02:16:30 +0000304 struct ObjCProtocolListInfo {
305 SmallVector<CXIdxObjCProtocolRefInfo, 4> ProtInfos;
Argyrios Kyrtzidis2957e6f2011-11-22 07:24:51 +0000306 SmallVector<EntityInfo, 4> ProtEntities;
Argyrios Kyrtzidis6ec43ad2011-11-12 02:16:30 +0000307 SmallVector<CXIdxObjCProtocolRefInfo *, 4> Prots;
308
Argyrios Kyrtzidisb395c632011-11-18 00:26:51 +0000309 CXIdxObjCProtocolRefListInfo getListInfo() const {
Argyrios Kyrtzidisc71d5542011-11-14 22:39:19 +0000310 CXIdxObjCProtocolRefListInfo Info = { Prots.data(),
311 (unsigned)Prots.size() };
312 return Info;
313 }
Argyrios Kyrtzidis6ec43ad2011-11-12 02:16:30 +0000314
315 ObjCProtocolListInfo(const ObjCProtocolList &ProtList,
316 IndexingContext &IdxCtx,
Argyrios Kyrtzidis643d3ce2011-12-15 00:05:00 +0000317 ScratchAlloc &SA);
Argyrios Kyrtzidis2957e6f2011-11-22 07:24:51 +0000318 };
319
320 struct CXXBasesListInfo {
321 SmallVector<CXIdxBaseClassInfo, 4> BaseInfos;
322 SmallVector<EntityInfo, 4> BaseEntities;
323 SmallVector<CXIdxBaseClassInfo *, 4> CXBases;
324
325 const CXIdxBaseClassInfo *const *getBases() const {
326 return CXBases.data();
327 }
328 unsigned getNumBases() const { return (unsigned)CXBases.size(); }
329
330 CXXBasesListInfo(const CXXRecordDecl *D,
Argyrios Kyrtzidis643d3ce2011-12-15 00:05:00 +0000331 IndexingContext &IdxCtx, ScratchAlloc &SA);
Argyrios Kyrtzidisb526a872011-12-07 20:44:15 +0000332
333 private:
334 SourceLocation getBaseLoc(const CXXBaseSpecifier &Base) const;
Argyrios Kyrtzidis2957e6f2011-11-22 07:24:51 +0000335 };
Argyrios Kyrtzidisb395c632011-11-18 00:26:51 +0000336
Argyrios Kyrtzidis643d3ce2011-12-15 00:05:00 +0000337 friend class AttrListInfo;
338
Argyrios Kyrtzidis4e7064f2011-10-17 19:48:19 +0000339public:
340 IndexingContext(CXClientData clientData, IndexerCallbacks &indexCallbacks,
341 unsigned indexOptions, CXTranslationUnit cxTU)
342 : Ctx(0), ClientData(clientData), CB(indexCallbacks),
Argyrios Kyrtzidis37f40572011-11-23 20:27:26 +0000343 IndexOptions(indexOptions), CXTU(cxTU),
344 StrScratch(/*size=*/1024), StrAdapterCount(0) { }
Argyrios Kyrtzidis4e7064f2011-10-17 19:48:19 +0000345
346 ASTContext &getASTContext() const { return *Ctx; }
347
348 void setASTContext(ASTContext &ctx);
Argyrios Kyrtzidis7fe90f32012-01-17 18:48:07 +0000349 void setPreprocessor(Preprocessor &PP);
Argyrios Kyrtzidis4e7064f2011-10-17 19:48:19 +0000350
Argyrios Kyrtzidis58d2dbe2012-02-14 22:23:11 +0000351 bool shouldSuppressRefs() const {
Argyrios Kyrtzidisb395c632011-11-18 00:26:51 +0000352 return IndexOptions & CXIndexOpt_SuppressRedundantRefs;
Argyrios Kyrtzidisc6b4a502011-11-16 02:34:59 +0000353 }
354
Argyrios Kyrtzidis58d2dbe2012-02-14 22:23:11 +0000355 bool shouldIndexFunctionLocalSymbols() const {
Argyrios Kyrtzidis22490742012-01-14 00:11:49 +0000356 return IndexOptions & CXIndexOpt_IndexFunctionLocalSymbols;
357 }
358
Argyrios Kyrtzidis58d2dbe2012-02-14 22:23:11 +0000359 bool shouldIndexImplicitTemplateInsts() const {
360 return IndexOptions & CXIndexOpt_IndexImplicitTemplateInstantiations;
361 }
362
Argyrios Kyrtzidis3bed3d12012-09-10 22:58:04 +0000363 static bool isFunctionLocalDecl(const Decl *D);
364
Argyrios Kyrtzidisb395c632011-11-18 00:26:51 +0000365 bool shouldAbort();
366
Argyrios Kyrtzidis996e6e52011-12-01 02:42:50 +0000367 bool hasDiagnosticCallback() const { return CB.diagnostic; }
368
Argyrios Kyrtzidisdd93c592011-11-11 00:23:36 +0000369 void enteredMainFile(const FileEntry *File);
370
Argyrios Kyrtzidis4e7064f2011-10-17 19:48:19 +0000371 void ppIncludedFile(SourceLocation hashLoc,
372 StringRef filename, const FileEntry *File,
Argyrios Kyrtzidis8d7a24e2012-10-18 00:17:05 +0000373 bool isImport, bool isAngled, bool isModuleImport);
Argyrios Kyrtzidis4e7064f2011-10-17 19:48:19 +0000374
Argyrios Kyrtzidis37f2f522012-10-03 21:05:44 +0000375 void importedModule(const ImportDecl *ImportD);
Argyrios Kyrtzidis3da76bf2012-10-03 21:05:51 +0000376 void importedPCH(const FileEntry *File);
Argyrios Kyrtzidis2c3e05c2012-10-02 16:10:38 +0000377
Argyrios Kyrtzidis6ec43ad2011-11-12 02:16:30 +0000378 void startedTranslationUnit();
Argyrios Kyrtzidis4e7064f2011-10-17 19:48:19 +0000379
380 void indexDecl(const Decl *D);
381
382 void indexTagDecl(const TagDecl *D);
383
384 void indexTypeSourceInfo(TypeSourceInfo *TInfo, const NamedDecl *Parent,
385 const DeclContext *DC = 0);
386
387 void indexTypeLoc(TypeLoc TL, const NamedDecl *Parent,
Argyrios Kyrtzidise422e452011-12-13 18:47:41 +0000388 const DeclContext *DC = 0);
389
390 void indexNestedNameSpecifierLoc(NestedNameSpecifierLoc NNS,
391 const NamedDecl *Parent,
392 const DeclContext *DC = 0);
Argyrios Kyrtzidis4e7064f2011-10-17 19:48:19 +0000393
394 void indexDeclContext(const DeclContext *DC);
395
Argyrios Kyrtzidise422e452011-12-13 18:47:41 +0000396 void indexBody(const Stmt *S, const NamedDecl *Parent,
397 const DeclContext *DC = 0);
Argyrios Kyrtzidis4e7064f2011-10-17 19:48:19 +0000398
Argyrios Kyrtzidisb395c632011-11-18 00:26:51 +0000399 void handleDiagnosticSet(CXDiagnosticSet CXDiagSet);
Argyrios Kyrtzidis4e7064f2011-10-17 19:48:19 +0000400
Argyrios Kyrtzidisb395c632011-11-18 00:26:51 +0000401 bool handleFunction(const FunctionDecl *FD);
Argyrios Kyrtzidis4e7064f2011-10-17 19:48:19 +0000402
Argyrios Kyrtzidisb395c632011-11-18 00:26:51 +0000403 bool handleVar(const VarDecl *D);
Argyrios Kyrtzidis4e7064f2011-10-17 19:48:19 +0000404
Argyrios Kyrtzidisb395c632011-11-18 00:26:51 +0000405 bool handleField(const FieldDecl *D);
Argyrios Kyrtzidis4e7064f2011-10-17 19:48:19 +0000406
Argyrios Kyrtzidisb395c632011-11-18 00:26:51 +0000407 bool handleEnumerator(const EnumConstantDecl *D);
Argyrios Kyrtzidis4e7064f2011-10-17 19:48:19 +0000408
Argyrios Kyrtzidisb395c632011-11-18 00:26:51 +0000409 bool handleTagDecl(const TagDecl *D);
Argyrios Kyrtzidis4e7064f2011-10-17 19:48:19 +0000410
Argyrios Kyrtzidis2957e6f2011-11-22 07:24:51 +0000411 bool handleTypedefName(const TypedefNameDecl *D);
Argyrios Kyrtzidis4e7064f2011-10-17 19:48:19 +0000412
Argyrios Kyrtzidisb395c632011-11-18 00:26:51 +0000413 bool handleObjCInterface(const ObjCInterfaceDecl *D);
414 bool handleObjCImplementation(const ObjCImplementationDecl *D);
Argyrios Kyrtzidis4e7064f2011-10-17 19:48:19 +0000415
Argyrios Kyrtzidisb395c632011-11-18 00:26:51 +0000416 bool handleObjCProtocol(const ObjCProtocolDecl *D);
Argyrios Kyrtzidis4e7064f2011-10-17 19:48:19 +0000417
Argyrios Kyrtzidisb395c632011-11-18 00:26:51 +0000418 bool handleObjCCategory(const ObjCCategoryDecl *D);
419 bool handleObjCCategoryImpl(const ObjCCategoryImplDecl *D);
Argyrios Kyrtzidis4e7064f2011-10-17 19:48:19 +0000420
Argyrios Kyrtzidisb395c632011-11-18 00:26:51 +0000421 bool handleObjCMethod(const ObjCMethodDecl *D);
Argyrios Kyrtzidis4e7064f2011-10-17 19:48:19 +0000422
Argyrios Kyrtzidisb395c632011-11-18 00:26:51 +0000423 bool handleSynthesizedObjCProperty(const ObjCPropertyImplDecl *D);
Argyrios Kyrtzidisf9112422012-02-28 17:50:39 +0000424 bool handleSynthesizedObjCMethod(const ObjCMethodDecl *D, SourceLocation Loc,
425 const DeclContext *LexicalDC);
Argyrios Kyrtzidis4e7064f2011-10-17 19:48:19 +0000426
Argyrios Kyrtzidisb395c632011-11-18 00:26:51 +0000427 bool handleObjCProperty(const ObjCPropertyDecl *D);
428
Argyrios Kyrtzidis68478b02011-12-07 05:52:06 +0000429 bool handleNamespace(const NamespaceDecl *D);
430
Argyrios Kyrtzidis2957e6f2011-11-22 07:24:51 +0000431 bool handleClassTemplate(const ClassTemplateDecl *D);
432 bool handleFunctionTemplate(const FunctionTemplateDecl *D);
433 bool handleTypeAliasTemplate(const TypeAliasTemplateDecl *D);
434
Argyrios Kyrtzidisb395c632011-11-18 00:26:51 +0000435 bool handleReference(const NamedDecl *D, SourceLocation Loc, CXCursor Cursor,
436 const NamedDecl *Parent,
437 const DeclContext *DC,
438 const Expr *E = 0,
439 CXIdxEntityRefKind Kind = CXIdxEntityRef_Direct);
440
441 bool handleReference(const NamedDecl *D, SourceLocation Loc,
Argyrios Kyrtzidis4e7064f2011-10-17 19:48:19 +0000442 const NamedDecl *Parent,
443 const DeclContext *DC,
Argyrios Kyrtzidisaca19be2011-10-18 15:50:50 +0000444 const Expr *E = 0,
445 CXIdxEntityRefKind Kind = CXIdxEntityRef_Direct);
Argyrios Kyrtzidis4e7064f2011-10-17 19:48:19 +0000446
447 bool isNotFromSourceFile(SourceLocation Loc) const;
448
Argyrios Kyrtzidis3bed3d12012-09-10 22:58:04 +0000449 void indexTopLevelDecl(const Decl *D);
Argyrios Kyrtzidis4e7064f2011-10-17 19:48:19 +0000450 void indexTUDeclsInObjCContainer();
451 void indexDeclGroupRef(DeclGroupRef DG);
452
453 void addTUDeclInObjCContainer(DeclGroupRef DG) {
454 TUDeclsInObjCContainer.push_back(DG);
455 }
456
Argyrios Kyrtzidisdd93c592011-11-11 00:23:36 +0000457 void translateLoc(SourceLocation Loc, CXIdxClientFile *indexFile, CXFile *file,
Argyrios Kyrtzidis4e7064f2011-10-17 19:48:19 +0000458 unsigned *line, unsigned *column, unsigned *offset);
459
Argyrios Kyrtzidis2957e6f2011-11-22 07:24:51 +0000460 CXIdxClientContainer getClientContainerForDC(const DeclContext *DC) const;
461 void addContainerInMap(const DeclContext *DC, CXIdxClientContainer container);
462
463 CXIdxClientEntity getClientEntity(const Decl *D) const;
464 void setClientEntity(const Decl *D, CXIdxClientEntity client);
465
Argyrios Kyrtzidis6d968362012-02-10 20:10:44 +0000466 static bool isTemplateImplicitInstantiation(const Decl *D);
467
Argyrios Kyrtzidis4e7064f2011-10-17 19:48:19 +0000468private:
Argyrios Kyrtzidisb395c632011-11-18 00:26:51 +0000469 bool handleDecl(const NamedDecl *D,
Argyrios Kyrtzidisdd93c592011-11-11 00:23:36 +0000470 SourceLocation Loc, CXCursor Cursor,
Argyrios Kyrtzidisf9112422012-02-28 17:50:39 +0000471 DeclInfo &DInfo,
472 const DeclContext *LexicalDC = 0);
Argyrios Kyrtzidis4e7064f2011-10-17 19:48:19 +0000473
Argyrios Kyrtzidisb395c632011-11-18 00:26:51 +0000474 bool handleObjCContainer(const ObjCContainerDecl *D,
Argyrios Kyrtzidisdd93c592011-11-11 00:23:36 +0000475 SourceLocation Loc, CXCursor Cursor,
Argyrios Kyrtzidisdd93c592011-11-11 00:23:36 +0000476 ObjCContainerDeclInfo &ContDInfo);
Argyrios Kyrtzidis4e7064f2011-10-17 19:48:19 +0000477
Argyrios Kyrtzidis2957e6f2011-11-22 07:24:51 +0000478 bool handleCXXRecordDecl(const CXXRecordDecl *RD, const NamedDecl *OrigD);
Argyrios Kyrtzidisdd93c592011-11-11 00:23:36 +0000479
Argyrios Kyrtzidisb395c632011-11-18 00:26:51 +0000480 bool markEntityOccurrenceInFile(const NamedDecl *D, SourceLocation Loc);
481
Argyrios Kyrtzidis4e7064f2011-10-17 19:48:19 +0000482 const NamedDecl *getEntityDecl(const NamedDecl *D) const;
483
Argyrios Kyrtzidis2957e6f2011-11-22 07:24:51 +0000484 const DeclContext *getEntityContainer(const Decl *D) const;
485
Argyrios Kyrtzidisdd93c592011-11-11 00:23:36 +0000486 CXIdxClientFile getIndexFile(const FileEntry *File);
Argyrios Kyrtzidis4e7064f2011-10-17 19:48:19 +0000487
488 CXIdxLoc getIndexLoc(SourceLocation Loc) const;
489
Argyrios Kyrtzidis4e7064f2011-10-17 19:48:19 +0000490 void getEntityInfo(const NamedDecl *D,
Argyrios Kyrtzidis2957e6f2011-11-22 07:24:51 +0000491 EntityInfo &EntityInfo,
Argyrios Kyrtzidis643d3ce2011-12-15 00:05:00 +0000492 ScratchAlloc &SA);
Argyrios Kyrtzidis4e7064f2011-10-17 19:48:19 +0000493
Argyrios Kyrtzidis2957e6f2011-11-22 07:24:51 +0000494 void getContainerInfo(const DeclContext *DC, ContainerInfo &ContInfo);
495
Argyrios Kyrtzidisb395c632011-11-18 00:26:51 +0000496 CXCursor getCursor(const Decl *D) {
Dmitri Gribenkoa376f872013-02-03 13:19:54 +0000497 return cxcursor::MakeCXCursor(D, CXTU);
Argyrios Kyrtzidis4e7064f2011-10-17 19:48:19 +0000498 }
499
500 CXCursor getRefCursor(const NamedDecl *D, SourceLocation Loc);
Argyrios Kyrtzidis2957e6f2011-11-22 07:24:51 +0000501
Argyrios Kyrtzidisd0890082012-02-07 22:46:16 +0000502 static bool shouldIgnoreIfImplicit(const Decl *D);
Argyrios Kyrtzidis4e7064f2011-10-17 19:48:19 +0000503};
504
Argyrios Kyrtzidisd786f1a2012-03-31 01:14:06 +0000505inline ScratchAlloc::ScratchAlloc(IndexingContext &idxCtx) : IdxCtx(idxCtx) {
506 ++IdxCtx.StrAdapterCount;
507}
508inline ScratchAlloc::ScratchAlloc(const ScratchAlloc &SA) : IdxCtx(SA.IdxCtx) {
509 ++IdxCtx.StrAdapterCount;
510}
Argyrios Kyrtzidis643d3ce2011-12-15 00:05:00 +0000511
Argyrios Kyrtzidisd786f1a2012-03-31 01:14:06 +0000512inline ScratchAlloc::~ScratchAlloc() {
513 --IdxCtx.StrAdapterCount;
514 if (IdxCtx.StrAdapterCount == 0)
515 IdxCtx.StrScratch.Reset();
516}
Argyrios Kyrtzidis643d3ce2011-12-15 00:05:00 +0000517
Argyrios Kyrtzidisd786f1a2012-03-31 01:14:06 +0000518template <typename T>
519inline T *ScratchAlloc::allocate() {
520 return IdxCtx.StrScratch.Allocate<T>();
521}
Argyrios Kyrtzidis643d3ce2011-12-15 00:05:00 +0000522
Argyrios Kyrtzidis4e7064f2011-10-17 19:48:19 +0000523}} // end clang::cxindex
Argyrios Kyrtzidisc6b4a502011-11-16 02:34:59 +0000524
525namespace llvm {
526 /// Define DenseMapInfo so that FileID's can be used as keys in DenseMap and
527 /// DenseSets.
528 template <>
529 struct DenseMapInfo<clang::cxindex::RefFileOccurence> {
530 static inline clang::cxindex::RefFileOccurence getEmptyKey() {
531 return clang::cxindex::RefFileOccurence(0, 0);
532 }
533
534 static inline clang::cxindex::RefFileOccurence getTombstoneKey() {
535 return clang::cxindex::RefFileOccurence((const clang::FileEntry *)~0,
536 (const clang::Decl *)~0);
537 }
538
539 static unsigned getHashValue(clang::cxindex::RefFileOccurence S) {
Benjamin Kramer28b23072012-05-27 13:28:44 +0000540 typedef std::pair<const clang::FileEntry *, const clang::Decl *> PairTy;
541 return DenseMapInfo<PairTy>::getHashValue(PairTy(S.File, S.Dcl));
Argyrios Kyrtzidisc6b4a502011-11-16 02:34:59 +0000542 }
543
544 static bool isEqual(clang::cxindex::RefFileOccurence LHS,
545 clang::cxindex::RefFileOccurence RHS) {
546 return LHS.File == RHS.File && LHS.Dcl == RHS.Dcl;
547 }
548 };
549}