blob: 00e109644c237a52a418244a2e9009f095c6eef7 [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
Argyrios Kyrtzidisd786f1a2012-03-31 01:14:06 +0000254 AttrListInfo(const AttrListInfo&); // DO NOT IMPLEMENT
255 void operator=(const AttrListInfo&); // DO NOT IMPLEMENT
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 Kyrtzidisb395c632011-11-18 00:26:51 +0000373 bool shouldAbort();
374
Argyrios Kyrtzidis996e6e52011-12-01 02:42:50 +0000375 bool hasDiagnosticCallback() const { return CB.diagnostic; }
376
Argyrios Kyrtzidisdd93c592011-11-11 00:23:36 +0000377 void enteredMainFile(const FileEntry *File);
378
Argyrios Kyrtzidis4e7064f2011-10-17 19:48:19 +0000379 void ppIncludedFile(SourceLocation hashLoc,
380 StringRef filename, const FileEntry *File,
381 bool isImport, bool isAngled);
382
Argyrios Kyrtzidis6ec43ad2011-11-12 02:16:30 +0000383 void startedTranslationUnit();
Argyrios Kyrtzidis4e7064f2011-10-17 19:48:19 +0000384
385 void indexDecl(const Decl *D);
386
387 void indexTagDecl(const TagDecl *D);
388
389 void indexTypeSourceInfo(TypeSourceInfo *TInfo, const NamedDecl *Parent,
390 const DeclContext *DC = 0);
391
392 void indexTypeLoc(TypeLoc TL, const NamedDecl *Parent,
Argyrios Kyrtzidise422e452011-12-13 18:47:41 +0000393 const DeclContext *DC = 0);
394
395 void indexNestedNameSpecifierLoc(NestedNameSpecifierLoc NNS,
396 const NamedDecl *Parent,
397 const DeclContext *DC = 0);
Argyrios Kyrtzidis4e7064f2011-10-17 19:48:19 +0000398
399 void indexDeclContext(const DeclContext *DC);
400
Argyrios Kyrtzidise422e452011-12-13 18:47:41 +0000401 void indexBody(const Stmt *S, const NamedDecl *Parent,
402 const DeclContext *DC = 0);
Argyrios Kyrtzidis4e7064f2011-10-17 19:48:19 +0000403
Argyrios Kyrtzidisb395c632011-11-18 00:26:51 +0000404 void handleDiagnosticSet(CXDiagnosticSet CXDiagSet);
Argyrios Kyrtzidis4e7064f2011-10-17 19:48:19 +0000405
Argyrios Kyrtzidisb395c632011-11-18 00:26:51 +0000406 bool handleFunction(const FunctionDecl *FD);
Argyrios Kyrtzidis4e7064f2011-10-17 19:48:19 +0000407
Argyrios Kyrtzidisb395c632011-11-18 00:26:51 +0000408 bool handleVar(const VarDecl *D);
Argyrios Kyrtzidis4e7064f2011-10-17 19:48:19 +0000409
Argyrios Kyrtzidisb395c632011-11-18 00:26:51 +0000410 bool handleField(const FieldDecl *D);
Argyrios Kyrtzidis4e7064f2011-10-17 19:48:19 +0000411
Argyrios Kyrtzidisb395c632011-11-18 00:26:51 +0000412 bool handleEnumerator(const EnumConstantDecl *D);
Argyrios Kyrtzidis4e7064f2011-10-17 19:48:19 +0000413
Argyrios Kyrtzidisb395c632011-11-18 00:26:51 +0000414 bool handleTagDecl(const TagDecl *D);
Argyrios Kyrtzidis4e7064f2011-10-17 19:48:19 +0000415
Argyrios Kyrtzidis2957e6f2011-11-22 07:24:51 +0000416 bool handleTypedefName(const TypedefNameDecl *D);
Argyrios Kyrtzidis4e7064f2011-10-17 19:48:19 +0000417
Argyrios Kyrtzidisb395c632011-11-18 00:26:51 +0000418 bool handleObjCInterface(const ObjCInterfaceDecl *D);
419 bool handleObjCImplementation(const ObjCImplementationDecl *D);
Argyrios Kyrtzidis4e7064f2011-10-17 19:48:19 +0000420
Argyrios Kyrtzidisb395c632011-11-18 00:26:51 +0000421 bool handleObjCProtocol(const ObjCProtocolDecl *D);
Argyrios Kyrtzidis4e7064f2011-10-17 19:48:19 +0000422
Argyrios Kyrtzidisb395c632011-11-18 00:26:51 +0000423 bool handleObjCCategory(const ObjCCategoryDecl *D);
424 bool handleObjCCategoryImpl(const ObjCCategoryImplDecl *D);
Argyrios Kyrtzidis4e7064f2011-10-17 19:48:19 +0000425
Argyrios Kyrtzidisb395c632011-11-18 00:26:51 +0000426 bool handleObjCMethod(const ObjCMethodDecl *D);
Argyrios Kyrtzidis4e7064f2011-10-17 19:48:19 +0000427
Argyrios Kyrtzidisb395c632011-11-18 00:26:51 +0000428 bool handleSynthesizedObjCProperty(const ObjCPropertyImplDecl *D);
Argyrios Kyrtzidisf9112422012-02-28 17:50:39 +0000429 bool handleSynthesizedObjCMethod(const ObjCMethodDecl *D, SourceLocation Loc,
430 const DeclContext *LexicalDC);
Argyrios Kyrtzidis4e7064f2011-10-17 19:48:19 +0000431
Argyrios Kyrtzidisb395c632011-11-18 00:26:51 +0000432 bool handleObjCProperty(const ObjCPropertyDecl *D);
433
Argyrios Kyrtzidis68478b02011-12-07 05:52:06 +0000434 bool handleNamespace(const NamespaceDecl *D);
435
Argyrios Kyrtzidis2957e6f2011-11-22 07:24:51 +0000436 bool handleClassTemplate(const ClassTemplateDecl *D);
437 bool handleFunctionTemplate(const FunctionTemplateDecl *D);
438 bool handleTypeAliasTemplate(const TypeAliasTemplateDecl *D);
439
Argyrios Kyrtzidisb395c632011-11-18 00:26:51 +0000440 bool handleReference(const NamedDecl *D, SourceLocation Loc, CXCursor Cursor,
441 const NamedDecl *Parent,
442 const DeclContext *DC,
443 const Expr *E = 0,
444 CXIdxEntityRefKind Kind = CXIdxEntityRef_Direct);
445
446 bool handleReference(const NamedDecl *D, SourceLocation Loc,
Argyrios Kyrtzidis4e7064f2011-10-17 19:48:19 +0000447 const NamedDecl *Parent,
448 const DeclContext *DC,
Argyrios Kyrtzidisaca19be2011-10-18 15:50:50 +0000449 const Expr *E = 0,
450 CXIdxEntityRefKind Kind = CXIdxEntityRef_Direct);
Argyrios Kyrtzidis4e7064f2011-10-17 19:48:19 +0000451
452 bool isNotFromSourceFile(SourceLocation Loc) const;
453
Argyrios Kyrtzidis21ee5702011-11-15 06:20:16 +0000454 void indexTopLevelDecl(Decl *D);
Argyrios Kyrtzidis4e7064f2011-10-17 19:48:19 +0000455 void indexTUDeclsInObjCContainer();
456 void indexDeclGroupRef(DeclGroupRef DG);
457
458 void addTUDeclInObjCContainer(DeclGroupRef DG) {
459 TUDeclsInObjCContainer.push_back(DG);
460 }
461
Argyrios Kyrtzidisdd93c592011-11-11 00:23:36 +0000462 void translateLoc(SourceLocation Loc, CXIdxClientFile *indexFile, CXFile *file,
Argyrios Kyrtzidis4e7064f2011-10-17 19:48:19 +0000463 unsigned *line, unsigned *column, unsigned *offset);
464
Argyrios Kyrtzidis2957e6f2011-11-22 07:24:51 +0000465 CXIdxClientContainer getClientContainerForDC(const DeclContext *DC) const;
466 void addContainerInMap(const DeclContext *DC, CXIdxClientContainer container);
467
468 CXIdxClientEntity getClientEntity(const Decl *D) const;
469 void setClientEntity(const Decl *D, CXIdxClientEntity client);
470
Argyrios Kyrtzidis6d968362012-02-10 20:10:44 +0000471 static bool isTemplateImplicitInstantiation(const Decl *D);
472
Argyrios Kyrtzidis4e7064f2011-10-17 19:48:19 +0000473private:
Argyrios Kyrtzidisb395c632011-11-18 00:26:51 +0000474 bool handleDecl(const NamedDecl *D,
Argyrios Kyrtzidisdd93c592011-11-11 00:23:36 +0000475 SourceLocation Loc, CXCursor Cursor,
Argyrios Kyrtzidisf9112422012-02-28 17:50:39 +0000476 DeclInfo &DInfo,
477 const DeclContext *LexicalDC = 0);
Argyrios Kyrtzidis4e7064f2011-10-17 19:48:19 +0000478
Argyrios Kyrtzidisb395c632011-11-18 00:26:51 +0000479 bool handleObjCContainer(const ObjCContainerDecl *D,
Argyrios Kyrtzidisdd93c592011-11-11 00:23:36 +0000480 SourceLocation Loc, CXCursor Cursor,
Argyrios Kyrtzidisdd93c592011-11-11 00:23:36 +0000481 ObjCContainerDeclInfo &ContDInfo);
Argyrios Kyrtzidis4e7064f2011-10-17 19:48:19 +0000482
Argyrios Kyrtzidis2957e6f2011-11-22 07:24:51 +0000483 bool handleCXXRecordDecl(const CXXRecordDecl *RD, const NamedDecl *OrigD);
Argyrios Kyrtzidisdd93c592011-11-11 00:23:36 +0000484
Argyrios Kyrtzidisb395c632011-11-18 00:26:51 +0000485 bool markEntityOccurrenceInFile(const NamedDecl *D, SourceLocation Loc);
486
Argyrios Kyrtzidis4e7064f2011-10-17 19:48:19 +0000487 const NamedDecl *getEntityDecl(const NamedDecl *D) const;
488
Argyrios Kyrtzidis2957e6f2011-11-22 07:24:51 +0000489 const DeclContext *getEntityContainer(const Decl *D) const;
490
Argyrios Kyrtzidisdd93c592011-11-11 00:23:36 +0000491 CXIdxClientFile getIndexFile(const FileEntry *File);
Argyrios Kyrtzidis4e7064f2011-10-17 19:48:19 +0000492
493 CXIdxLoc getIndexLoc(SourceLocation Loc) const;
494
Argyrios Kyrtzidis4e7064f2011-10-17 19:48:19 +0000495 void getEntityInfo(const NamedDecl *D,
Argyrios Kyrtzidis2957e6f2011-11-22 07:24:51 +0000496 EntityInfo &EntityInfo,
Argyrios Kyrtzidis643d3ce2011-12-15 00:05:00 +0000497 ScratchAlloc &SA);
Argyrios Kyrtzidis4e7064f2011-10-17 19:48:19 +0000498
Argyrios Kyrtzidis2957e6f2011-11-22 07:24:51 +0000499 void getContainerInfo(const DeclContext *DC, ContainerInfo &ContInfo);
500
Argyrios Kyrtzidisb395c632011-11-18 00:26:51 +0000501 CXCursor getCursor(const Decl *D) {
502 return cxcursor::MakeCXCursor(const_cast<Decl*>(D), CXTU);
Argyrios Kyrtzidis4e7064f2011-10-17 19:48:19 +0000503 }
504
505 CXCursor getRefCursor(const NamedDecl *D, SourceLocation Loc);
Argyrios Kyrtzidis2957e6f2011-11-22 07:24:51 +0000506
Argyrios Kyrtzidisd0890082012-02-07 22:46:16 +0000507 static bool shouldIgnoreIfImplicit(const Decl *D);
Argyrios Kyrtzidis4e7064f2011-10-17 19:48:19 +0000508};
509
Argyrios Kyrtzidisd786f1a2012-03-31 01:14:06 +0000510inline ScratchAlloc::ScratchAlloc(IndexingContext &idxCtx) : IdxCtx(idxCtx) {
511 ++IdxCtx.StrAdapterCount;
512}
513inline ScratchAlloc::ScratchAlloc(const ScratchAlloc &SA) : IdxCtx(SA.IdxCtx) {
514 ++IdxCtx.StrAdapterCount;
515}
Argyrios Kyrtzidis643d3ce2011-12-15 00:05:00 +0000516
Argyrios Kyrtzidisd786f1a2012-03-31 01:14:06 +0000517inline ScratchAlloc::~ScratchAlloc() {
518 --IdxCtx.StrAdapterCount;
519 if (IdxCtx.StrAdapterCount == 0)
520 IdxCtx.StrScratch.Reset();
521}
Argyrios Kyrtzidis643d3ce2011-12-15 00:05:00 +0000522
Argyrios Kyrtzidisd786f1a2012-03-31 01:14:06 +0000523template <typename T>
524inline T *ScratchAlloc::allocate() {
525 return IdxCtx.StrScratch.Allocate<T>();
526}
Argyrios Kyrtzidis643d3ce2011-12-15 00:05:00 +0000527
Argyrios Kyrtzidis4e7064f2011-10-17 19:48:19 +0000528}} // end clang::cxindex
Argyrios Kyrtzidisc6b4a502011-11-16 02:34:59 +0000529
530namespace llvm {
531 /// Define DenseMapInfo so that FileID's can be used as keys in DenseMap and
532 /// DenseSets.
533 template <>
534 struct DenseMapInfo<clang::cxindex::RefFileOccurence> {
535 static inline clang::cxindex::RefFileOccurence getEmptyKey() {
536 return clang::cxindex::RefFileOccurence(0, 0);
537 }
538
539 static inline clang::cxindex::RefFileOccurence getTombstoneKey() {
540 return clang::cxindex::RefFileOccurence((const clang::FileEntry *)~0,
541 (const clang::Decl *)~0);
542 }
543
544 static unsigned getHashValue(clang::cxindex::RefFileOccurence S) {
Benjamin Kramer28b23072012-05-27 13:28:44 +0000545 typedef std::pair<const clang::FileEntry *, const clang::Decl *> PairTy;
546 return DenseMapInfo<PairTy>::getHashValue(PairTy(S.File, S.Dcl));
Argyrios Kyrtzidisc6b4a502011-11-16 02:34:59 +0000547 }
548
549 static bool isEqual(clang::cxindex::RefFileOccurence LHS,
550 clang::cxindex::RefFileOccurence RHS) {
551 return LHS.File == RHS.File && LHS.Dcl == RHS.Dcl;
552 }
553 };
554}