blob: 15db83d9bb8be05d7b35db525a45e6e9366b0350 [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 Kyrtzidisc71d5542011-11-14 22:39:19 +000091 }
92 DeclInfo(DInfoKind K,
93 bool isRedeclaration, bool isDefinition, bool isContainer)
94 : Kind(K) {
95 this->isRedeclaration = isRedeclaration;
96 this->isDefinition = isDefinition;
97 this->isContainer = isContainer;
Argyrios Kyrtzidisb395c632011-11-18 00:26:51 +000098 attributes = 0;
99 numAttributes = 0;
Argyrios Kyrtzidisb1febb62011-12-07 20:44:19 +0000100 declAsContainer = semanticContainer = lexicalContainer = 0;
Argyrios Kyrtzidisc71d5542011-11-14 22:39:19 +0000101 }
Argyrios Kyrtzidisdd93c592011-11-11 00:23:36 +0000102};
103
Argyrios Kyrtzidisdd93c592011-11-11 00:23:36 +0000104struct ObjCContainerDeclInfo : public DeclInfo {
Argyrios Kyrtzidis6ec43ad2011-11-12 02:16:30 +0000105 CXIdxObjCContainerDeclInfo ObjCContDeclInfo;
Argyrios Kyrtzidisc71d5542011-11-14 22:39:19 +0000106
107 ObjCContainerDeclInfo(bool isForwardRef,
108 bool isRedeclaration,
109 bool isImplementation)
110 : DeclInfo(Info_ObjCContainer, isRedeclaration,
111 /*isDefinition=*/!isForwardRef, /*isContainer=*/!isForwardRef) {
112 init(isForwardRef, isImplementation);
113 }
114 ObjCContainerDeclInfo(DInfoKind K,
115 bool isForwardRef,
116 bool isRedeclaration,
117 bool isImplementation)
118 : DeclInfo(K, isRedeclaration, /*isDefinition=*/!isForwardRef,
119 /*isContainer=*/!isForwardRef) {
120 init(isForwardRef, isImplementation);
121 }
122
123 static bool classof(const DeclInfo *D) {
124 return Info_ObjCContainer <= D->Kind && D->Kind <= Info_ObjCCategory;
125 }
Argyrios Kyrtzidisc71d5542011-11-14 22:39:19 +0000126
127private:
128 void init(bool isForwardRef, bool isImplementation) {
129 if (isForwardRef)
130 ObjCContDeclInfo.kind = CXIdxObjCContainer_ForwardRef;
131 else if (isImplementation)
132 ObjCContDeclInfo.kind = CXIdxObjCContainer_Implementation;
133 else
134 ObjCContDeclInfo.kind = CXIdxObjCContainer_Interface;
135 }
136};
137
138struct ObjCInterfaceDeclInfo : public ObjCContainerDeclInfo {
139 CXIdxObjCInterfaceDeclInfo ObjCInterDeclInfo;
140 CXIdxObjCProtocolRefListInfo ObjCProtoListInfo;
141
142 ObjCInterfaceDeclInfo(const ObjCInterfaceDecl *D)
143 : ObjCContainerDeclInfo(Info_ObjCInterface,
144 /*isForwardRef=*/false,
Douglas Gregoref96ee02012-01-14 16:38:05 +0000145 /*isRedeclaration=*/D->getPreviousDecl() != 0,
Argyrios Kyrtzidisc71d5542011-11-14 22:39:19 +0000146 /*isImplementation=*/false) { }
147
148 static bool classof(const DeclInfo *D) {
149 return D->Kind == Info_ObjCInterface;
150 }
Argyrios Kyrtzidisc71d5542011-11-14 22:39:19 +0000151};
152
153struct ObjCProtocolDeclInfo : public ObjCContainerDeclInfo {
154 CXIdxObjCProtocolRefListInfo ObjCProtoRefListInfo;
155
156 ObjCProtocolDeclInfo(const ObjCProtocolDecl *D)
157 : ObjCContainerDeclInfo(Info_ObjCProtocol,
158 /*isForwardRef=*/false,
Douglas Gregoref96ee02012-01-14 16:38:05 +0000159 /*isRedeclaration=*/D->getPreviousDecl(),
Argyrios Kyrtzidisc71d5542011-11-14 22:39:19 +0000160 /*isImplementation=*/false) { }
161
162 static bool classof(const DeclInfo *D) {
163 return D->Kind == Info_ObjCProtocol;
164 }
Argyrios Kyrtzidisdd93c592011-11-11 00:23:36 +0000165};
166
167struct ObjCCategoryDeclInfo : public ObjCContainerDeclInfo {
Argyrios Kyrtzidis6ec43ad2011-11-12 02:16:30 +0000168 CXIdxObjCCategoryDeclInfo ObjCCatDeclInfo;
Argyrios Kyrtzidisc10a4c82011-12-13 18:47:45 +0000169 CXIdxObjCProtocolRefListInfo ObjCProtoListInfo;
Argyrios Kyrtzidis6ec43ad2011-11-12 02:16:30 +0000170
Argyrios Kyrtzidisc71d5542011-11-14 22:39:19 +0000171 explicit ObjCCategoryDeclInfo(bool isImplementation)
172 : ObjCContainerDeclInfo(Info_ObjCCategory,
173 /*isForwardRef=*/false,
174 /*isRedeclaration=*/isImplementation,
175 /*isImplementation=*/isImplementation) { }
Argyrios Kyrtzidis6ec43ad2011-11-12 02:16:30 +0000176
Argyrios Kyrtzidisc71d5542011-11-14 22:39:19 +0000177 static bool classof(const DeclInfo *D) {
178 return D->Kind == Info_ObjCCategory;
179 }
Argyrios Kyrtzidisdd93c592011-11-11 00:23:36 +0000180};
181
Argyrios Kyrtzidis792db262012-02-28 17:50:33 +0000182struct ObjCPropertyDeclInfo : public DeclInfo {
183 CXIdxObjCPropertyDeclInfo ObjCPropDeclInfo;
184
185 ObjCPropertyDeclInfo()
186 : DeclInfo(Info_ObjCProperty,
187 /*isRedeclaration=*/false, /*isDefinition=*/false,
188 /*isContainer=*/false) { }
189
190 static bool classof(const DeclInfo *D) {
191 return D->Kind == Info_ObjCProperty;
192 }
Argyrios Kyrtzidis792db262012-02-28 17:50:33 +0000193};
194
Argyrios Kyrtzidis2957e6f2011-11-22 07:24:51 +0000195struct CXXClassDeclInfo : public DeclInfo {
196 CXIdxCXXClassDeclInfo CXXClassInfo;
197
198 CXXClassDeclInfo(bool isRedeclaration, bool isDefinition)
199 : DeclInfo(Info_CXXClass, isRedeclaration, isDefinition, isDefinition) { }
200
201 static bool classof(const DeclInfo *D) {
202 return D->Kind == Info_CXXClass;
203 }
Argyrios Kyrtzidis2957e6f2011-11-22 07:24:51 +0000204};
205
Argyrios Kyrtzidisb395c632011-11-18 00:26:51 +0000206struct AttrInfo : public CXIdxAttrInfo {
207 const Attr *A;
208
209 AttrInfo(CXIdxAttrKind Kind, CXCursor C, CXIdxLoc Loc, const Attr *A) {
210 kind = Kind;
211 cursor = C;
212 loc = Loc;
213 this->A = A;
214 }
Argyrios Kyrtzidisb395c632011-11-18 00:26:51 +0000215};
216
217struct IBOutletCollectionInfo : public AttrInfo {
Argyrios Kyrtzidis2957e6f2011-11-22 07:24:51 +0000218 EntityInfo ClassInfo;
Argyrios Kyrtzidisb395c632011-11-18 00:26:51 +0000219 CXIdxIBOutletCollectionAttrInfo IBCollInfo;
220
221 IBOutletCollectionInfo(CXCursor C, CXIdxLoc Loc, const Attr *A) :
222 AttrInfo(CXIdxAttr_IBOutletCollection, C, Loc, A) {
223 assert(C.kind == CXCursor_IBOutletCollectionAttr);
Argyrios Kyrtzidis643d3ce2011-12-15 00:05:00 +0000224 IBCollInfo.objcClass = 0;
Argyrios Kyrtzidisb395c632011-11-18 00:26:51 +0000225 }
226
Argyrios Kyrtzidis643d3ce2011-12-15 00:05:00 +0000227 IBOutletCollectionInfo(const IBOutletCollectionInfo &other);
228
Argyrios Kyrtzidisb395c632011-11-18 00:26:51 +0000229 static bool classof(const AttrInfo *A) {
230 return A->kind == CXIdxAttr_IBOutletCollection;
231 }
Argyrios Kyrtzidisb395c632011-11-18 00:26:51 +0000232};
233
Argyrios Kyrtzidis643d3ce2011-12-15 00:05:00 +0000234class AttrListInfo {
Argyrios Kyrtzidisd786f1a2012-03-31 01:14:06 +0000235 ScratchAlloc SA;
236
Argyrios Kyrtzidis643d3ce2011-12-15 00:05:00 +0000237 SmallVector<AttrInfo, 2> Attrs;
238 SmallVector<IBOutletCollectionInfo, 2> IBCollAttrs;
239 SmallVector<CXIdxAttrInfo *, 2> CXAttrs;
240 unsigned ref_cnt;
241
Dmitri Gribenkof56faa02012-09-15 20:20:27 +0000242 AttrListInfo(const AttrListInfo &) LLVM_DELETED_FUNCTION;
243 void operator=(const AttrListInfo &) LLVM_DELETED_FUNCTION;
Argyrios Kyrtzidis643d3ce2011-12-15 00:05:00 +0000244public:
Argyrios Kyrtzidisd786f1a2012-03-31 01:14:06 +0000245 AttrListInfo(const Decl *D, IndexingContext &IdxCtx);
246
247 static IntrusiveRefCntPtr<AttrListInfo> create(const Decl *D,
248 IndexingContext &IdxCtx);
Argyrios Kyrtzidis643d3ce2011-12-15 00:05:00 +0000249
250 const CXIdxAttrInfo *const *getAttrs() const {
251 if (CXAttrs.empty())
252 return 0;
253 return CXAttrs.data();
254 }
255 unsigned getNumAttrs() const { return (unsigned)CXAttrs.size(); }
256
257 /// \brief Retain/Release only useful when we allocate a AttrListInfo from the
258 /// BumpPtrAllocator, and not from the stack; so that we keep a pointer
259 // in the EntityInfo
260 void Retain() { ++ref_cnt; }
261 void Release() {
262 assert (ref_cnt > 0 && "Reference count is already zero.");
263 if (--ref_cnt == 0) {
264 // Memory is allocated from a BumpPtrAllocator, no need to delete it.
265 this->~AttrListInfo();
266 }
267 }
268};
269
Argyrios Kyrtzidisc6b4a502011-11-16 02:34:59 +0000270struct RefFileOccurence {
271 const FileEntry *File;
272 const Decl *Dcl;
273
274 RefFileOccurence(const FileEntry *File, const Decl *Dcl)
275 : File(File), Dcl(Dcl) { }
276};
277
Argyrios Kyrtzidis4e7064f2011-10-17 19:48:19 +0000278class IndexingContext {
279 ASTContext *Ctx;
280 CXClientData ClientData;
281 IndexerCallbacks &CB;
282 unsigned IndexOptions;
283 CXTranslationUnit CXTU;
284
Argyrios Kyrtzidisdd93c592011-11-11 00:23:36 +0000285 typedef llvm::DenseMap<const FileEntry *, CXIdxClientFile> FileMapTy;
Argyrios Kyrtzidis2957e6f2011-11-22 07:24:51 +0000286 typedef llvm::DenseMap<const DeclContext *, CXIdxClientContainer>
287 ContainerMapTy;
288 typedef llvm::DenseMap<const Decl *, CXIdxClientEntity> EntityMapTy;
289
Argyrios Kyrtzidis4e7064f2011-10-17 19:48:19 +0000290 FileMapTy FileMap;
Argyrios Kyrtzidis4e7064f2011-10-17 19:48:19 +0000291 ContainerMapTy ContainerMap;
Argyrios Kyrtzidis2957e6f2011-11-22 07:24:51 +0000292 EntityMapTy EntityMap;
Argyrios Kyrtzidis4e7064f2011-10-17 19:48:19 +0000293
Argyrios Kyrtzidisc6b4a502011-11-16 02:34:59 +0000294 llvm::DenseSet<RefFileOccurence> RefFileOccurences;
295
Argyrios Kyrtzidis30a28052012-03-23 23:24:18 +0000296 std::deque<DeclGroupRef> TUDeclsInObjCContainer;
Argyrios Kyrtzidis4e7064f2011-10-17 19:48:19 +0000297
Argyrios Kyrtzidis37f40572011-11-23 20:27:26 +0000298 llvm::BumpPtrAllocator StrScratch;
Argyrios Kyrtzidisdd93c592011-11-11 00:23:36 +0000299 unsigned StrAdapterCount;
Argyrios Kyrtzidis643d3ce2011-12-15 00:05:00 +0000300 friend class ScratchAlloc;
Argyrios Kyrtzidis4e7064f2011-10-17 19:48:19 +0000301
Argyrios Kyrtzidis6ec43ad2011-11-12 02:16:30 +0000302 struct ObjCProtocolListInfo {
303 SmallVector<CXIdxObjCProtocolRefInfo, 4> ProtInfos;
Argyrios Kyrtzidis2957e6f2011-11-22 07:24:51 +0000304 SmallVector<EntityInfo, 4> ProtEntities;
Argyrios Kyrtzidis6ec43ad2011-11-12 02:16:30 +0000305 SmallVector<CXIdxObjCProtocolRefInfo *, 4> Prots;
306
Argyrios Kyrtzidisb395c632011-11-18 00:26:51 +0000307 CXIdxObjCProtocolRefListInfo getListInfo() const {
Argyrios Kyrtzidisc71d5542011-11-14 22:39:19 +0000308 CXIdxObjCProtocolRefListInfo Info = { Prots.data(),
309 (unsigned)Prots.size() };
310 return Info;
311 }
Argyrios Kyrtzidis6ec43ad2011-11-12 02:16:30 +0000312
313 ObjCProtocolListInfo(const ObjCProtocolList &ProtList,
314 IndexingContext &IdxCtx,
Argyrios Kyrtzidis643d3ce2011-12-15 00:05:00 +0000315 ScratchAlloc &SA);
Argyrios Kyrtzidis2957e6f2011-11-22 07:24:51 +0000316 };
317
318 struct CXXBasesListInfo {
319 SmallVector<CXIdxBaseClassInfo, 4> BaseInfos;
320 SmallVector<EntityInfo, 4> BaseEntities;
321 SmallVector<CXIdxBaseClassInfo *, 4> CXBases;
322
323 const CXIdxBaseClassInfo *const *getBases() const {
324 return CXBases.data();
325 }
326 unsigned getNumBases() const { return (unsigned)CXBases.size(); }
327
328 CXXBasesListInfo(const CXXRecordDecl *D,
Argyrios Kyrtzidis643d3ce2011-12-15 00:05:00 +0000329 IndexingContext &IdxCtx, ScratchAlloc &SA);
Argyrios Kyrtzidisb526a872011-12-07 20:44:15 +0000330
331 private:
332 SourceLocation getBaseLoc(const CXXBaseSpecifier &Base) const;
Argyrios Kyrtzidis2957e6f2011-11-22 07:24:51 +0000333 };
Argyrios Kyrtzidisb395c632011-11-18 00:26:51 +0000334
Argyrios Kyrtzidis643d3ce2011-12-15 00:05:00 +0000335 friend class AttrListInfo;
336
Argyrios Kyrtzidis4e7064f2011-10-17 19:48:19 +0000337public:
338 IndexingContext(CXClientData clientData, IndexerCallbacks &indexCallbacks,
339 unsigned indexOptions, CXTranslationUnit cxTU)
340 : Ctx(0), ClientData(clientData), CB(indexCallbacks),
Argyrios Kyrtzidis37f40572011-11-23 20:27:26 +0000341 IndexOptions(indexOptions), CXTU(cxTU),
342 StrScratch(/*size=*/1024), StrAdapterCount(0) { }
Argyrios Kyrtzidis4e7064f2011-10-17 19:48:19 +0000343
344 ASTContext &getASTContext() const { return *Ctx; }
345
346 void setASTContext(ASTContext &ctx);
Argyrios Kyrtzidis7fe90f32012-01-17 18:48:07 +0000347 void setPreprocessor(Preprocessor &PP);
Argyrios Kyrtzidis4e7064f2011-10-17 19:48:19 +0000348
Argyrios Kyrtzidis58d2dbe2012-02-14 22:23:11 +0000349 bool shouldSuppressRefs() const {
Argyrios Kyrtzidisb395c632011-11-18 00:26:51 +0000350 return IndexOptions & CXIndexOpt_SuppressRedundantRefs;
Argyrios Kyrtzidisc6b4a502011-11-16 02:34:59 +0000351 }
352
Argyrios Kyrtzidis58d2dbe2012-02-14 22:23:11 +0000353 bool shouldIndexFunctionLocalSymbols() const {
Argyrios Kyrtzidis22490742012-01-14 00:11:49 +0000354 return IndexOptions & CXIndexOpt_IndexFunctionLocalSymbols;
355 }
356
Argyrios Kyrtzidis58d2dbe2012-02-14 22:23:11 +0000357 bool shouldIndexImplicitTemplateInsts() const {
358 return IndexOptions & CXIndexOpt_IndexImplicitTemplateInstantiations;
359 }
360
Argyrios Kyrtzidis3bed3d12012-09-10 22:58:04 +0000361 static bool isFunctionLocalDecl(const Decl *D);
362
Argyrios Kyrtzidisb395c632011-11-18 00:26:51 +0000363 bool shouldAbort();
364
Argyrios Kyrtzidis996e6e52011-12-01 02:42:50 +0000365 bool hasDiagnosticCallback() const { return CB.diagnostic; }
366
Argyrios Kyrtzidisdd93c592011-11-11 00:23:36 +0000367 void enteredMainFile(const FileEntry *File);
368
Argyrios Kyrtzidis4e7064f2011-10-17 19:48:19 +0000369 void ppIncludedFile(SourceLocation hashLoc,
370 StringRef filename, const FileEntry *File,
Argyrios Kyrtzidis8d7a24e2012-10-18 00:17:05 +0000371 bool isImport, bool isAngled, bool isModuleImport);
Argyrios Kyrtzidis4e7064f2011-10-17 19:48:19 +0000372
Argyrios Kyrtzidis37f2f522012-10-03 21:05:44 +0000373 void importedModule(const ImportDecl *ImportD);
Argyrios Kyrtzidis3da76bf2012-10-03 21:05:51 +0000374 void importedPCH(const FileEntry *File);
Argyrios Kyrtzidis2c3e05c2012-10-02 16:10:38 +0000375
Argyrios Kyrtzidis6ec43ad2011-11-12 02:16:30 +0000376 void startedTranslationUnit();
Argyrios Kyrtzidis4e7064f2011-10-17 19:48:19 +0000377
378 void indexDecl(const Decl *D);
379
380 void indexTagDecl(const TagDecl *D);
381
382 void indexTypeSourceInfo(TypeSourceInfo *TInfo, const NamedDecl *Parent,
383 const DeclContext *DC = 0);
384
385 void indexTypeLoc(TypeLoc TL, const NamedDecl *Parent,
Argyrios Kyrtzidise422e452011-12-13 18:47:41 +0000386 const DeclContext *DC = 0);
387
388 void indexNestedNameSpecifierLoc(NestedNameSpecifierLoc NNS,
389 const NamedDecl *Parent,
390 const DeclContext *DC = 0);
Argyrios Kyrtzidis4e7064f2011-10-17 19:48:19 +0000391
392 void indexDeclContext(const DeclContext *DC);
393
Argyrios Kyrtzidise422e452011-12-13 18:47:41 +0000394 void indexBody(const Stmt *S, const NamedDecl *Parent,
395 const DeclContext *DC = 0);
Argyrios Kyrtzidis4e7064f2011-10-17 19:48:19 +0000396
Argyrios Kyrtzidisb395c632011-11-18 00:26:51 +0000397 void handleDiagnosticSet(CXDiagnosticSet CXDiagSet);
Argyrios Kyrtzidis4e7064f2011-10-17 19:48:19 +0000398
Argyrios Kyrtzidisb395c632011-11-18 00:26:51 +0000399 bool handleFunction(const FunctionDecl *FD);
Argyrios Kyrtzidis4e7064f2011-10-17 19:48:19 +0000400
Argyrios Kyrtzidisb395c632011-11-18 00:26:51 +0000401 bool handleVar(const VarDecl *D);
Argyrios Kyrtzidis4e7064f2011-10-17 19:48:19 +0000402
Argyrios Kyrtzidisb395c632011-11-18 00:26:51 +0000403 bool handleField(const FieldDecl *D);
Argyrios Kyrtzidis4e7064f2011-10-17 19:48:19 +0000404
Argyrios Kyrtzidisb395c632011-11-18 00:26:51 +0000405 bool handleEnumerator(const EnumConstantDecl *D);
Argyrios Kyrtzidis4e7064f2011-10-17 19:48:19 +0000406
Argyrios Kyrtzidisb395c632011-11-18 00:26:51 +0000407 bool handleTagDecl(const TagDecl *D);
Argyrios Kyrtzidis4e7064f2011-10-17 19:48:19 +0000408
Argyrios Kyrtzidis2957e6f2011-11-22 07:24:51 +0000409 bool handleTypedefName(const TypedefNameDecl *D);
Argyrios Kyrtzidis4e7064f2011-10-17 19:48:19 +0000410
Argyrios Kyrtzidisb395c632011-11-18 00:26:51 +0000411 bool handleObjCInterface(const ObjCInterfaceDecl *D);
412 bool handleObjCImplementation(const ObjCImplementationDecl *D);
Argyrios Kyrtzidis4e7064f2011-10-17 19:48:19 +0000413
Argyrios Kyrtzidisb395c632011-11-18 00:26:51 +0000414 bool handleObjCProtocol(const ObjCProtocolDecl *D);
Argyrios Kyrtzidis4e7064f2011-10-17 19:48:19 +0000415
Argyrios Kyrtzidisb395c632011-11-18 00:26:51 +0000416 bool handleObjCCategory(const ObjCCategoryDecl *D);
417 bool handleObjCCategoryImpl(const ObjCCategoryImplDecl *D);
Argyrios Kyrtzidis4e7064f2011-10-17 19:48:19 +0000418
Argyrios Kyrtzidisb395c632011-11-18 00:26:51 +0000419 bool handleObjCMethod(const ObjCMethodDecl *D);
Argyrios Kyrtzidis4e7064f2011-10-17 19:48:19 +0000420
Argyrios Kyrtzidisb395c632011-11-18 00:26:51 +0000421 bool handleSynthesizedObjCProperty(const ObjCPropertyImplDecl *D);
Argyrios Kyrtzidisf9112422012-02-28 17:50:39 +0000422 bool handleSynthesizedObjCMethod(const ObjCMethodDecl *D, SourceLocation Loc,
423 const DeclContext *LexicalDC);
Argyrios Kyrtzidis4e7064f2011-10-17 19:48:19 +0000424
Argyrios Kyrtzidisb395c632011-11-18 00:26:51 +0000425 bool handleObjCProperty(const ObjCPropertyDecl *D);
426
Argyrios Kyrtzidis68478b02011-12-07 05:52:06 +0000427 bool handleNamespace(const NamespaceDecl *D);
428
Argyrios Kyrtzidis2957e6f2011-11-22 07:24:51 +0000429 bool handleClassTemplate(const ClassTemplateDecl *D);
430 bool handleFunctionTemplate(const FunctionTemplateDecl *D);
431 bool handleTypeAliasTemplate(const TypeAliasTemplateDecl *D);
432
Argyrios Kyrtzidisb395c632011-11-18 00:26:51 +0000433 bool handleReference(const NamedDecl *D, SourceLocation Loc, CXCursor Cursor,
434 const NamedDecl *Parent,
435 const DeclContext *DC,
436 const Expr *E = 0,
437 CXIdxEntityRefKind Kind = CXIdxEntityRef_Direct);
438
439 bool handleReference(const NamedDecl *D, SourceLocation Loc,
Argyrios Kyrtzidis4e7064f2011-10-17 19:48:19 +0000440 const NamedDecl *Parent,
441 const DeclContext *DC,
Argyrios Kyrtzidisaca19be2011-10-18 15:50:50 +0000442 const Expr *E = 0,
443 CXIdxEntityRefKind Kind = CXIdxEntityRef_Direct);
Argyrios Kyrtzidis4e7064f2011-10-17 19:48:19 +0000444
445 bool isNotFromSourceFile(SourceLocation Loc) const;
446
Argyrios Kyrtzidis3bed3d12012-09-10 22:58:04 +0000447 void indexTopLevelDecl(const Decl *D);
Argyrios Kyrtzidis4e7064f2011-10-17 19:48:19 +0000448 void indexTUDeclsInObjCContainer();
449 void indexDeclGroupRef(DeclGroupRef DG);
450
451 void addTUDeclInObjCContainer(DeclGroupRef DG) {
452 TUDeclsInObjCContainer.push_back(DG);
453 }
454
Argyrios Kyrtzidisdd93c592011-11-11 00:23:36 +0000455 void translateLoc(SourceLocation Loc, CXIdxClientFile *indexFile, CXFile *file,
Argyrios Kyrtzidis4e7064f2011-10-17 19:48:19 +0000456 unsigned *line, unsigned *column, unsigned *offset);
457
Argyrios Kyrtzidis2957e6f2011-11-22 07:24:51 +0000458 CXIdxClientContainer getClientContainerForDC(const DeclContext *DC) const;
459 void addContainerInMap(const DeclContext *DC, CXIdxClientContainer container);
460
461 CXIdxClientEntity getClientEntity(const Decl *D) const;
462 void setClientEntity(const Decl *D, CXIdxClientEntity client);
463
Argyrios Kyrtzidis6d968362012-02-10 20:10:44 +0000464 static bool isTemplateImplicitInstantiation(const Decl *D);
465
Argyrios Kyrtzidis4e7064f2011-10-17 19:48:19 +0000466private:
Argyrios Kyrtzidisb395c632011-11-18 00:26:51 +0000467 bool handleDecl(const NamedDecl *D,
Argyrios Kyrtzidisdd93c592011-11-11 00:23:36 +0000468 SourceLocation Loc, CXCursor Cursor,
Argyrios Kyrtzidisf9112422012-02-28 17:50:39 +0000469 DeclInfo &DInfo,
470 const DeclContext *LexicalDC = 0);
Argyrios Kyrtzidis4e7064f2011-10-17 19:48:19 +0000471
Argyrios Kyrtzidisb395c632011-11-18 00:26:51 +0000472 bool handleObjCContainer(const ObjCContainerDecl *D,
Argyrios Kyrtzidisdd93c592011-11-11 00:23:36 +0000473 SourceLocation Loc, CXCursor Cursor,
Argyrios Kyrtzidisdd93c592011-11-11 00:23:36 +0000474 ObjCContainerDeclInfo &ContDInfo);
Argyrios Kyrtzidis4e7064f2011-10-17 19:48:19 +0000475
Argyrios Kyrtzidis2957e6f2011-11-22 07:24:51 +0000476 bool handleCXXRecordDecl(const CXXRecordDecl *RD, const NamedDecl *OrigD);
Argyrios Kyrtzidisdd93c592011-11-11 00:23:36 +0000477
Argyrios Kyrtzidisb395c632011-11-18 00:26:51 +0000478 bool markEntityOccurrenceInFile(const NamedDecl *D, SourceLocation Loc);
479
Argyrios Kyrtzidis4e7064f2011-10-17 19:48:19 +0000480 const NamedDecl *getEntityDecl(const NamedDecl *D) const;
481
Argyrios Kyrtzidis2957e6f2011-11-22 07:24:51 +0000482 const DeclContext *getEntityContainer(const Decl *D) const;
483
Argyrios Kyrtzidisdd93c592011-11-11 00:23:36 +0000484 CXIdxClientFile getIndexFile(const FileEntry *File);
Argyrios Kyrtzidis4e7064f2011-10-17 19:48:19 +0000485
486 CXIdxLoc getIndexLoc(SourceLocation Loc) const;
487
Argyrios Kyrtzidis4e7064f2011-10-17 19:48:19 +0000488 void getEntityInfo(const NamedDecl *D,
Argyrios Kyrtzidis2957e6f2011-11-22 07:24:51 +0000489 EntityInfo &EntityInfo,
Argyrios Kyrtzidis643d3ce2011-12-15 00:05:00 +0000490 ScratchAlloc &SA);
Argyrios Kyrtzidis4e7064f2011-10-17 19:48:19 +0000491
Argyrios Kyrtzidis2957e6f2011-11-22 07:24:51 +0000492 void getContainerInfo(const DeclContext *DC, ContainerInfo &ContInfo);
493
Argyrios Kyrtzidisb395c632011-11-18 00:26:51 +0000494 CXCursor getCursor(const Decl *D) {
495 return cxcursor::MakeCXCursor(const_cast<Decl*>(D), CXTU);
Argyrios Kyrtzidis4e7064f2011-10-17 19:48:19 +0000496 }
497
498 CXCursor getRefCursor(const NamedDecl *D, SourceLocation Loc);
Argyrios Kyrtzidis2957e6f2011-11-22 07:24:51 +0000499
Argyrios Kyrtzidisd0890082012-02-07 22:46:16 +0000500 static bool shouldIgnoreIfImplicit(const Decl *D);
Argyrios Kyrtzidis4e7064f2011-10-17 19:48:19 +0000501};
502
Argyrios Kyrtzidisd786f1a2012-03-31 01:14:06 +0000503inline ScratchAlloc::ScratchAlloc(IndexingContext &idxCtx) : IdxCtx(idxCtx) {
504 ++IdxCtx.StrAdapterCount;
505}
506inline ScratchAlloc::ScratchAlloc(const ScratchAlloc &SA) : IdxCtx(SA.IdxCtx) {
507 ++IdxCtx.StrAdapterCount;
508}
Argyrios Kyrtzidis643d3ce2011-12-15 00:05:00 +0000509
Argyrios Kyrtzidisd786f1a2012-03-31 01:14:06 +0000510inline ScratchAlloc::~ScratchAlloc() {
511 --IdxCtx.StrAdapterCount;
512 if (IdxCtx.StrAdapterCount == 0)
513 IdxCtx.StrScratch.Reset();
514}
Argyrios Kyrtzidis643d3ce2011-12-15 00:05:00 +0000515
Argyrios Kyrtzidisd786f1a2012-03-31 01:14:06 +0000516template <typename T>
517inline T *ScratchAlloc::allocate() {
518 return IdxCtx.StrScratch.Allocate<T>();
519}
Argyrios Kyrtzidis643d3ce2011-12-15 00:05:00 +0000520
Argyrios Kyrtzidis4e7064f2011-10-17 19:48:19 +0000521}} // end clang::cxindex
Argyrios Kyrtzidisc6b4a502011-11-16 02:34:59 +0000522
523namespace llvm {
524 /// Define DenseMapInfo so that FileID's can be used as keys in DenseMap and
525 /// DenseSets.
526 template <>
527 struct DenseMapInfo<clang::cxindex::RefFileOccurence> {
528 static inline clang::cxindex::RefFileOccurence getEmptyKey() {
529 return clang::cxindex::RefFileOccurence(0, 0);
530 }
531
532 static inline clang::cxindex::RefFileOccurence getTombstoneKey() {
533 return clang::cxindex::RefFileOccurence((const clang::FileEntry *)~0,
534 (const clang::Decl *)~0);
535 }
536
537 static unsigned getHashValue(clang::cxindex::RefFileOccurence S) {
Benjamin Kramer28b23072012-05-27 13:28:44 +0000538 typedef std::pair<const clang::FileEntry *, const clang::Decl *> PairTy;
539 return DenseMapInfo<PairTy>::getHashValue(PairTy(S.File, S.Dcl));
Argyrios Kyrtzidisc6b4a502011-11-16 02:34:59 +0000540 }
541
542 static bool isEqual(clang::cxindex::RefFileOccurence LHS,
543 clang::cxindex::RefFileOccurence RHS) {
544 return LHS.File == RHS.File && LHS.Dcl == RHS.Dcl;
545 }
546 };
547}