blob: 6f33e194fd50db8de8b4b88f53202bbb9df26ed6 [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 Kyrtzidisdd93c592011-11-11 00:23:36 +000020 class ObjCClassDecl;
Argyrios Kyrtzidis2957e6f2011-11-22 07:24:51 +000021 class ClassTemplateDecl;
22 class FunctionTemplateDecl;
23 class TypeAliasTemplateDecl;
Argyrios Kyrtzidis4e7064f2011-10-17 19:48:19 +000024
25namespace cxindex {
26 class IndexingContext;
27
Argyrios Kyrtzidis2957e6f2011-11-22 07:24:51 +000028struct EntityInfo : public CXIdxEntityInfo {
29 const NamedDecl *Dcl;
30 IndexingContext *IndexCtx;
Argyrios Kyrtzidis37f40572011-11-23 20:27:26 +000031
32 EntityInfo() {
33 name = USR = 0;
34 }
Argyrios Kyrtzidis2957e6f2011-11-22 07:24:51 +000035};
36
37struct ContainerInfo : public CXIdxContainerInfo {
38 const DeclContext *DC;
39 IndexingContext *IndexCtx;
40};
41
Argyrios Kyrtzidisdd93c592011-11-11 00:23:36 +000042struct DeclInfo : public CXIdxDeclInfo {
Argyrios Kyrtzidisc71d5542011-11-14 22:39:19 +000043 enum DInfoKind {
44 Info_Decl,
45
46 Info_ObjCContainer,
47 Info_ObjCInterface,
48 Info_ObjCProtocol,
Argyrios Kyrtzidis2957e6f2011-11-22 07:24:51 +000049 Info_ObjCCategory,
50
51 Info_CXXClass
Argyrios Kyrtzidisc71d5542011-11-14 22:39:19 +000052 };
53
54 DInfoKind Kind;
55
Argyrios Kyrtzidis2957e6f2011-11-22 07:24:51 +000056 EntityInfo EntInfo;
57 ContainerInfo Container;
58 ContainerInfo DeclAsContainer;
59
Argyrios Kyrtzidisc71d5542011-11-14 22:39:19 +000060 DeclInfo(bool isRedeclaration, bool isDefinition, bool isContainer)
61 : Kind(Info_Decl) {
62 this->isRedeclaration = isRedeclaration;
63 this->isDefinition = isDefinition;
64 this->isContainer = isContainer;
Argyrios Kyrtzidisb395c632011-11-18 00:26:51 +000065 attributes = 0;
66 numAttributes = 0;
Argyrios Kyrtzidis2957e6f2011-11-22 07:24:51 +000067 declAsContainer = container = 0;
Argyrios Kyrtzidisc71d5542011-11-14 22:39:19 +000068 }
69 DeclInfo(DInfoKind K,
70 bool isRedeclaration, bool isDefinition, bool isContainer)
71 : Kind(K) {
72 this->isRedeclaration = isRedeclaration;
73 this->isDefinition = isDefinition;
74 this->isContainer = isContainer;
Argyrios Kyrtzidisb395c632011-11-18 00:26:51 +000075 attributes = 0;
76 numAttributes = 0;
Argyrios Kyrtzidis2957e6f2011-11-22 07:24:51 +000077 declAsContainer = container = 0;
Argyrios Kyrtzidisc71d5542011-11-14 22:39:19 +000078 }
79
80 static bool classof(const DeclInfo *) { return true; }
Argyrios Kyrtzidisdd93c592011-11-11 00:23:36 +000081};
82
Argyrios Kyrtzidisdd93c592011-11-11 00:23:36 +000083struct ObjCContainerDeclInfo : public DeclInfo {
Argyrios Kyrtzidis6ec43ad2011-11-12 02:16:30 +000084 CXIdxObjCContainerDeclInfo ObjCContDeclInfo;
Argyrios Kyrtzidisc71d5542011-11-14 22:39:19 +000085
86 ObjCContainerDeclInfo(bool isForwardRef,
87 bool isRedeclaration,
88 bool isImplementation)
89 : DeclInfo(Info_ObjCContainer, isRedeclaration,
90 /*isDefinition=*/!isForwardRef, /*isContainer=*/!isForwardRef) {
91 init(isForwardRef, isImplementation);
92 }
93 ObjCContainerDeclInfo(DInfoKind K,
94 bool isForwardRef,
95 bool isRedeclaration,
96 bool isImplementation)
97 : DeclInfo(K, isRedeclaration, /*isDefinition=*/!isForwardRef,
98 /*isContainer=*/!isForwardRef) {
99 init(isForwardRef, isImplementation);
100 }
101
102 static bool classof(const DeclInfo *D) {
103 return Info_ObjCContainer <= D->Kind && D->Kind <= Info_ObjCCategory;
104 }
105 static bool classof(const ObjCContainerDeclInfo *D) { return true; }
106
107private:
108 void init(bool isForwardRef, bool isImplementation) {
109 if (isForwardRef)
110 ObjCContDeclInfo.kind = CXIdxObjCContainer_ForwardRef;
111 else if (isImplementation)
112 ObjCContDeclInfo.kind = CXIdxObjCContainer_Implementation;
113 else
114 ObjCContDeclInfo.kind = CXIdxObjCContainer_Interface;
115 }
116};
117
118struct ObjCInterfaceDeclInfo : public ObjCContainerDeclInfo {
119 CXIdxObjCInterfaceDeclInfo ObjCInterDeclInfo;
120 CXIdxObjCProtocolRefListInfo ObjCProtoListInfo;
121
122 ObjCInterfaceDeclInfo(const ObjCInterfaceDecl *D)
123 : ObjCContainerDeclInfo(Info_ObjCInterface,
124 /*isForwardRef=*/false,
125 /*isRedeclaration=*/D->isInitiallyForwardDecl(),
126 /*isImplementation=*/false) { }
127
128 static bool classof(const DeclInfo *D) {
129 return D->Kind == Info_ObjCInterface;
130 }
131 static bool classof(const ObjCInterfaceDeclInfo *D) { return true; }
132};
133
134struct ObjCProtocolDeclInfo : public ObjCContainerDeclInfo {
135 CXIdxObjCProtocolRefListInfo ObjCProtoRefListInfo;
136
137 ObjCProtocolDeclInfo(const ObjCProtocolDecl *D)
138 : ObjCContainerDeclInfo(Info_ObjCProtocol,
139 /*isForwardRef=*/false,
140 /*isRedeclaration=*/D->isInitiallyForwardDecl(),
141 /*isImplementation=*/false) { }
142
143 static bool classof(const DeclInfo *D) {
144 return D->Kind == Info_ObjCProtocol;
145 }
146 static bool classof(const ObjCProtocolDeclInfo *D) { return true; }
Argyrios Kyrtzidisdd93c592011-11-11 00:23:36 +0000147};
148
149struct ObjCCategoryDeclInfo : public ObjCContainerDeclInfo {
Argyrios Kyrtzidis6ec43ad2011-11-12 02:16:30 +0000150 CXIdxObjCCategoryDeclInfo ObjCCatDeclInfo;
Argyrios Kyrtzidis6ec43ad2011-11-12 02:16:30 +0000151
Argyrios Kyrtzidisc71d5542011-11-14 22:39:19 +0000152 explicit ObjCCategoryDeclInfo(bool isImplementation)
153 : ObjCContainerDeclInfo(Info_ObjCCategory,
154 /*isForwardRef=*/false,
155 /*isRedeclaration=*/isImplementation,
156 /*isImplementation=*/isImplementation) { }
Argyrios Kyrtzidis6ec43ad2011-11-12 02:16:30 +0000157
Argyrios Kyrtzidisc71d5542011-11-14 22:39:19 +0000158 static bool classof(const DeclInfo *D) {
159 return D->Kind == Info_ObjCCategory;
160 }
161 static bool classof(const ObjCCategoryDeclInfo *D) { return true; }
Argyrios Kyrtzidisdd93c592011-11-11 00:23:36 +0000162};
163
Argyrios Kyrtzidis2957e6f2011-11-22 07:24:51 +0000164struct CXXClassDeclInfo : public DeclInfo {
165 CXIdxCXXClassDeclInfo CXXClassInfo;
166
167 CXXClassDeclInfo(bool isRedeclaration, bool isDefinition)
168 : DeclInfo(Info_CXXClass, isRedeclaration, isDefinition, isDefinition) { }
169
170 static bool classof(const DeclInfo *D) {
171 return D->Kind == Info_CXXClass;
172 }
173 static bool classof(const CXXClassDeclInfo *D) { return true; }
174};
175
Argyrios Kyrtzidisb395c632011-11-18 00:26:51 +0000176struct AttrInfo : public CXIdxAttrInfo {
177 const Attr *A;
178
179 AttrInfo(CXIdxAttrKind Kind, CXCursor C, CXIdxLoc Loc, const Attr *A) {
180 kind = Kind;
181 cursor = C;
182 loc = Loc;
183 this->A = A;
184 }
185
186 static bool classof(const AttrInfo *) { return true; }
187};
188
189struct IBOutletCollectionInfo : public AttrInfo {
Argyrios Kyrtzidis2957e6f2011-11-22 07:24:51 +0000190 EntityInfo ClassInfo;
Argyrios Kyrtzidisb395c632011-11-18 00:26:51 +0000191 CXIdxIBOutletCollectionAttrInfo IBCollInfo;
192
193 IBOutletCollectionInfo(CXCursor C, CXIdxLoc Loc, const Attr *A) :
194 AttrInfo(CXIdxAttr_IBOutletCollection, C, Loc, A) {
195 assert(C.kind == CXCursor_IBOutletCollectionAttr);
196 }
197
198 static bool classof(const AttrInfo *A) {
199 return A->kind == CXIdxAttr_IBOutletCollection;
200 }
201 static bool classof(const IBOutletCollectionInfo *D) { return true; }
202};
203
Argyrios Kyrtzidisc6b4a502011-11-16 02:34:59 +0000204struct RefFileOccurence {
205 const FileEntry *File;
206 const Decl *Dcl;
207
208 RefFileOccurence(const FileEntry *File, const Decl *Dcl)
209 : File(File), Dcl(Dcl) { }
210};
211
Argyrios Kyrtzidis4e7064f2011-10-17 19:48:19 +0000212class IndexingContext {
213 ASTContext *Ctx;
214 CXClientData ClientData;
215 IndexerCallbacks &CB;
216 unsigned IndexOptions;
217 CXTranslationUnit CXTU;
218
Argyrios Kyrtzidisdd93c592011-11-11 00:23:36 +0000219 typedef llvm::DenseMap<const FileEntry *, CXIdxClientFile> FileMapTy;
Argyrios Kyrtzidis2957e6f2011-11-22 07:24:51 +0000220 typedef llvm::DenseMap<const DeclContext *, CXIdxClientContainer>
221 ContainerMapTy;
222 typedef llvm::DenseMap<const Decl *, CXIdxClientEntity> EntityMapTy;
223
Argyrios Kyrtzidis4e7064f2011-10-17 19:48:19 +0000224 FileMapTy FileMap;
Argyrios Kyrtzidis4e7064f2011-10-17 19:48:19 +0000225 ContainerMapTy ContainerMap;
Argyrios Kyrtzidis2957e6f2011-11-22 07:24:51 +0000226 EntityMapTy EntityMap;
Argyrios Kyrtzidis4e7064f2011-10-17 19:48:19 +0000227
Argyrios Kyrtzidisc6b4a502011-11-16 02:34:59 +0000228 llvm::DenseSet<RefFileOccurence> RefFileOccurences;
229
Argyrios Kyrtzidis4e7064f2011-10-17 19:48:19 +0000230 SmallVector<DeclGroupRef, 8> TUDeclsInObjCContainer;
231
Argyrios Kyrtzidis37f40572011-11-23 20:27:26 +0000232 llvm::BumpPtrAllocator StrScratch;
Argyrios Kyrtzidisdd93c592011-11-11 00:23:36 +0000233 unsigned StrAdapterCount;
Argyrios Kyrtzidis4e7064f2011-10-17 19:48:19 +0000234
235 class StrAdapter {
Argyrios Kyrtzidisdd93c592011-11-11 00:23:36 +0000236 IndexingContext &IdxCtx;
Argyrios Kyrtzidis4e7064f2011-10-17 19:48:19 +0000237
238 public:
Argyrios Kyrtzidis37f40572011-11-23 20:27:26 +0000239 StrAdapter(IndexingContext &indexCtx) : IdxCtx(indexCtx) {
Argyrios Kyrtzidisdd93c592011-11-11 00:23:36 +0000240 ++IdxCtx.StrAdapterCount;
241 }
242
243 ~StrAdapter() {
244 --IdxCtx.StrAdapterCount;
245 if (IdxCtx.StrAdapterCount == 0)
Argyrios Kyrtzidis37f40572011-11-23 20:27:26 +0000246 IdxCtx.StrScratch.Reset();
Argyrios Kyrtzidisdd93c592011-11-11 00:23:36 +0000247 }
Argyrios Kyrtzidis4e7064f2011-10-17 19:48:19 +0000248
249 const char *toCStr(StringRef Str);
Argyrios Kyrtzidis37f40572011-11-23 20:27:26 +0000250 const char *copyCStr(StringRef Str);
Argyrios Kyrtzidis4e7064f2011-10-17 19:48:19 +0000251 };
252
Argyrios Kyrtzidis6ec43ad2011-11-12 02:16:30 +0000253 struct ObjCProtocolListInfo {
254 SmallVector<CXIdxObjCProtocolRefInfo, 4> ProtInfos;
Argyrios Kyrtzidis2957e6f2011-11-22 07:24:51 +0000255 SmallVector<EntityInfo, 4> ProtEntities;
Argyrios Kyrtzidis6ec43ad2011-11-12 02:16:30 +0000256 SmallVector<CXIdxObjCProtocolRefInfo *, 4> Prots;
257
Argyrios Kyrtzidisb395c632011-11-18 00:26:51 +0000258 CXIdxObjCProtocolRefListInfo getListInfo() const {
Argyrios Kyrtzidisc71d5542011-11-14 22:39:19 +0000259 CXIdxObjCProtocolRefListInfo Info = { Prots.data(),
260 (unsigned)Prots.size() };
261 return Info;
262 }
Argyrios Kyrtzidis6ec43ad2011-11-12 02:16:30 +0000263
264 ObjCProtocolListInfo(const ObjCProtocolList &ProtList,
265 IndexingContext &IdxCtx,
266 IndexingContext::StrAdapter &SA);
267 };
268
Argyrios Kyrtzidisb395c632011-11-18 00:26:51 +0000269 struct AttrListInfo {
270 SmallVector<AttrInfo, 2> Attrs;
271 SmallVector<IBOutletCollectionInfo, 2> IBCollAttrs;
272 SmallVector<CXIdxAttrInfo *, 2> CXAttrs;
273
274 const CXIdxAttrInfo *const *getAttrs() const {
275 return CXAttrs.data();
276 }
277 unsigned getNumAttrs() const { return (unsigned)CXAttrs.size(); }
278
279 AttrListInfo(const Decl *D,
280 IndexingContext &IdxCtx,
281 IndexingContext::StrAdapter &SA);
Argyrios Kyrtzidis2957e6f2011-11-22 07:24:51 +0000282 };
283
284 struct CXXBasesListInfo {
285 SmallVector<CXIdxBaseClassInfo, 4> BaseInfos;
286 SmallVector<EntityInfo, 4> BaseEntities;
287 SmallVector<CXIdxBaseClassInfo *, 4> CXBases;
288
289 const CXIdxBaseClassInfo *const *getBases() const {
290 return CXBases.data();
291 }
292 unsigned getNumBases() const { return (unsigned)CXBases.size(); }
293
294 CXXBasesListInfo(const CXXRecordDecl *D,
295 IndexingContext &IdxCtx, IndexingContext::StrAdapter &SA);
296 };
Argyrios Kyrtzidisb395c632011-11-18 00:26:51 +0000297
Argyrios Kyrtzidis4e7064f2011-10-17 19:48:19 +0000298public:
299 IndexingContext(CXClientData clientData, IndexerCallbacks &indexCallbacks,
300 unsigned indexOptions, CXTranslationUnit cxTU)
301 : Ctx(0), ClientData(clientData), CB(indexCallbacks),
Argyrios Kyrtzidis37f40572011-11-23 20:27:26 +0000302 IndexOptions(indexOptions), CXTU(cxTU),
303 StrScratch(/*size=*/1024), StrAdapterCount(0) { }
Argyrios Kyrtzidis4e7064f2011-10-17 19:48:19 +0000304
305 ASTContext &getASTContext() const { return *Ctx; }
306
307 void setASTContext(ASTContext &ctx);
308
Argyrios Kyrtzidisb395c632011-11-18 00:26:51 +0000309 bool suppressRefs() const {
310 return IndexOptions & CXIndexOpt_SuppressRedundantRefs;
Argyrios Kyrtzidisc6b4a502011-11-16 02:34:59 +0000311 }
312
Argyrios Kyrtzidisb395c632011-11-18 00:26:51 +0000313 bool shouldAbort();
314
Argyrios Kyrtzidis996e6e52011-12-01 02:42:50 +0000315 bool hasDiagnosticCallback() const { return CB.diagnostic; }
316
Argyrios Kyrtzidisdd93c592011-11-11 00:23:36 +0000317 void enteredMainFile(const FileEntry *File);
318
Argyrios Kyrtzidis4e7064f2011-10-17 19:48:19 +0000319 void ppIncludedFile(SourceLocation hashLoc,
320 StringRef filename, const FileEntry *File,
321 bool isImport, bool isAngled);
322
Argyrios Kyrtzidis6ec43ad2011-11-12 02:16:30 +0000323 void startedTranslationUnit();
Argyrios Kyrtzidis4e7064f2011-10-17 19:48:19 +0000324
325 void indexDecl(const Decl *D);
326
327 void indexTagDecl(const TagDecl *D);
328
329 void indexTypeSourceInfo(TypeSourceInfo *TInfo, const NamedDecl *Parent,
330 const DeclContext *DC = 0);
331
332 void indexTypeLoc(TypeLoc TL, const NamedDecl *Parent,
333 const DeclContext *DC);
334
335 void indexDeclContext(const DeclContext *DC);
336
337 void indexBody(const Stmt *S, const DeclContext *DC);
338
Argyrios Kyrtzidisb395c632011-11-18 00:26:51 +0000339 void handleDiagnosticSet(CXDiagnosticSet CXDiagSet);
Argyrios Kyrtzidis4e7064f2011-10-17 19:48:19 +0000340
Argyrios Kyrtzidisb395c632011-11-18 00:26:51 +0000341 bool handleFunction(const FunctionDecl *FD);
Argyrios Kyrtzidis4e7064f2011-10-17 19:48:19 +0000342
Argyrios Kyrtzidisb395c632011-11-18 00:26:51 +0000343 bool handleVar(const VarDecl *D);
Argyrios Kyrtzidis4e7064f2011-10-17 19:48:19 +0000344
Argyrios Kyrtzidisb395c632011-11-18 00:26:51 +0000345 bool handleField(const FieldDecl *D);
Argyrios Kyrtzidis4e7064f2011-10-17 19:48:19 +0000346
Argyrios Kyrtzidisb395c632011-11-18 00:26:51 +0000347 bool handleEnumerator(const EnumConstantDecl *D);
Argyrios Kyrtzidis4e7064f2011-10-17 19:48:19 +0000348
Argyrios Kyrtzidisb395c632011-11-18 00:26:51 +0000349 bool handleTagDecl(const TagDecl *D);
Argyrios Kyrtzidis4e7064f2011-10-17 19:48:19 +0000350
Argyrios Kyrtzidis2957e6f2011-11-22 07:24:51 +0000351 bool handleTypedefName(const TypedefNameDecl *D);
Argyrios Kyrtzidis4e7064f2011-10-17 19:48:19 +0000352
Argyrios Kyrtzidisb395c632011-11-18 00:26:51 +0000353 bool handleObjCClass(const ObjCClassDecl *D);
354 bool handleObjCInterface(const ObjCInterfaceDecl *D);
355 bool handleObjCImplementation(const ObjCImplementationDecl *D);
Argyrios Kyrtzidis4e7064f2011-10-17 19:48:19 +0000356
Argyrios Kyrtzidisb395c632011-11-18 00:26:51 +0000357 bool handleObjCForwardProtocol(const ObjCProtocolDecl *D,
Argyrios Kyrtzidisdd93c592011-11-11 00:23:36 +0000358 SourceLocation Loc,
359 bool isRedeclaration);
360
Argyrios Kyrtzidisb395c632011-11-18 00:26:51 +0000361 bool handleObjCProtocol(const ObjCProtocolDecl *D);
Argyrios Kyrtzidis4e7064f2011-10-17 19:48:19 +0000362
Argyrios Kyrtzidisb395c632011-11-18 00:26:51 +0000363 bool handleObjCCategory(const ObjCCategoryDecl *D);
364 bool handleObjCCategoryImpl(const ObjCCategoryImplDecl *D);
Argyrios Kyrtzidis4e7064f2011-10-17 19:48:19 +0000365
Argyrios Kyrtzidisb395c632011-11-18 00:26:51 +0000366 bool handleObjCMethod(const ObjCMethodDecl *D);
Argyrios Kyrtzidis4e7064f2011-10-17 19:48:19 +0000367
Argyrios Kyrtzidisb395c632011-11-18 00:26:51 +0000368 bool handleSynthesizedObjCProperty(const ObjCPropertyImplDecl *D);
369 bool handleSynthesizedObjCMethod(const ObjCMethodDecl *D, SourceLocation Loc);
Argyrios Kyrtzidis4e7064f2011-10-17 19:48:19 +0000370
Argyrios Kyrtzidisb395c632011-11-18 00:26:51 +0000371 bool handleObjCProperty(const ObjCPropertyDecl *D);
372
Argyrios Kyrtzidis2957e6f2011-11-22 07:24:51 +0000373 bool handleClassTemplate(const ClassTemplateDecl *D);
374 bool handleFunctionTemplate(const FunctionTemplateDecl *D);
375 bool handleTypeAliasTemplate(const TypeAliasTemplateDecl *D);
376
Argyrios Kyrtzidisb395c632011-11-18 00:26:51 +0000377 bool handleReference(const NamedDecl *D, SourceLocation Loc, CXCursor Cursor,
378 const NamedDecl *Parent,
379 const DeclContext *DC,
380 const Expr *E = 0,
381 CXIdxEntityRefKind Kind = CXIdxEntityRef_Direct);
382
383 bool handleReference(const NamedDecl *D, SourceLocation Loc,
Argyrios Kyrtzidis4e7064f2011-10-17 19:48:19 +0000384 const NamedDecl *Parent,
385 const DeclContext *DC,
Argyrios Kyrtzidisaca19be2011-10-18 15:50:50 +0000386 const Expr *E = 0,
387 CXIdxEntityRefKind Kind = CXIdxEntityRef_Direct);
Argyrios Kyrtzidis4e7064f2011-10-17 19:48:19 +0000388
389 bool isNotFromSourceFile(SourceLocation Loc) const;
390
Argyrios Kyrtzidis21ee5702011-11-15 06:20:16 +0000391 void indexTopLevelDecl(Decl *D);
Argyrios Kyrtzidis4e7064f2011-10-17 19:48:19 +0000392 void indexTUDeclsInObjCContainer();
393 void indexDeclGroupRef(DeclGroupRef DG);
394
395 void addTUDeclInObjCContainer(DeclGroupRef DG) {
396 TUDeclsInObjCContainer.push_back(DG);
397 }
398
Argyrios Kyrtzidisdd93c592011-11-11 00:23:36 +0000399 void translateLoc(SourceLocation Loc, CXIdxClientFile *indexFile, CXFile *file,
Argyrios Kyrtzidis4e7064f2011-10-17 19:48:19 +0000400 unsigned *line, unsigned *column, unsigned *offset);
401
Argyrios Kyrtzidis2957e6f2011-11-22 07:24:51 +0000402 CXIdxClientContainer getClientContainerForDC(const DeclContext *DC) const;
403 void addContainerInMap(const DeclContext *DC, CXIdxClientContainer container);
404
405 CXIdxClientEntity getClientEntity(const Decl *D) const;
406 void setClientEntity(const Decl *D, CXIdxClientEntity client);
407
Argyrios Kyrtzidis4e7064f2011-10-17 19:48:19 +0000408private:
Argyrios Kyrtzidisb395c632011-11-18 00:26:51 +0000409 bool handleDecl(const NamedDecl *D,
Argyrios Kyrtzidisdd93c592011-11-11 00:23:36 +0000410 SourceLocation Loc, CXCursor Cursor,
Argyrios Kyrtzidisdd93c592011-11-11 00:23:36 +0000411 DeclInfo &DInfo);
Argyrios Kyrtzidis4e7064f2011-10-17 19:48:19 +0000412
Argyrios Kyrtzidisb395c632011-11-18 00:26:51 +0000413 bool handleObjCContainer(const ObjCContainerDecl *D,
Argyrios Kyrtzidisdd93c592011-11-11 00:23:36 +0000414 SourceLocation Loc, CXCursor Cursor,
Argyrios Kyrtzidisdd93c592011-11-11 00:23:36 +0000415 ObjCContainerDeclInfo &ContDInfo);
Argyrios Kyrtzidis4e7064f2011-10-17 19:48:19 +0000416
Argyrios Kyrtzidis2957e6f2011-11-22 07:24:51 +0000417 bool handleCXXRecordDecl(const CXXRecordDecl *RD, const NamedDecl *OrigD);
Argyrios Kyrtzidisdd93c592011-11-11 00:23:36 +0000418
Argyrios Kyrtzidisb395c632011-11-18 00:26:51 +0000419 bool markEntityOccurrenceInFile(const NamedDecl *D, SourceLocation Loc);
420
Argyrios Kyrtzidis4e7064f2011-10-17 19:48:19 +0000421 const NamedDecl *getEntityDecl(const NamedDecl *D) const;
422
Argyrios Kyrtzidis2957e6f2011-11-22 07:24:51 +0000423 const DeclContext *getEntityContainer(const Decl *D) const;
424
425 CXIdxClientContainer getClientContainer(const NamedDecl *D) const {
426 return getClientContainerForDC(D->getDeclContext());
Argyrios Kyrtzidis4e7064f2011-10-17 19:48:19 +0000427 }
428
429 const DeclContext *getScopedContext(const DeclContext *DC) const;
Argyrios Kyrtzidis4e7064f2011-10-17 19:48:19 +0000430
Argyrios Kyrtzidisdd93c592011-11-11 00:23:36 +0000431 CXIdxClientFile getIndexFile(const FileEntry *File);
Argyrios Kyrtzidis4e7064f2011-10-17 19:48:19 +0000432
433 CXIdxLoc getIndexLoc(SourceLocation Loc) const;
434
Argyrios Kyrtzidis4e7064f2011-10-17 19:48:19 +0000435 void getEntityInfo(const NamedDecl *D,
Argyrios Kyrtzidis2957e6f2011-11-22 07:24:51 +0000436 EntityInfo &EntityInfo,
Argyrios Kyrtzidis4e7064f2011-10-17 19:48:19 +0000437 StrAdapter &SA);
438
Argyrios Kyrtzidis2957e6f2011-11-22 07:24:51 +0000439 void getContainerInfo(const DeclContext *DC, ContainerInfo &ContInfo);
440
Argyrios Kyrtzidisb395c632011-11-18 00:26:51 +0000441 CXCursor getCursor(const Decl *D) {
442 return cxcursor::MakeCXCursor(const_cast<Decl*>(D), CXTU);
Argyrios Kyrtzidis4e7064f2011-10-17 19:48:19 +0000443 }
444
445 CXCursor getRefCursor(const NamedDecl *D, SourceLocation Loc);
Argyrios Kyrtzidis2957e6f2011-11-22 07:24:51 +0000446
447 static bool shouldIgnoreIfImplicit(const NamedDecl *D);
Argyrios Kyrtzidis4e7064f2011-10-17 19:48:19 +0000448};
449
450}} // end clang::cxindex
Argyrios Kyrtzidisc6b4a502011-11-16 02:34:59 +0000451
452namespace llvm {
453 /// Define DenseMapInfo so that FileID's can be used as keys in DenseMap and
454 /// DenseSets.
455 template <>
456 struct DenseMapInfo<clang::cxindex::RefFileOccurence> {
457 static inline clang::cxindex::RefFileOccurence getEmptyKey() {
458 return clang::cxindex::RefFileOccurence(0, 0);
459 }
460
461 static inline clang::cxindex::RefFileOccurence getTombstoneKey() {
462 return clang::cxindex::RefFileOccurence((const clang::FileEntry *)~0,
463 (const clang::Decl *)~0);
464 }
465
466 static unsigned getHashValue(clang::cxindex::RefFileOccurence S) {
467 llvm::FoldingSetNodeID ID;
468 ID.AddPointer(S.File);
469 ID.AddPointer(S.Dcl);
470 return ID.ComputeHash();
471 }
472
473 static bool isEqual(clang::cxindex::RefFileOccurence LHS,
474 clang::cxindex::RefFileOccurence RHS) {
475 return LHS.File == RHS.File && LHS.Dcl == RHS.Dcl;
476 }
477 };
478}