blob: d828b17ca5c230d871480a6e8542b7cf30dade6a [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 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 ScratchAlloc;
28 class AttrListInfo;
Argyrios Kyrtzidis4e7064f2011-10-17 19:48:19 +000029
Argyrios Kyrtzidis2957e6f2011-11-22 07:24:51 +000030struct EntityInfo : public CXIdxEntityInfo {
31 const NamedDecl *Dcl;
32 IndexingContext *IndexCtx;
Dylan Noblesmithc93dc782012-02-20 14:00:23 +000033 IntrusiveRefCntPtr<AttrListInfo> AttrList;
Argyrios Kyrtzidis37f40572011-11-23 20:27:26 +000034
35 EntityInfo() {
36 name = USR = 0;
Argyrios Kyrtzidis643d3ce2011-12-15 00:05:00 +000037 attributes = 0;
38 numAttributes = 0;
Argyrios Kyrtzidis37f40572011-11-23 20:27:26 +000039 }
Argyrios Kyrtzidis2957e6f2011-11-22 07:24:51 +000040};
41
42struct ContainerInfo : public CXIdxContainerInfo {
43 const DeclContext *DC;
44 IndexingContext *IndexCtx;
45};
46
Argyrios Kyrtzidisdd93c592011-11-11 00:23:36 +000047struct DeclInfo : public CXIdxDeclInfo {
Argyrios Kyrtzidisc71d5542011-11-14 22:39:19 +000048 enum DInfoKind {
49 Info_Decl,
50
51 Info_ObjCContainer,
52 Info_ObjCInterface,
53 Info_ObjCProtocol,
Argyrios Kyrtzidis2957e6f2011-11-22 07:24:51 +000054 Info_ObjCCategory,
55
Argyrios Kyrtzidis792db262012-02-28 17:50:33 +000056 Info_ObjCProperty,
57
Argyrios Kyrtzidis2957e6f2011-11-22 07:24:51 +000058 Info_CXXClass
Argyrios Kyrtzidisc71d5542011-11-14 22:39:19 +000059 };
60
61 DInfoKind Kind;
62
Argyrios Kyrtzidis2957e6f2011-11-22 07:24:51 +000063 EntityInfo EntInfo;
Argyrios Kyrtzidisb1febb62011-12-07 20:44:19 +000064 ContainerInfo SemanticContainer;
65 ContainerInfo LexicalContainer;
Argyrios Kyrtzidis2957e6f2011-11-22 07:24:51 +000066 ContainerInfo DeclAsContainer;
67
Argyrios Kyrtzidisc71d5542011-11-14 22:39:19 +000068 DeclInfo(bool isRedeclaration, bool isDefinition, bool isContainer)
69 : Kind(Info_Decl) {
70 this->isRedeclaration = isRedeclaration;
71 this->isDefinition = isDefinition;
72 this->isContainer = isContainer;
Argyrios Kyrtzidisb395c632011-11-18 00:26:51 +000073 attributes = 0;
74 numAttributes = 0;
Argyrios Kyrtzidisb1febb62011-12-07 20:44:19 +000075 declAsContainer = semanticContainer = lexicalContainer = 0;
Argyrios Kyrtzidisc71d5542011-11-14 22:39:19 +000076 }
77 DeclInfo(DInfoKind K,
78 bool isRedeclaration, bool isDefinition, bool isContainer)
79 : Kind(K) {
80 this->isRedeclaration = isRedeclaration;
81 this->isDefinition = isDefinition;
82 this->isContainer = isContainer;
Argyrios Kyrtzidisb395c632011-11-18 00:26:51 +000083 attributes = 0;
84 numAttributes = 0;
Argyrios Kyrtzidisb1febb62011-12-07 20:44:19 +000085 declAsContainer = semanticContainer = lexicalContainer = 0;
Argyrios Kyrtzidisc71d5542011-11-14 22:39:19 +000086 }
87
88 static bool classof(const DeclInfo *) { return true; }
Argyrios Kyrtzidisdd93c592011-11-11 00:23:36 +000089};
90
Argyrios Kyrtzidisdd93c592011-11-11 00:23:36 +000091struct ObjCContainerDeclInfo : public DeclInfo {
Argyrios Kyrtzidis6ec43ad2011-11-12 02:16:30 +000092 CXIdxObjCContainerDeclInfo ObjCContDeclInfo;
Argyrios Kyrtzidisc71d5542011-11-14 22:39:19 +000093
94 ObjCContainerDeclInfo(bool isForwardRef,
95 bool isRedeclaration,
96 bool isImplementation)
97 : DeclInfo(Info_ObjCContainer, isRedeclaration,
98 /*isDefinition=*/!isForwardRef, /*isContainer=*/!isForwardRef) {
99 init(isForwardRef, isImplementation);
100 }
101 ObjCContainerDeclInfo(DInfoKind K,
102 bool isForwardRef,
103 bool isRedeclaration,
104 bool isImplementation)
105 : DeclInfo(K, isRedeclaration, /*isDefinition=*/!isForwardRef,
106 /*isContainer=*/!isForwardRef) {
107 init(isForwardRef, isImplementation);
108 }
109
110 static bool classof(const DeclInfo *D) {
111 return Info_ObjCContainer <= D->Kind && D->Kind <= Info_ObjCCategory;
112 }
113 static bool classof(const ObjCContainerDeclInfo *D) { return true; }
114
115private:
116 void init(bool isForwardRef, bool isImplementation) {
117 if (isForwardRef)
118 ObjCContDeclInfo.kind = CXIdxObjCContainer_ForwardRef;
119 else if (isImplementation)
120 ObjCContDeclInfo.kind = CXIdxObjCContainer_Implementation;
121 else
122 ObjCContDeclInfo.kind = CXIdxObjCContainer_Interface;
123 }
124};
125
126struct ObjCInterfaceDeclInfo : public ObjCContainerDeclInfo {
127 CXIdxObjCInterfaceDeclInfo ObjCInterDeclInfo;
128 CXIdxObjCProtocolRefListInfo ObjCProtoListInfo;
129
130 ObjCInterfaceDeclInfo(const ObjCInterfaceDecl *D)
131 : ObjCContainerDeclInfo(Info_ObjCInterface,
132 /*isForwardRef=*/false,
Douglas Gregoref96ee02012-01-14 16:38:05 +0000133 /*isRedeclaration=*/D->getPreviousDecl() != 0,
Argyrios Kyrtzidisc71d5542011-11-14 22:39:19 +0000134 /*isImplementation=*/false) { }
135
136 static bool classof(const DeclInfo *D) {
137 return D->Kind == Info_ObjCInterface;
138 }
139 static bool classof(const ObjCInterfaceDeclInfo *D) { return true; }
140};
141
142struct ObjCProtocolDeclInfo : public ObjCContainerDeclInfo {
143 CXIdxObjCProtocolRefListInfo ObjCProtoRefListInfo;
144
145 ObjCProtocolDeclInfo(const ObjCProtocolDecl *D)
146 : ObjCContainerDeclInfo(Info_ObjCProtocol,
147 /*isForwardRef=*/false,
Douglas Gregoref96ee02012-01-14 16:38:05 +0000148 /*isRedeclaration=*/D->getPreviousDecl(),
Argyrios Kyrtzidisc71d5542011-11-14 22:39:19 +0000149 /*isImplementation=*/false) { }
150
151 static bool classof(const DeclInfo *D) {
152 return D->Kind == Info_ObjCProtocol;
153 }
154 static bool classof(const ObjCProtocolDeclInfo *D) { return true; }
Argyrios Kyrtzidisdd93c592011-11-11 00:23:36 +0000155};
156
157struct ObjCCategoryDeclInfo : public ObjCContainerDeclInfo {
Argyrios Kyrtzidis6ec43ad2011-11-12 02:16:30 +0000158 CXIdxObjCCategoryDeclInfo ObjCCatDeclInfo;
Argyrios Kyrtzidisc10a4c82011-12-13 18:47:45 +0000159 CXIdxObjCProtocolRefListInfo ObjCProtoListInfo;
Argyrios Kyrtzidis6ec43ad2011-11-12 02:16:30 +0000160
Argyrios Kyrtzidisc71d5542011-11-14 22:39:19 +0000161 explicit ObjCCategoryDeclInfo(bool isImplementation)
162 : ObjCContainerDeclInfo(Info_ObjCCategory,
163 /*isForwardRef=*/false,
164 /*isRedeclaration=*/isImplementation,
165 /*isImplementation=*/isImplementation) { }
Argyrios Kyrtzidis6ec43ad2011-11-12 02:16:30 +0000166
Argyrios Kyrtzidisc71d5542011-11-14 22:39:19 +0000167 static bool classof(const DeclInfo *D) {
168 return D->Kind == Info_ObjCCategory;
169 }
170 static bool classof(const ObjCCategoryDeclInfo *D) { return true; }
Argyrios Kyrtzidisdd93c592011-11-11 00:23:36 +0000171};
172
Argyrios Kyrtzidis792db262012-02-28 17:50:33 +0000173struct ObjCPropertyDeclInfo : public DeclInfo {
174 CXIdxObjCPropertyDeclInfo ObjCPropDeclInfo;
175
176 ObjCPropertyDeclInfo()
177 : DeclInfo(Info_ObjCProperty,
178 /*isRedeclaration=*/false, /*isDefinition=*/false,
179 /*isContainer=*/false) { }
180
181 static bool classof(const DeclInfo *D) {
182 return D->Kind == Info_ObjCProperty;
183 }
184 static bool classof(const ObjCPropertyDeclInfo *D) { return true; }
185};
186
Argyrios Kyrtzidis2957e6f2011-11-22 07:24:51 +0000187struct CXXClassDeclInfo : public DeclInfo {
188 CXIdxCXXClassDeclInfo CXXClassInfo;
189
190 CXXClassDeclInfo(bool isRedeclaration, bool isDefinition)
191 : DeclInfo(Info_CXXClass, isRedeclaration, isDefinition, isDefinition) { }
192
193 static bool classof(const DeclInfo *D) {
194 return D->Kind == Info_CXXClass;
195 }
196 static bool classof(const CXXClassDeclInfo *D) { return true; }
197};
198
Argyrios Kyrtzidisb395c632011-11-18 00:26:51 +0000199struct AttrInfo : public CXIdxAttrInfo {
200 const Attr *A;
201
202 AttrInfo(CXIdxAttrKind Kind, CXCursor C, CXIdxLoc Loc, const Attr *A) {
203 kind = Kind;
204 cursor = C;
205 loc = Loc;
206 this->A = A;
207 }
208
209 static bool classof(const AttrInfo *) { return true; }
210};
211
212struct IBOutletCollectionInfo : public AttrInfo {
Argyrios Kyrtzidis2957e6f2011-11-22 07:24:51 +0000213 EntityInfo ClassInfo;
Argyrios Kyrtzidisb395c632011-11-18 00:26:51 +0000214 CXIdxIBOutletCollectionAttrInfo IBCollInfo;
215
216 IBOutletCollectionInfo(CXCursor C, CXIdxLoc Loc, const Attr *A) :
217 AttrInfo(CXIdxAttr_IBOutletCollection, C, Loc, A) {
218 assert(C.kind == CXCursor_IBOutletCollectionAttr);
Argyrios Kyrtzidis643d3ce2011-12-15 00:05:00 +0000219 IBCollInfo.objcClass = 0;
Argyrios Kyrtzidisb395c632011-11-18 00:26:51 +0000220 }
221
Argyrios Kyrtzidis643d3ce2011-12-15 00:05:00 +0000222 IBOutletCollectionInfo(const IBOutletCollectionInfo &other);
223
Argyrios Kyrtzidisb395c632011-11-18 00:26:51 +0000224 static bool classof(const AttrInfo *A) {
225 return A->kind == CXIdxAttr_IBOutletCollection;
226 }
227 static bool classof(const IBOutletCollectionInfo *D) { return true; }
228};
229
Argyrios Kyrtzidis643d3ce2011-12-15 00:05:00 +0000230class AttrListInfo {
231 SmallVector<AttrInfo, 2> Attrs;
232 SmallVector<IBOutletCollectionInfo, 2> IBCollAttrs;
233 SmallVector<CXIdxAttrInfo *, 2> CXAttrs;
234 unsigned ref_cnt;
235
236public:
237 AttrListInfo(const Decl *D,
238 IndexingContext &IdxCtx,
239 ScratchAlloc &SA);
240 AttrListInfo(const AttrListInfo &other);
241
242 const CXIdxAttrInfo *const *getAttrs() const {
243 if (CXAttrs.empty())
244 return 0;
245 return CXAttrs.data();
246 }
247 unsigned getNumAttrs() const { return (unsigned)CXAttrs.size(); }
248
249 /// \brief Retain/Release only useful when we allocate a AttrListInfo from the
250 /// BumpPtrAllocator, and not from the stack; so that we keep a pointer
251 // in the EntityInfo
252 void Retain() { ++ref_cnt; }
253 void Release() {
254 assert (ref_cnt > 0 && "Reference count is already zero.");
255 if (--ref_cnt == 0) {
256 // Memory is allocated from a BumpPtrAllocator, no need to delete it.
257 this->~AttrListInfo();
258 }
259 }
260};
261
Argyrios Kyrtzidisc6b4a502011-11-16 02:34:59 +0000262struct RefFileOccurence {
263 const FileEntry *File;
264 const Decl *Dcl;
265
266 RefFileOccurence(const FileEntry *File, const Decl *Dcl)
267 : File(File), Dcl(Dcl) { }
268};
269
Argyrios Kyrtzidis4e7064f2011-10-17 19:48:19 +0000270class IndexingContext {
271 ASTContext *Ctx;
272 CXClientData ClientData;
273 IndexerCallbacks &CB;
274 unsigned IndexOptions;
275 CXTranslationUnit CXTU;
276
Argyrios Kyrtzidisdd93c592011-11-11 00:23:36 +0000277 typedef llvm::DenseMap<const FileEntry *, CXIdxClientFile> FileMapTy;
Argyrios Kyrtzidis2957e6f2011-11-22 07:24:51 +0000278 typedef llvm::DenseMap<const DeclContext *, CXIdxClientContainer>
279 ContainerMapTy;
280 typedef llvm::DenseMap<const Decl *, CXIdxClientEntity> EntityMapTy;
281
Argyrios Kyrtzidis4e7064f2011-10-17 19:48:19 +0000282 FileMapTy FileMap;
Argyrios Kyrtzidis4e7064f2011-10-17 19:48:19 +0000283 ContainerMapTy ContainerMap;
Argyrios Kyrtzidis2957e6f2011-11-22 07:24:51 +0000284 EntityMapTy EntityMap;
Argyrios Kyrtzidis4e7064f2011-10-17 19:48:19 +0000285
Argyrios Kyrtzidisc6b4a502011-11-16 02:34:59 +0000286 llvm::DenseSet<RefFileOccurence> RefFileOccurences;
287
Argyrios Kyrtzidis4e7064f2011-10-17 19:48:19 +0000288 SmallVector<DeclGroupRef, 8> TUDeclsInObjCContainer;
289
Argyrios Kyrtzidis37f40572011-11-23 20:27:26 +0000290 llvm::BumpPtrAllocator StrScratch;
Argyrios Kyrtzidisdd93c592011-11-11 00:23:36 +0000291 unsigned StrAdapterCount;
Argyrios Kyrtzidis643d3ce2011-12-15 00:05:00 +0000292 friend class ScratchAlloc;
Argyrios Kyrtzidis4e7064f2011-10-17 19:48:19 +0000293
Argyrios Kyrtzidis6ec43ad2011-11-12 02:16:30 +0000294 struct ObjCProtocolListInfo {
295 SmallVector<CXIdxObjCProtocolRefInfo, 4> ProtInfos;
Argyrios Kyrtzidis2957e6f2011-11-22 07:24:51 +0000296 SmallVector<EntityInfo, 4> ProtEntities;
Argyrios Kyrtzidis6ec43ad2011-11-12 02:16:30 +0000297 SmallVector<CXIdxObjCProtocolRefInfo *, 4> Prots;
298
Argyrios Kyrtzidisb395c632011-11-18 00:26:51 +0000299 CXIdxObjCProtocolRefListInfo getListInfo() const {
Argyrios Kyrtzidisc71d5542011-11-14 22:39:19 +0000300 CXIdxObjCProtocolRefListInfo Info = { Prots.data(),
301 (unsigned)Prots.size() };
302 return Info;
303 }
Argyrios Kyrtzidis6ec43ad2011-11-12 02:16:30 +0000304
305 ObjCProtocolListInfo(const ObjCProtocolList &ProtList,
306 IndexingContext &IdxCtx,
Argyrios Kyrtzidis643d3ce2011-12-15 00:05:00 +0000307 ScratchAlloc &SA);
Argyrios Kyrtzidis2957e6f2011-11-22 07:24:51 +0000308 };
309
310 struct CXXBasesListInfo {
311 SmallVector<CXIdxBaseClassInfo, 4> BaseInfos;
312 SmallVector<EntityInfo, 4> BaseEntities;
313 SmallVector<CXIdxBaseClassInfo *, 4> CXBases;
314
315 const CXIdxBaseClassInfo *const *getBases() const {
316 return CXBases.data();
317 }
318 unsigned getNumBases() const { return (unsigned)CXBases.size(); }
319
320 CXXBasesListInfo(const CXXRecordDecl *D,
Argyrios Kyrtzidis643d3ce2011-12-15 00:05:00 +0000321 IndexingContext &IdxCtx, ScratchAlloc &SA);
Argyrios Kyrtzidisb526a872011-12-07 20:44:15 +0000322
323 private:
324 SourceLocation getBaseLoc(const CXXBaseSpecifier &Base) const;
Argyrios Kyrtzidis2957e6f2011-11-22 07:24:51 +0000325 };
Argyrios Kyrtzidisb395c632011-11-18 00:26:51 +0000326
Argyrios Kyrtzidis643d3ce2011-12-15 00:05:00 +0000327 friend class AttrListInfo;
328
Argyrios Kyrtzidis4e7064f2011-10-17 19:48:19 +0000329public:
330 IndexingContext(CXClientData clientData, IndexerCallbacks &indexCallbacks,
331 unsigned indexOptions, CXTranslationUnit cxTU)
332 : Ctx(0), ClientData(clientData), CB(indexCallbacks),
Argyrios Kyrtzidis37f40572011-11-23 20:27:26 +0000333 IndexOptions(indexOptions), CXTU(cxTU),
334 StrScratch(/*size=*/1024), StrAdapterCount(0) { }
Argyrios Kyrtzidis4e7064f2011-10-17 19:48:19 +0000335
336 ASTContext &getASTContext() const { return *Ctx; }
337
338 void setASTContext(ASTContext &ctx);
Argyrios Kyrtzidis7fe90f32012-01-17 18:48:07 +0000339 void setPreprocessor(Preprocessor &PP);
Argyrios Kyrtzidis4e7064f2011-10-17 19:48:19 +0000340
Argyrios Kyrtzidis58d2dbe2012-02-14 22:23:11 +0000341 bool shouldSuppressRefs() const {
Argyrios Kyrtzidisb395c632011-11-18 00:26:51 +0000342 return IndexOptions & CXIndexOpt_SuppressRedundantRefs;
Argyrios Kyrtzidisc6b4a502011-11-16 02:34:59 +0000343 }
344
Argyrios Kyrtzidis58d2dbe2012-02-14 22:23:11 +0000345 bool shouldIndexFunctionLocalSymbols() const {
Argyrios Kyrtzidis22490742012-01-14 00:11:49 +0000346 return IndexOptions & CXIndexOpt_IndexFunctionLocalSymbols;
347 }
348
Argyrios Kyrtzidis58d2dbe2012-02-14 22:23:11 +0000349 bool shouldIndexImplicitTemplateInsts() const {
350 return IndexOptions & CXIndexOpt_IndexImplicitTemplateInstantiations;
351 }
352
Argyrios Kyrtzidisb395c632011-11-18 00:26:51 +0000353 bool shouldAbort();
354
Argyrios Kyrtzidis996e6e52011-12-01 02:42:50 +0000355 bool hasDiagnosticCallback() const { return CB.diagnostic; }
356
Argyrios Kyrtzidisdd93c592011-11-11 00:23:36 +0000357 void enteredMainFile(const FileEntry *File);
358
Argyrios Kyrtzidis4e7064f2011-10-17 19:48:19 +0000359 void ppIncludedFile(SourceLocation hashLoc,
360 StringRef filename, const FileEntry *File,
361 bool isImport, bool isAngled);
362
Argyrios Kyrtzidis6ec43ad2011-11-12 02:16:30 +0000363 void startedTranslationUnit();
Argyrios Kyrtzidis4e7064f2011-10-17 19:48:19 +0000364
365 void indexDecl(const Decl *D);
366
367 void indexTagDecl(const TagDecl *D);
368
369 void indexTypeSourceInfo(TypeSourceInfo *TInfo, const NamedDecl *Parent,
370 const DeclContext *DC = 0);
371
372 void indexTypeLoc(TypeLoc TL, const NamedDecl *Parent,
Argyrios Kyrtzidise422e452011-12-13 18:47:41 +0000373 const DeclContext *DC = 0);
374
375 void indexNestedNameSpecifierLoc(NestedNameSpecifierLoc NNS,
376 const NamedDecl *Parent,
377 const DeclContext *DC = 0);
Argyrios Kyrtzidis4e7064f2011-10-17 19:48:19 +0000378
379 void indexDeclContext(const DeclContext *DC);
380
Argyrios Kyrtzidise422e452011-12-13 18:47:41 +0000381 void indexBody(const Stmt *S, const NamedDecl *Parent,
382 const DeclContext *DC = 0);
Argyrios Kyrtzidis4e7064f2011-10-17 19:48:19 +0000383
Argyrios Kyrtzidisb395c632011-11-18 00:26:51 +0000384 void handleDiagnosticSet(CXDiagnosticSet CXDiagSet);
Argyrios Kyrtzidis4e7064f2011-10-17 19:48:19 +0000385
Argyrios Kyrtzidisb395c632011-11-18 00:26:51 +0000386 bool handleFunction(const FunctionDecl *FD);
Argyrios Kyrtzidis4e7064f2011-10-17 19:48:19 +0000387
Argyrios Kyrtzidisb395c632011-11-18 00:26:51 +0000388 bool handleVar(const VarDecl *D);
Argyrios Kyrtzidis4e7064f2011-10-17 19:48:19 +0000389
Argyrios Kyrtzidisb395c632011-11-18 00:26:51 +0000390 bool handleField(const FieldDecl *D);
Argyrios Kyrtzidis4e7064f2011-10-17 19:48:19 +0000391
Argyrios Kyrtzidisb395c632011-11-18 00:26:51 +0000392 bool handleEnumerator(const EnumConstantDecl *D);
Argyrios Kyrtzidis4e7064f2011-10-17 19:48:19 +0000393
Argyrios Kyrtzidisb395c632011-11-18 00:26:51 +0000394 bool handleTagDecl(const TagDecl *D);
Argyrios Kyrtzidis4e7064f2011-10-17 19:48:19 +0000395
Argyrios Kyrtzidis2957e6f2011-11-22 07:24:51 +0000396 bool handleTypedefName(const TypedefNameDecl *D);
Argyrios Kyrtzidis4e7064f2011-10-17 19:48:19 +0000397
Argyrios Kyrtzidisb395c632011-11-18 00:26:51 +0000398 bool handleObjCInterface(const ObjCInterfaceDecl *D);
399 bool handleObjCImplementation(const ObjCImplementationDecl *D);
Argyrios Kyrtzidis4e7064f2011-10-17 19:48:19 +0000400
Argyrios Kyrtzidisb395c632011-11-18 00:26:51 +0000401 bool handleObjCProtocol(const ObjCProtocolDecl *D);
Argyrios Kyrtzidis4e7064f2011-10-17 19:48:19 +0000402
Argyrios Kyrtzidisb395c632011-11-18 00:26:51 +0000403 bool handleObjCCategory(const ObjCCategoryDecl *D);
404 bool handleObjCCategoryImpl(const ObjCCategoryImplDecl *D);
Argyrios Kyrtzidis4e7064f2011-10-17 19:48:19 +0000405
Argyrios Kyrtzidisb395c632011-11-18 00:26:51 +0000406 bool handleObjCMethod(const ObjCMethodDecl *D);
Argyrios Kyrtzidis4e7064f2011-10-17 19:48:19 +0000407
Argyrios Kyrtzidisb395c632011-11-18 00:26:51 +0000408 bool handleSynthesizedObjCProperty(const ObjCPropertyImplDecl *D);
Argyrios Kyrtzidisf9112422012-02-28 17:50:39 +0000409 bool handleSynthesizedObjCMethod(const ObjCMethodDecl *D, SourceLocation Loc,
410 const DeclContext *LexicalDC);
Argyrios Kyrtzidis4e7064f2011-10-17 19:48:19 +0000411
Argyrios Kyrtzidisb395c632011-11-18 00:26:51 +0000412 bool handleObjCProperty(const ObjCPropertyDecl *D);
413
Argyrios Kyrtzidis68478b02011-12-07 05:52:06 +0000414 bool handleNamespace(const NamespaceDecl *D);
415
Argyrios Kyrtzidis2957e6f2011-11-22 07:24:51 +0000416 bool handleClassTemplate(const ClassTemplateDecl *D);
417 bool handleFunctionTemplate(const FunctionTemplateDecl *D);
418 bool handleTypeAliasTemplate(const TypeAliasTemplateDecl *D);
419
Argyrios Kyrtzidisb395c632011-11-18 00:26:51 +0000420 bool handleReference(const NamedDecl *D, SourceLocation Loc, CXCursor Cursor,
421 const NamedDecl *Parent,
422 const DeclContext *DC,
423 const Expr *E = 0,
424 CXIdxEntityRefKind Kind = CXIdxEntityRef_Direct);
425
426 bool handleReference(const NamedDecl *D, SourceLocation Loc,
Argyrios Kyrtzidis4e7064f2011-10-17 19:48:19 +0000427 const NamedDecl *Parent,
428 const DeclContext *DC,
Argyrios Kyrtzidisaca19be2011-10-18 15:50:50 +0000429 const Expr *E = 0,
430 CXIdxEntityRefKind Kind = CXIdxEntityRef_Direct);
Argyrios Kyrtzidis4e7064f2011-10-17 19:48:19 +0000431
432 bool isNotFromSourceFile(SourceLocation Loc) const;
433
Argyrios Kyrtzidis21ee5702011-11-15 06:20:16 +0000434 void indexTopLevelDecl(Decl *D);
Argyrios Kyrtzidis4e7064f2011-10-17 19:48:19 +0000435 void indexTUDeclsInObjCContainer();
436 void indexDeclGroupRef(DeclGroupRef DG);
437
438 void addTUDeclInObjCContainer(DeclGroupRef DG) {
439 TUDeclsInObjCContainer.push_back(DG);
440 }
441
Argyrios Kyrtzidisdd93c592011-11-11 00:23:36 +0000442 void translateLoc(SourceLocation Loc, CXIdxClientFile *indexFile, CXFile *file,
Argyrios Kyrtzidis4e7064f2011-10-17 19:48:19 +0000443 unsigned *line, unsigned *column, unsigned *offset);
444
Argyrios Kyrtzidis2957e6f2011-11-22 07:24:51 +0000445 CXIdxClientContainer getClientContainerForDC(const DeclContext *DC) const;
446 void addContainerInMap(const DeclContext *DC, CXIdxClientContainer container);
447
448 CXIdxClientEntity getClientEntity(const Decl *D) const;
449 void setClientEntity(const Decl *D, CXIdxClientEntity client);
450
Argyrios Kyrtzidis6d968362012-02-10 20:10:44 +0000451 static bool isTemplateImplicitInstantiation(const Decl *D);
452
Argyrios Kyrtzidis4e7064f2011-10-17 19:48:19 +0000453private:
Argyrios Kyrtzidisb395c632011-11-18 00:26:51 +0000454 bool handleDecl(const NamedDecl *D,
Argyrios Kyrtzidisdd93c592011-11-11 00:23:36 +0000455 SourceLocation Loc, CXCursor Cursor,
Argyrios Kyrtzidisf9112422012-02-28 17:50:39 +0000456 DeclInfo &DInfo,
457 const DeclContext *LexicalDC = 0);
Argyrios Kyrtzidis4e7064f2011-10-17 19:48:19 +0000458
Argyrios Kyrtzidisb395c632011-11-18 00:26:51 +0000459 bool handleObjCContainer(const ObjCContainerDecl *D,
Argyrios Kyrtzidisdd93c592011-11-11 00:23:36 +0000460 SourceLocation Loc, CXCursor Cursor,
Argyrios Kyrtzidisdd93c592011-11-11 00:23:36 +0000461 ObjCContainerDeclInfo &ContDInfo);
Argyrios Kyrtzidis4e7064f2011-10-17 19:48:19 +0000462
Argyrios Kyrtzidis2957e6f2011-11-22 07:24:51 +0000463 bool handleCXXRecordDecl(const CXXRecordDecl *RD, const NamedDecl *OrigD);
Argyrios Kyrtzidisdd93c592011-11-11 00:23:36 +0000464
Argyrios Kyrtzidisb395c632011-11-18 00:26:51 +0000465 bool markEntityOccurrenceInFile(const NamedDecl *D, SourceLocation Loc);
466
Argyrios Kyrtzidis4e7064f2011-10-17 19:48:19 +0000467 const NamedDecl *getEntityDecl(const NamedDecl *D) const;
468
Argyrios Kyrtzidis2957e6f2011-11-22 07:24:51 +0000469 const DeclContext *getEntityContainer(const Decl *D) const;
470
Argyrios Kyrtzidisdd93c592011-11-11 00:23:36 +0000471 CXIdxClientFile getIndexFile(const FileEntry *File);
Argyrios Kyrtzidis4e7064f2011-10-17 19:48:19 +0000472
473 CXIdxLoc getIndexLoc(SourceLocation Loc) const;
474
Argyrios Kyrtzidis4e7064f2011-10-17 19:48:19 +0000475 void getEntityInfo(const NamedDecl *D,
Argyrios Kyrtzidis2957e6f2011-11-22 07:24:51 +0000476 EntityInfo &EntityInfo,
Argyrios Kyrtzidis643d3ce2011-12-15 00:05:00 +0000477 ScratchAlloc &SA);
Argyrios Kyrtzidis4e7064f2011-10-17 19:48:19 +0000478
Argyrios Kyrtzidis2957e6f2011-11-22 07:24:51 +0000479 void getContainerInfo(const DeclContext *DC, ContainerInfo &ContInfo);
480
Argyrios Kyrtzidisb395c632011-11-18 00:26:51 +0000481 CXCursor getCursor(const Decl *D) {
482 return cxcursor::MakeCXCursor(const_cast<Decl*>(D), CXTU);
Argyrios Kyrtzidis4e7064f2011-10-17 19:48:19 +0000483 }
484
485 CXCursor getRefCursor(const NamedDecl *D, SourceLocation Loc);
Argyrios Kyrtzidis2957e6f2011-11-22 07:24:51 +0000486
Argyrios Kyrtzidisd0890082012-02-07 22:46:16 +0000487 static bool shouldIgnoreIfImplicit(const Decl *D);
Argyrios Kyrtzidis4e7064f2011-10-17 19:48:19 +0000488};
489
Argyrios Kyrtzidis643d3ce2011-12-15 00:05:00 +0000490class ScratchAlloc {
491 IndexingContext &IdxCtx;
492
493public:
494 explicit ScratchAlloc(IndexingContext &indexCtx) : IdxCtx(indexCtx) {
495 ++IdxCtx.StrAdapterCount;
496 }
497
498 ~ScratchAlloc() {
499 --IdxCtx.StrAdapterCount;
500 if (IdxCtx.StrAdapterCount == 0)
501 IdxCtx.StrScratch.Reset();
502 }
503
504 const char *toCStr(StringRef Str);
505 const char *copyCStr(StringRef Str);
506
507 template <typename T>
508 T *allocate() {
509 return IdxCtx.StrScratch.Allocate<T>();
510 }
511};
512
Argyrios Kyrtzidis4e7064f2011-10-17 19:48:19 +0000513}} // end clang::cxindex
Argyrios Kyrtzidisc6b4a502011-11-16 02:34:59 +0000514
515namespace llvm {
516 /// Define DenseMapInfo so that FileID's can be used as keys in DenseMap and
517 /// DenseSets.
518 template <>
519 struct DenseMapInfo<clang::cxindex::RefFileOccurence> {
520 static inline clang::cxindex::RefFileOccurence getEmptyKey() {
521 return clang::cxindex::RefFileOccurence(0, 0);
522 }
523
524 static inline clang::cxindex::RefFileOccurence getTombstoneKey() {
525 return clang::cxindex::RefFileOccurence((const clang::FileEntry *)~0,
526 (const clang::Decl *)~0);
527 }
528
529 static unsigned getHashValue(clang::cxindex::RefFileOccurence S) {
530 llvm::FoldingSetNodeID ID;
531 ID.AddPointer(S.File);
532 ID.AddPointer(S.Dcl);
533 return ID.ComputeHash();
534 }
535
536 static bool isEqual(clang::cxindex::RefFileOccurence LHS,
537 clang::cxindex::RefFileOccurence RHS) {
538 return LHS.File == RHS.File && LHS.Dcl == RHS.Dcl;
539 }
540 };
541}