blob: e92894ae6606f2da888a551ad2f52b2b897fd73e [file] [log] [blame]
Argyrios Kyrtzidis4e7064f2011-10-17 19:48:19 +00001//===- IndexingContext.h - Higher level API functions ------------------------===//
2//
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
10#include "Index_Internal.h"
11#include "CXCursor.h"
12
Argyrios Kyrtzidis6ec43ad2011-11-12 02:16:30 +000013#include "clang/AST/DeclObjC.h"
Argyrios Kyrtzidis4e7064f2011-10-17 19:48:19 +000014#include "clang/AST/DeclGroup.h"
Argyrios Kyrtzidisc6b4a502011-11-16 02:34:59 +000015#include "llvm/ADT/DenseSet.h"
Argyrios Kyrtzidis30a28052012-03-23 23:24:18 +000016#include <deque>
Argyrios Kyrtzidis4e7064f2011-10-17 19:48:19 +000017
18namespace clang {
19 class FileEntry;
20 class ObjCPropertyDecl;
Argyrios Kyrtzidis2957e6f2011-11-22 07:24:51 +000021 class ClassTemplateDecl;
22 class FunctionTemplateDecl;
23 class TypeAliasTemplateDecl;
Argyrios Kyrtzidis6d968362012-02-10 20:10:44 +000024 class ClassTemplateSpecializationDecl;
Argyrios Kyrtzidis4e7064f2011-10-17 19:48:19 +000025
26namespace cxindex {
27 class IndexingContext;
Argyrios Kyrtzidis643d3ce2011-12-15 00:05:00 +000028 class AttrListInfo;
Argyrios Kyrtzidis4e7064f2011-10-17 19:48:19 +000029
Argyrios Kyrtzidisd786f1a2012-03-31 01:14:06 +000030class ScratchAlloc {
31 IndexingContext &IdxCtx;
32
33public:
34 explicit ScratchAlloc(IndexingContext &indexCtx);
35 ScratchAlloc(const ScratchAlloc &SA);
36
37 ~ScratchAlloc();
38
39 const char *toCStr(StringRef Str);
40 const char *copyCStr(StringRef Str);
41
42 template <typename T>
43 T *allocate();
44};
45
Argyrios Kyrtzidis2957e6f2011-11-22 07:24:51 +000046struct EntityInfo : public CXIdxEntityInfo {
47 const NamedDecl *Dcl;
48 IndexingContext *IndexCtx;
Dylan Noblesmithc93dc782012-02-20 14:00:23 +000049 IntrusiveRefCntPtr<AttrListInfo> AttrList;
Argyrios Kyrtzidis37f40572011-11-23 20:27:26 +000050
51 EntityInfo() {
52 name = USR = 0;
Argyrios Kyrtzidis643d3ce2011-12-15 00:05:00 +000053 attributes = 0;
54 numAttributes = 0;
Argyrios Kyrtzidis37f40572011-11-23 20:27:26 +000055 }
Argyrios Kyrtzidis2957e6f2011-11-22 07:24:51 +000056};
57
58struct ContainerInfo : public CXIdxContainerInfo {
59 const DeclContext *DC;
60 IndexingContext *IndexCtx;
61};
62
Argyrios Kyrtzidisdd93c592011-11-11 00:23:36 +000063struct DeclInfo : public CXIdxDeclInfo {
Argyrios Kyrtzidisc71d5542011-11-14 22:39:19 +000064 enum DInfoKind {
65 Info_Decl,
66
67 Info_ObjCContainer,
68 Info_ObjCInterface,
69 Info_ObjCProtocol,
Argyrios Kyrtzidis2957e6f2011-11-22 07:24:51 +000070 Info_ObjCCategory,
71
Argyrios Kyrtzidis792db262012-02-28 17:50:33 +000072 Info_ObjCProperty,
73
Argyrios Kyrtzidis2957e6f2011-11-22 07:24:51 +000074 Info_CXXClass
Argyrios Kyrtzidisc71d5542011-11-14 22:39:19 +000075 };
76
77 DInfoKind Kind;
78
Argyrios Kyrtzidis2957e6f2011-11-22 07:24:51 +000079 EntityInfo EntInfo;
Argyrios Kyrtzidisb1febb62011-12-07 20:44:19 +000080 ContainerInfo SemanticContainer;
81 ContainerInfo LexicalContainer;
Argyrios Kyrtzidis2957e6f2011-11-22 07:24:51 +000082 ContainerInfo DeclAsContainer;
83
Argyrios Kyrtzidisc71d5542011-11-14 22:39:19 +000084 DeclInfo(bool isRedeclaration, bool isDefinition, bool isContainer)
85 : Kind(Info_Decl) {
86 this->isRedeclaration = isRedeclaration;
87 this->isDefinition = isDefinition;
88 this->isContainer = isContainer;
Argyrios Kyrtzidisb395c632011-11-18 00:26:51 +000089 attributes = 0;
90 numAttributes = 0;
Argyrios Kyrtzidisb1febb62011-12-07 20:44:19 +000091 declAsContainer = semanticContainer = lexicalContainer = 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 Kyrtzidisc71d5542011-11-14 22:39:19 +0000102 }
103
104 static bool classof(const DeclInfo *) { return true; }
Argyrios Kyrtzidisdd93c592011-11-11 00:23:36 +0000105};
106
Argyrios Kyrtzidisdd93c592011-11-11 00:23:36 +0000107struct ObjCContainerDeclInfo : public DeclInfo {
Argyrios Kyrtzidis6ec43ad2011-11-12 02:16:30 +0000108 CXIdxObjCContainerDeclInfo ObjCContDeclInfo;
Argyrios Kyrtzidisc71d5542011-11-14 22:39:19 +0000109
110 ObjCContainerDeclInfo(bool isForwardRef,
111 bool isRedeclaration,
112 bool isImplementation)
113 : DeclInfo(Info_ObjCContainer, isRedeclaration,
114 /*isDefinition=*/!isForwardRef, /*isContainer=*/!isForwardRef) {
115 init(isForwardRef, isImplementation);
116 }
117 ObjCContainerDeclInfo(DInfoKind K,
118 bool isForwardRef,
119 bool isRedeclaration,
120 bool isImplementation)
121 : DeclInfo(K, isRedeclaration, /*isDefinition=*/!isForwardRef,
122 /*isContainer=*/!isForwardRef) {
123 init(isForwardRef, isImplementation);
124 }
125
126 static bool classof(const DeclInfo *D) {
127 return Info_ObjCContainer <= D->Kind && D->Kind <= Info_ObjCCategory;
128 }
129 static bool classof(const ObjCContainerDeclInfo *D) { return true; }
130
131private:
132 void init(bool isForwardRef, bool isImplementation) {
133 if (isForwardRef)
134 ObjCContDeclInfo.kind = CXIdxObjCContainer_ForwardRef;
135 else if (isImplementation)
136 ObjCContDeclInfo.kind = CXIdxObjCContainer_Implementation;
137 else
138 ObjCContDeclInfo.kind = CXIdxObjCContainer_Interface;
139 }
140};
141
142struct ObjCInterfaceDeclInfo : public ObjCContainerDeclInfo {
143 CXIdxObjCInterfaceDeclInfo ObjCInterDeclInfo;
144 CXIdxObjCProtocolRefListInfo ObjCProtoListInfo;
145
146 ObjCInterfaceDeclInfo(const ObjCInterfaceDecl *D)
147 : ObjCContainerDeclInfo(Info_ObjCInterface,
148 /*isForwardRef=*/false,
Douglas Gregoref96ee02012-01-14 16:38:05 +0000149 /*isRedeclaration=*/D->getPreviousDecl() != 0,
Argyrios Kyrtzidisc71d5542011-11-14 22:39:19 +0000150 /*isImplementation=*/false) { }
151
152 static bool classof(const DeclInfo *D) {
153 return D->Kind == Info_ObjCInterface;
154 }
155 static bool classof(const ObjCInterfaceDeclInfo *D) { return true; }
156};
157
158struct ObjCProtocolDeclInfo : public ObjCContainerDeclInfo {
159 CXIdxObjCProtocolRefListInfo ObjCProtoRefListInfo;
160
161 ObjCProtocolDeclInfo(const ObjCProtocolDecl *D)
162 : ObjCContainerDeclInfo(Info_ObjCProtocol,
163 /*isForwardRef=*/false,
Douglas Gregoref96ee02012-01-14 16:38:05 +0000164 /*isRedeclaration=*/D->getPreviousDecl(),
Argyrios Kyrtzidisc71d5542011-11-14 22:39:19 +0000165 /*isImplementation=*/false) { }
166
167 static bool classof(const DeclInfo *D) {
168 return D->Kind == Info_ObjCProtocol;
169 }
170 static bool classof(const ObjCProtocolDeclInfo *D) { return true; }
Argyrios Kyrtzidisdd93c592011-11-11 00:23:36 +0000171};
172
173struct ObjCCategoryDeclInfo : public ObjCContainerDeclInfo {
Argyrios Kyrtzidis6ec43ad2011-11-12 02:16:30 +0000174 CXIdxObjCCategoryDeclInfo ObjCCatDeclInfo;
Argyrios Kyrtzidisc10a4c82011-12-13 18:47:45 +0000175 CXIdxObjCProtocolRefListInfo ObjCProtoListInfo;
Argyrios Kyrtzidis6ec43ad2011-11-12 02:16:30 +0000176
Argyrios Kyrtzidisc71d5542011-11-14 22:39:19 +0000177 explicit ObjCCategoryDeclInfo(bool isImplementation)
178 : ObjCContainerDeclInfo(Info_ObjCCategory,
179 /*isForwardRef=*/false,
180 /*isRedeclaration=*/isImplementation,
181 /*isImplementation=*/isImplementation) { }
Argyrios Kyrtzidis6ec43ad2011-11-12 02:16:30 +0000182
Argyrios Kyrtzidisc71d5542011-11-14 22:39:19 +0000183 static bool classof(const DeclInfo *D) {
184 return D->Kind == Info_ObjCCategory;
185 }
186 static bool classof(const ObjCCategoryDeclInfo *D) { return true; }
Argyrios Kyrtzidisdd93c592011-11-11 00:23:36 +0000187};
188
Argyrios Kyrtzidis792db262012-02-28 17:50:33 +0000189struct ObjCPropertyDeclInfo : public DeclInfo {
190 CXIdxObjCPropertyDeclInfo ObjCPropDeclInfo;
191
192 ObjCPropertyDeclInfo()
193 : DeclInfo(Info_ObjCProperty,
194 /*isRedeclaration=*/false, /*isDefinition=*/false,
195 /*isContainer=*/false) { }
196
197 static bool classof(const DeclInfo *D) {
198 return D->Kind == Info_ObjCProperty;
199 }
200 static bool classof(const ObjCPropertyDeclInfo *D) { return true; }
201};
202
Argyrios Kyrtzidis2957e6f2011-11-22 07:24:51 +0000203struct CXXClassDeclInfo : public DeclInfo {
204 CXIdxCXXClassDeclInfo CXXClassInfo;
205
206 CXXClassDeclInfo(bool isRedeclaration, bool isDefinition)
207 : DeclInfo(Info_CXXClass, isRedeclaration, isDefinition, isDefinition) { }
208
209 static bool classof(const DeclInfo *D) {
210 return D->Kind == Info_CXXClass;
211 }
212 static bool classof(const CXXClassDeclInfo *D) { return true; }
213};
214
Argyrios Kyrtzidisb395c632011-11-18 00:26:51 +0000215struct AttrInfo : public CXIdxAttrInfo {
216 const Attr *A;
217
218 AttrInfo(CXIdxAttrKind Kind, CXCursor C, CXIdxLoc Loc, const Attr *A) {
219 kind = Kind;
220 cursor = C;
221 loc = Loc;
222 this->A = A;
223 }
224
225 static bool classof(const AttrInfo *) { return true; }
226};
227
228struct IBOutletCollectionInfo : public AttrInfo {
Argyrios Kyrtzidis2957e6f2011-11-22 07:24:51 +0000229 EntityInfo ClassInfo;
Argyrios Kyrtzidisb395c632011-11-18 00:26:51 +0000230 CXIdxIBOutletCollectionAttrInfo IBCollInfo;
231
232 IBOutletCollectionInfo(CXCursor C, CXIdxLoc Loc, const Attr *A) :
233 AttrInfo(CXIdxAttr_IBOutletCollection, C, Loc, A) {
234 assert(C.kind == CXCursor_IBOutletCollectionAttr);
Argyrios Kyrtzidis643d3ce2011-12-15 00:05:00 +0000235 IBCollInfo.objcClass = 0;
Argyrios Kyrtzidisb395c632011-11-18 00:26:51 +0000236 }
237
Argyrios Kyrtzidis643d3ce2011-12-15 00:05:00 +0000238 IBOutletCollectionInfo(const IBOutletCollectionInfo &other);
239
Argyrios Kyrtzidisb395c632011-11-18 00:26:51 +0000240 static bool classof(const AttrInfo *A) {
241 return A->kind == CXIdxAttr_IBOutletCollection;
242 }
243 static bool classof(const IBOutletCollectionInfo *D) { return true; }
244};
245
Argyrios Kyrtzidis643d3ce2011-12-15 00:05:00 +0000246class AttrListInfo {
Argyrios Kyrtzidisd786f1a2012-03-31 01:14:06 +0000247 ScratchAlloc SA;
248
Argyrios Kyrtzidis643d3ce2011-12-15 00:05:00 +0000249 SmallVector<AttrInfo, 2> Attrs;
250 SmallVector<IBOutletCollectionInfo, 2> IBCollAttrs;
251 SmallVector<CXIdxAttrInfo *, 2> CXAttrs;
252 unsigned ref_cnt;
253
Dmitri Gribenkof56faa02012-09-15 20:20:27 +0000254 AttrListInfo(const AttrListInfo &) LLVM_DELETED_FUNCTION;
255 void operator=(const AttrListInfo &) LLVM_DELETED_FUNCTION;
Argyrios Kyrtzidis643d3ce2011-12-15 00:05:00 +0000256public:
Argyrios Kyrtzidisd786f1a2012-03-31 01:14:06 +0000257 AttrListInfo(const Decl *D, IndexingContext &IdxCtx);
258
259 static IntrusiveRefCntPtr<AttrListInfo> create(const Decl *D,
260 IndexingContext &IdxCtx);
Argyrios Kyrtzidis643d3ce2011-12-15 00:05:00 +0000261
262 const CXIdxAttrInfo *const *getAttrs() const {
263 if (CXAttrs.empty())
264 return 0;
265 return CXAttrs.data();
266 }
267 unsigned getNumAttrs() const { return (unsigned)CXAttrs.size(); }
268
269 /// \brief Retain/Release only useful when we allocate a AttrListInfo from the
270 /// BumpPtrAllocator, and not from the stack; so that we keep a pointer
271 // in the EntityInfo
272 void Retain() { ++ref_cnt; }
273 void Release() {
274 assert (ref_cnt > 0 && "Reference count is already zero.");
275 if (--ref_cnt == 0) {
276 // Memory is allocated from a BumpPtrAllocator, no need to delete it.
277 this->~AttrListInfo();
278 }
279 }
280};
281
Argyrios Kyrtzidisc6b4a502011-11-16 02:34:59 +0000282struct RefFileOccurence {
283 const FileEntry *File;
284 const Decl *Dcl;
285
286 RefFileOccurence(const FileEntry *File, const Decl *Dcl)
287 : File(File), Dcl(Dcl) { }
288};
289
Argyrios Kyrtzidis4e7064f2011-10-17 19:48:19 +0000290class IndexingContext {
291 ASTContext *Ctx;
292 CXClientData ClientData;
293 IndexerCallbacks &CB;
294 unsigned IndexOptions;
295 CXTranslationUnit CXTU;
296
Argyrios Kyrtzidisdd93c592011-11-11 00:23:36 +0000297 typedef llvm::DenseMap<const FileEntry *, CXIdxClientFile> FileMapTy;
Argyrios Kyrtzidis2957e6f2011-11-22 07:24:51 +0000298 typedef llvm::DenseMap<const DeclContext *, CXIdxClientContainer>
299 ContainerMapTy;
300 typedef llvm::DenseMap<const Decl *, CXIdxClientEntity> EntityMapTy;
301
Argyrios Kyrtzidis4e7064f2011-10-17 19:48:19 +0000302 FileMapTy FileMap;
Argyrios Kyrtzidis4e7064f2011-10-17 19:48:19 +0000303 ContainerMapTy ContainerMap;
Argyrios Kyrtzidis2957e6f2011-11-22 07:24:51 +0000304 EntityMapTy EntityMap;
Argyrios Kyrtzidis4e7064f2011-10-17 19:48:19 +0000305
Argyrios Kyrtzidisc6b4a502011-11-16 02:34:59 +0000306 llvm::DenseSet<RefFileOccurence> RefFileOccurences;
307
Argyrios Kyrtzidis30a28052012-03-23 23:24:18 +0000308 std::deque<DeclGroupRef> TUDeclsInObjCContainer;
Argyrios Kyrtzidis4e7064f2011-10-17 19:48:19 +0000309
Argyrios Kyrtzidis37f40572011-11-23 20:27:26 +0000310 llvm::BumpPtrAllocator StrScratch;
Argyrios Kyrtzidisdd93c592011-11-11 00:23:36 +0000311 unsigned StrAdapterCount;
Argyrios Kyrtzidis643d3ce2011-12-15 00:05:00 +0000312 friend class ScratchAlloc;
Argyrios Kyrtzidis4e7064f2011-10-17 19:48:19 +0000313
Argyrios Kyrtzidis6ec43ad2011-11-12 02:16:30 +0000314 struct ObjCProtocolListInfo {
315 SmallVector<CXIdxObjCProtocolRefInfo, 4> ProtInfos;
Argyrios Kyrtzidis2957e6f2011-11-22 07:24:51 +0000316 SmallVector<EntityInfo, 4> ProtEntities;
Argyrios Kyrtzidis6ec43ad2011-11-12 02:16:30 +0000317 SmallVector<CXIdxObjCProtocolRefInfo *, 4> Prots;
318
Argyrios Kyrtzidisb395c632011-11-18 00:26:51 +0000319 CXIdxObjCProtocolRefListInfo getListInfo() const {
Argyrios Kyrtzidisc71d5542011-11-14 22:39:19 +0000320 CXIdxObjCProtocolRefListInfo Info = { Prots.data(),
321 (unsigned)Prots.size() };
322 return Info;
323 }
Argyrios Kyrtzidis6ec43ad2011-11-12 02:16:30 +0000324
325 ObjCProtocolListInfo(const ObjCProtocolList &ProtList,
326 IndexingContext &IdxCtx,
Argyrios Kyrtzidis643d3ce2011-12-15 00:05:00 +0000327 ScratchAlloc &SA);
Argyrios Kyrtzidis2957e6f2011-11-22 07:24:51 +0000328 };
329
330 struct CXXBasesListInfo {
331 SmallVector<CXIdxBaseClassInfo, 4> BaseInfos;
332 SmallVector<EntityInfo, 4> BaseEntities;
333 SmallVector<CXIdxBaseClassInfo *, 4> CXBases;
334
335 const CXIdxBaseClassInfo *const *getBases() const {
336 return CXBases.data();
337 }
338 unsigned getNumBases() const { return (unsigned)CXBases.size(); }
339
340 CXXBasesListInfo(const CXXRecordDecl *D,
Argyrios Kyrtzidis643d3ce2011-12-15 00:05:00 +0000341 IndexingContext &IdxCtx, ScratchAlloc &SA);
Argyrios Kyrtzidisb526a872011-12-07 20:44:15 +0000342
343 private:
344 SourceLocation getBaseLoc(const CXXBaseSpecifier &Base) const;
Argyrios Kyrtzidis2957e6f2011-11-22 07:24:51 +0000345 };
Argyrios Kyrtzidisb395c632011-11-18 00:26:51 +0000346
Argyrios Kyrtzidis643d3ce2011-12-15 00:05:00 +0000347 friend class AttrListInfo;
348
Argyrios Kyrtzidis4e7064f2011-10-17 19:48:19 +0000349public:
350 IndexingContext(CXClientData clientData, IndexerCallbacks &indexCallbacks,
351 unsigned indexOptions, CXTranslationUnit cxTU)
352 : Ctx(0), ClientData(clientData), CB(indexCallbacks),
Argyrios Kyrtzidis37f40572011-11-23 20:27:26 +0000353 IndexOptions(indexOptions), CXTU(cxTU),
354 StrScratch(/*size=*/1024), StrAdapterCount(0) { }
Argyrios Kyrtzidis4e7064f2011-10-17 19:48:19 +0000355
356 ASTContext &getASTContext() const { return *Ctx; }
357
358 void setASTContext(ASTContext &ctx);
Argyrios Kyrtzidis7fe90f32012-01-17 18:48:07 +0000359 void setPreprocessor(Preprocessor &PP);
Argyrios Kyrtzidis4e7064f2011-10-17 19:48:19 +0000360
Argyrios Kyrtzidis58d2dbe2012-02-14 22:23:11 +0000361 bool shouldSuppressRefs() const {
Argyrios Kyrtzidisb395c632011-11-18 00:26:51 +0000362 return IndexOptions & CXIndexOpt_SuppressRedundantRefs;
Argyrios Kyrtzidisc6b4a502011-11-16 02:34:59 +0000363 }
364
Argyrios Kyrtzidis58d2dbe2012-02-14 22:23:11 +0000365 bool shouldIndexFunctionLocalSymbols() const {
Argyrios Kyrtzidis22490742012-01-14 00:11:49 +0000366 return IndexOptions & CXIndexOpt_IndexFunctionLocalSymbols;
367 }
368
Argyrios Kyrtzidis58d2dbe2012-02-14 22:23:11 +0000369 bool shouldIndexImplicitTemplateInsts() const {
370 return IndexOptions & CXIndexOpt_IndexImplicitTemplateInstantiations;
371 }
372
Argyrios Kyrtzidis3bed3d12012-09-10 22:58:04 +0000373 static bool isFunctionLocalDecl(const Decl *D);
374
Argyrios Kyrtzidisb395c632011-11-18 00:26:51 +0000375 bool shouldAbort();
376
Argyrios Kyrtzidis996e6e52011-12-01 02:42:50 +0000377 bool hasDiagnosticCallback() const { return CB.diagnostic; }
378
Argyrios Kyrtzidisdd93c592011-11-11 00:23:36 +0000379 void enteredMainFile(const FileEntry *File);
380
Argyrios Kyrtzidis4e7064f2011-10-17 19:48:19 +0000381 void ppIncludedFile(SourceLocation hashLoc,
382 StringRef filename, const FileEntry *File,
383 bool isImport, bool isAngled);
384
Argyrios Kyrtzidis37f2f522012-10-03 21:05:44 +0000385 void importedModule(const ImportDecl *ImportD);
Argyrios Kyrtzidis3da76bf2012-10-03 21:05:51 +0000386 void importedPCH(const FileEntry *File);
Argyrios Kyrtzidis2c3e05c2012-10-02 16:10:38 +0000387
Argyrios Kyrtzidis6ec43ad2011-11-12 02:16:30 +0000388 void startedTranslationUnit();
Argyrios Kyrtzidis4e7064f2011-10-17 19:48:19 +0000389
390 void indexDecl(const Decl *D);
391
392 void indexTagDecl(const TagDecl *D);
393
394 void indexTypeSourceInfo(TypeSourceInfo *TInfo, const NamedDecl *Parent,
395 const DeclContext *DC = 0);
396
397 void indexTypeLoc(TypeLoc TL, const NamedDecl *Parent,
Argyrios Kyrtzidise422e452011-12-13 18:47:41 +0000398 const DeclContext *DC = 0);
399
400 void indexNestedNameSpecifierLoc(NestedNameSpecifierLoc NNS,
401 const NamedDecl *Parent,
402 const DeclContext *DC = 0);
Argyrios Kyrtzidis4e7064f2011-10-17 19:48:19 +0000403
404 void indexDeclContext(const DeclContext *DC);
405
Argyrios Kyrtzidise422e452011-12-13 18:47:41 +0000406 void indexBody(const Stmt *S, const NamedDecl *Parent,
407 const DeclContext *DC = 0);
Argyrios Kyrtzidis4e7064f2011-10-17 19:48:19 +0000408
Argyrios Kyrtzidisb395c632011-11-18 00:26:51 +0000409 void handleDiagnosticSet(CXDiagnosticSet CXDiagSet);
Argyrios Kyrtzidis4e7064f2011-10-17 19:48:19 +0000410
Argyrios Kyrtzidisb395c632011-11-18 00:26:51 +0000411 bool handleFunction(const FunctionDecl *FD);
Argyrios Kyrtzidis4e7064f2011-10-17 19:48:19 +0000412
Argyrios Kyrtzidisb395c632011-11-18 00:26:51 +0000413 bool handleVar(const VarDecl *D);
Argyrios Kyrtzidis4e7064f2011-10-17 19:48:19 +0000414
Argyrios Kyrtzidisb395c632011-11-18 00:26:51 +0000415 bool handleField(const FieldDecl *D);
Argyrios Kyrtzidis4e7064f2011-10-17 19:48:19 +0000416
Argyrios Kyrtzidisb395c632011-11-18 00:26:51 +0000417 bool handleEnumerator(const EnumConstantDecl *D);
Argyrios Kyrtzidis4e7064f2011-10-17 19:48:19 +0000418
Argyrios Kyrtzidisb395c632011-11-18 00:26:51 +0000419 bool handleTagDecl(const TagDecl *D);
Argyrios Kyrtzidis4e7064f2011-10-17 19:48:19 +0000420
Argyrios Kyrtzidis2957e6f2011-11-22 07:24:51 +0000421 bool handleTypedefName(const TypedefNameDecl *D);
Argyrios Kyrtzidis4e7064f2011-10-17 19:48:19 +0000422
Argyrios Kyrtzidisb395c632011-11-18 00:26:51 +0000423 bool handleObjCInterface(const ObjCInterfaceDecl *D);
424 bool handleObjCImplementation(const ObjCImplementationDecl *D);
Argyrios Kyrtzidis4e7064f2011-10-17 19:48:19 +0000425
Argyrios Kyrtzidisb395c632011-11-18 00:26:51 +0000426 bool handleObjCProtocol(const ObjCProtocolDecl *D);
Argyrios Kyrtzidis4e7064f2011-10-17 19:48:19 +0000427
Argyrios Kyrtzidisb395c632011-11-18 00:26:51 +0000428 bool handleObjCCategory(const ObjCCategoryDecl *D);
429 bool handleObjCCategoryImpl(const ObjCCategoryImplDecl *D);
Argyrios Kyrtzidis4e7064f2011-10-17 19:48:19 +0000430
Argyrios Kyrtzidisb395c632011-11-18 00:26:51 +0000431 bool handleObjCMethod(const ObjCMethodDecl *D);
Argyrios Kyrtzidis4e7064f2011-10-17 19:48:19 +0000432
Argyrios Kyrtzidisb395c632011-11-18 00:26:51 +0000433 bool handleSynthesizedObjCProperty(const ObjCPropertyImplDecl *D);
Argyrios Kyrtzidisf9112422012-02-28 17:50:39 +0000434 bool handleSynthesizedObjCMethod(const ObjCMethodDecl *D, SourceLocation Loc,
435 const DeclContext *LexicalDC);
Argyrios Kyrtzidis4e7064f2011-10-17 19:48:19 +0000436
Argyrios Kyrtzidisb395c632011-11-18 00:26:51 +0000437 bool handleObjCProperty(const ObjCPropertyDecl *D);
438
Argyrios Kyrtzidis68478b02011-12-07 05:52:06 +0000439 bool handleNamespace(const NamespaceDecl *D);
440
Argyrios Kyrtzidis2957e6f2011-11-22 07:24:51 +0000441 bool handleClassTemplate(const ClassTemplateDecl *D);
442 bool handleFunctionTemplate(const FunctionTemplateDecl *D);
443 bool handleTypeAliasTemplate(const TypeAliasTemplateDecl *D);
444
Argyrios Kyrtzidisb395c632011-11-18 00:26:51 +0000445 bool handleReference(const NamedDecl *D, SourceLocation Loc, CXCursor Cursor,
446 const NamedDecl *Parent,
447 const DeclContext *DC,
448 const Expr *E = 0,
449 CXIdxEntityRefKind Kind = CXIdxEntityRef_Direct);
450
451 bool handleReference(const NamedDecl *D, SourceLocation Loc,
Argyrios Kyrtzidis4e7064f2011-10-17 19:48:19 +0000452 const NamedDecl *Parent,
453 const DeclContext *DC,
Argyrios Kyrtzidisaca19be2011-10-18 15:50:50 +0000454 const Expr *E = 0,
455 CXIdxEntityRefKind Kind = CXIdxEntityRef_Direct);
Argyrios Kyrtzidis4e7064f2011-10-17 19:48:19 +0000456
457 bool isNotFromSourceFile(SourceLocation Loc) const;
458
Argyrios Kyrtzidis3bed3d12012-09-10 22:58:04 +0000459 void indexTopLevelDecl(const Decl *D);
Argyrios Kyrtzidis4e7064f2011-10-17 19:48:19 +0000460 void indexTUDeclsInObjCContainer();
461 void indexDeclGroupRef(DeclGroupRef DG);
462
463 void addTUDeclInObjCContainer(DeclGroupRef DG) {
464 TUDeclsInObjCContainer.push_back(DG);
465 }
466
Argyrios Kyrtzidisdd93c592011-11-11 00:23:36 +0000467 void translateLoc(SourceLocation Loc, CXIdxClientFile *indexFile, CXFile *file,
Argyrios Kyrtzidis4e7064f2011-10-17 19:48:19 +0000468 unsigned *line, unsigned *column, unsigned *offset);
469
Argyrios Kyrtzidis2957e6f2011-11-22 07:24:51 +0000470 CXIdxClientContainer getClientContainerForDC(const DeclContext *DC) const;
471 void addContainerInMap(const DeclContext *DC, CXIdxClientContainer container);
472
473 CXIdxClientEntity getClientEntity(const Decl *D) const;
474 void setClientEntity(const Decl *D, CXIdxClientEntity client);
475
Argyrios Kyrtzidis6d968362012-02-10 20:10:44 +0000476 static bool isTemplateImplicitInstantiation(const Decl *D);
477
Argyrios Kyrtzidis4e7064f2011-10-17 19:48:19 +0000478private:
Argyrios Kyrtzidisb395c632011-11-18 00:26:51 +0000479 bool handleDecl(const NamedDecl *D,
Argyrios Kyrtzidisdd93c592011-11-11 00:23:36 +0000480 SourceLocation Loc, CXCursor Cursor,
Argyrios Kyrtzidisf9112422012-02-28 17:50:39 +0000481 DeclInfo &DInfo,
482 const DeclContext *LexicalDC = 0);
Argyrios Kyrtzidis4e7064f2011-10-17 19:48:19 +0000483
Argyrios Kyrtzidisb395c632011-11-18 00:26:51 +0000484 bool handleObjCContainer(const ObjCContainerDecl *D,
Argyrios Kyrtzidisdd93c592011-11-11 00:23:36 +0000485 SourceLocation Loc, CXCursor Cursor,
Argyrios Kyrtzidisdd93c592011-11-11 00:23:36 +0000486 ObjCContainerDeclInfo &ContDInfo);
Argyrios Kyrtzidis4e7064f2011-10-17 19:48:19 +0000487
Argyrios Kyrtzidis2957e6f2011-11-22 07:24:51 +0000488 bool handleCXXRecordDecl(const CXXRecordDecl *RD, const NamedDecl *OrigD);
Argyrios Kyrtzidisdd93c592011-11-11 00:23:36 +0000489
Argyrios Kyrtzidisb395c632011-11-18 00:26:51 +0000490 bool markEntityOccurrenceInFile(const NamedDecl *D, SourceLocation Loc);
491
Argyrios Kyrtzidis4e7064f2011-10-17 19:48:19 +0000492 const NamedDecl *getEntityDecl(const NamedDecl *D) const;
493
Argyrios Kyrtzidis2957e6f2011-11-22 07:24:51 +0000494 const DeclContext *getEntityContainer(const Decl *D) const;
495
Argyrios Kyrtzidisdd93c592011-11-11 00:23:36 +0000496 CXIdxClientFile getIndexFile(const FileEntry *File);
Argyrios Kyrtzidis4e7064f2011-10-17 19:48:19 +0000497
498 CXIdxLoc getIndexLoc(SourceLocation Loc) const;
499
Argyrios Kyrtzidis4e7064f2011-10-17 19:48:19 +0000500 void getEntityInfo(const NamedDecl *D,
Argyrios Kyrtzidis2957e6f2011-11-22 07:24:51 +0000501 EntityInfo &EntityInfo,
Argyrios Kyrtzidis643d3ce2011-12-15 00:05:00 +0000502 ScratchAlloc &SA);
Argyrios Kyrtzidis4e7064f2011-10-17 19:48:19 +0000503
Argyrios Kyrtzidis2957e6f2011-11-22 07:24:51 +0000504 void getContainerInfo(const DeclContext *DC, ContainerInfo &ContInfo);
505
Argyrios Kyrtzidisb395c632011-11-18 00:26:51 +0000506 CXCursor getCursor(const Decl *D) {
507 return cxcursor::MakeCXCursor(const_cast<Decl*>(D), CXTU);
Argyrios Kyrtzidis4e7064f2011-10-17 19:48:19 +0000508 }
509
510 CXCursor getRefCursor(const NamedDecl *D, SourceLocation Loc);
Argyrios Kyrtzidis2957e6f2011-11-22 07:24:51 +0000511
Argyrios Kyrtzidisd0890082012-02-07 22:46:16 +0000512 static bool shouldIgnoreIfImplicit(const Decl *D);
Argyrios Kyrtzidis4e7064f2011-10-17 19:48:19 +0000513};
514
Argyrios Kyrtzidisd786f1a2012-03-31 01:14:06 +0000515inline ScratchAlloc::ScratchAlloc(IndexingContext &idxCtx) : IdxCtx(idxCtx) {
516 ++IdxCtx.StrAdapterCount;
517}
518inline ScratchAlloc::ScratchAlloc(const ScratchAlloc &SA) : IdxCtx(SA.IdxCtx) {
519 ++IdxCtx.StrAdapterCount;
520}
Argyrios Kyrtzidis643d3ce2011-12-15 00:05:00 +0000521
Argyrios Kyrtzidisd786f1a2012-03-31 01:14:06 +0000522inline ScratchAlloc::~ScratchAlloc() {
523 --IdxCtx.StrAdapterCount;
524 if (IdxCtx.StrAdapterCount == 0)
525 IdxCtx.StrScratch.Reset();
526}
Argyrios Kyrtzidis643d3ce2011-12-15 00:05:00 +0000527
Argyrios Kyrtzidisd786f1a2012-03-31 01:14:06 +0000528template <typename T>
529inline T *ScratchAlloc::allocate() {
530 return IdxCtx.StrScratch.Allocate<T>();
531}
Argyrios Kyrtzidis643d3ce2011-12-15 00:05:00 +0000532
Argyrios Kyrtzidis4e7064f2011-10-17 19:48:19 +0000533}} // end clang::cxindex
Argyrios Kyrtzidisc6b4a502011-11-16 02:34:59 +0000534
535namespace llvm {
536 /// Define DenseMapInfo so that FileID's can be used as keys in DenseMap and
537 /// DenseSets.
538 template <>
539 struct DenseMapInfo<clang::cxindex::RefFileOccurence> {
540 static inline clang::cxindex::RefFileOccurence getEmptyKey() {
541 return clang::cxindex::RefFileOccurence(0, 0);
542 }
543
544 static inline clang::cxindex::RefFileOccurence getTombstoneKey() {
545 return clang::cxindex::RefFileOccurence((const clang::FileEntry *)~0,
546 (const clang::Decl *)~0);
547 }
548
549 static unsigned getHashValue(clang::cxindex::RefFileOccurence S) {
Benjamin Kramer28b23072012-05-27 13:28:44 +0000550 typedef std::pair<const clang::FileEntry *, const clang::Decl *> PairTy;
551 return DenseMapInfo<PairTy>::getHashValue(PairTy(S.File, S.Dcl));
Argyrios Kyrtzidisc6b4a502011-11-16 02:34:59 +0000552 }
553
554 static bool isEqual(clang::cxindex::RefFileOccurence LHS,
555 clang::cxindex::RefFileOccurence RHS) {
556 return LHS.File == RHS.File && LHS.Dcl == RHS.Dcl;
557 }
558 };
559}