blob: b9234d88b3faf45af6e02647ba51f9e3c34092e5 [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;
Argyrios Kyrtzidisb1febb62011-12-07 20:44:19 +000057 ContainerInfo SemanticContainer;
58 ContainerInfo LexicalContainer;
Argyrios Kyrtzidis2957e6f2011-11-22 07:24:51 +000059 ContainerInfo DeclAsContainer;
60
Argyrios Kyrtzidisc71d5542011-11-14 22:39:19 +000061 DeclInfo(bool isRedeclaration, bool isDefinition, bool isContainer)
62 : Kind(Info_Decl) {
63 this->isRedeclaration = isRedeclaration;
64 this->isDefinition = isDefinition;
65 this->isContainer = isContainer;
Argyrios Kyrtzidisb395c632011-11-18 00:26:51 +000066 attributes = 0;
67 numAttributes = 0;
Argyrios Kyrtzidisb1febb62011-12-07 20:44:19 +000068 declAsContainer = semanticContainer = lexicalContainer = 0;
Argyrios Kyrtzidisc71d5542011-11-14 22:39:19 +000069 }
70 DeclInfo(DInfoKind K,
71 bool isRedeclaration, bool isDefinition, bool isContainer)
72 : Kind(K) {
73 this->isRedeclaration = isRedeclaration;
74 this->isDefinition = isDefinition;
75 this->isContainer = isContainer;
Argyrios Kyrtzidisb395c632011-11-18 00:26:51 +000076 attributes = 0;
77 numAttributes = 0;
Argyrios Kyrtzidisb1febb62011-12-07 20:44:19 +000078 declAsContainer = semanticContainer = lexicalContainer = 0;
Argyrios Kyrtzidisc71d5542011-11-14 22:39:19 +000079 }
80
81 static bool classof(const DeclInfo *) { return true; }
Argyrios Kyrtzidisdd93c592011-11-11 00:23:36 +000082};
83
Argyrios Kyrtzidisdd93c592011-11-11 00:23:36 +000084struct ObjCContainerDeclInfo : public DeclInfo {
Argyrios Kyrtzidis6ec43ad2011-11-12 02:16:30 +000085 CXIdxObjCContainerDeclInfo ObjCContDeclInfo;
Argyrios Kyrtzidisc71d5542011-11-14 22:39:19 +000086
87 ObjCContainerDeclInfo(bool isForwardRef,
88 bool isRedeclaration,
89 bool isImplementation)
90 : DeclInfo(Info_ObjCContainer, isRedeclaration,
91 /*isDefinition=*/!isForwardRef, /*isContainer=*/!isForwardRef) {
92 init(isForwardRef, isImplementation);
93 }
94 ObjCContainerDeclInfo(DInfoKind K,
95 bool isForwardRef,
96 bool isRedeclaration,
97 bool isImplementation)
98 : DeclInfo(K, isRedeclaration, /*isDefinition=*/!isForwardRef,
99 /*isContainer=*/!isForwardRef) {
100 init(isForwardRef, isImplementation);
101 }
102
103 static bool classof(const DeclInfo *D) {
104 return Info_ObjCContainer <= D->Kind && D->Kind <= Info_ObjCCategory;
105 }
106 static bool classof(const ObjCContainerDeclInfo *D) { return true; }
107
108private:
109 void init(bool isForwardRef, bool isImplementation) {
110 if (isForwardRef)
111 ObjCContDeclInfo.kind = CXIdxObjCContainer_ForwardRef;
112 else if (isImplementation)
113 ObjCContDeclInfo.kind = CXIdxObjCContainer_Implementation;
114 else
115 ObjCContDeclInfo.kind = CXIdxObjCContainer_Interface;
116 }
117};
118
119struct ObjCInterfaceDeclInfo : public ObjCContainerDeclInfo {
120 CXIdxObjCInterfaceDeclInfo ObjCInterDeclInfo;
121 CXIdxObjCProtocolRefListInfo ObjCProtoListInfo;
122
123 ObjCInterfaceDeclInfo(const ObjCInterfaceDecl *D)
124 : ObjCContainerDeclInfo(Info_ObjCInterface,
125 /*isForwardRef=*/false,
126 /*isRedeclaration=*/D->isInitiallyForwardDecl(),
127 /*isImplementation=*/false) { }
128
129 static bool classof(const DeclInfo *D) {
130 return D->Kind == Info_ObjCInterface;
131 }
132 static bool classof(const ObjCInterfaceDeclInfo *D) { return true; }
133};
134
135struct ObjCProtocolDeclInfo : public ObjCContainerDeclInfo {
136 CXIdxObjCProtocolRefListInfo ObjCProtoRefListInfo;
137
138 ObjCProtocolDeclInfo(const ObjCProtocolDecl *D)
139 : ObjCContainerDeclInfo(Info_ObjCProtocol,
140 /*isForwardRef=*/false,
141 /*isRedeclaration=*/D->isInitiallyForwardDecl(),
142 /*isImplementation=*/false) { }
143
144 static bool classof(const DeclInfo *D) {
145 return D->Kind == Info_ObjCProtocol;
146 }
147 static bool classof(const ObjCProtocolDeclInfo *D) { return true; }
Argyrios Kyrtzidisdd93c592011-11-11 00:23:36 +0000148};
149
150struct ObjCCategoryDeclInfo : public ObjCContainerDeclInfo {
Argyrios Kyrtzidis6ec43ad2011-11-12 02:16:30 +0000151 CXIdxObjCCategoryDeclInfo ObjCCatDeclInfo;
Argyrios Kyrtzidisc10a4c82011-12-13 18:47:45 +0000152 CXIdxObjCProtocolRefListInfo ObjCProtoListInfo;
Argyrios Kyrtzidis6ec43ad2011-11-12 02:16:30 +0000153
Argyrios Kyrtzidisc71d5542011-11-14 22:39:19 +0000154 explicit ObjCCategoryDeclInfo(bool isImplementation)
155 : ObjCContainerDeclInfo(Info_ObjCCategory,
156 /*isForwardRef=*/false,
157 /*isRedeclaration=*/isImplementation,
158 /*isImplementation=*/isImplementation) { }
Argyrios Kyrtzidis6ec43ad2011-11-12 02:16:30 +0000159
Argyrios Kyrtzidisc71d5542011-11-14 22:39:19 +0000160 static bool classof(const DeclInfo *D) {
161 return D->Kind == Info_ObjCCategory;
162 }
163 static bool classof(const ObjCCategoryDeclInfo *D) { return true; }
Argyrios Kyrtzidisdd93c592011-11-11 00:23:36 +0000164};
165
Argyrios Kyrtzidis2957e6f2011-11-22 07:24:51 +0000166struct CXXClassDeclInfo : public DeclInfo {
167 CXIdxCXXClassDeclInfo CXXClassInfo;
168
169 CXXClassDeclInfo(bool isRedeclaration, bool isDefinition)
170 : DeclInfo(Info_CXXClass, isRedeclaration, isDefinition, isDefinition) { }
171
172 static bool classof(const DeclInfo *D) {
173 return D->Kind == Info_CXXClass;
174 }
175 static bool classof(const CXXClassDeclInfo *D) { return true; }
176};
177
Argyrios Kyrtzidisb395c632011-11-18 00:26:51 +0000178struct AttrInfo : public CXIdxAttrInfo {
179 const Attr *A;
180
181 AttrInfo(CXIdxAttrKind Kind, CXCursor C, CXIdxLoc Loc, const Attr *A) {
182 kind = Kind;
183 cursor = C;
184 loc = Loc;
185 this->A = A;
186 }
187
188 static bool classof(const AttrInfo *) { return true; }
189};
190
191struct IBOutletCollectionInfo : public AttrInfo {
Argyrios Kyrtzidis2957e6f2011-11-22 07:24:51 +0000192 EntityInfo ClassInfo;
Argyrios Kyrtzidisb395c632011-11-18 00:26:51 +0000193 CXIdxIBOutletCollectionAttrInfo IBCollInfo;
194
195 IBOutletCollectionInfo(CXCursor C, CXIdxLoc Loc, const Attr *A) :
196 AttrInfo(CXIdxAttr_IBOutletCollection, C, Loc, A) {
197 assert(C.kind == CXCursor_IBOutletCollectionAttr);
198 }
199
200 static bool classof(const AttrInfo *A) {
201 return A->kind == CXIdxAttr_IBOutletCollection;
202 }
203 static bool classof(const IBOutletCollectionInfo *D) { return true; }
204};
205
Argyrios Kyrtzidisc6b4a502011-11-16 02:34:59 +0000206struct RefFileOccurence {
207 const FileEntry *File;
208 const Decl *Dcl;
209
210 RefFileOccurence(const FileEntry *File, const Decl *Dcl)
211 : File(File), Dcl(Dcl) { }
212};
213
Argyrios Kyrtzidis4e7064f2011-10-17 19:48:19 +0000214class IndexingContext {
215 ASTContext *Ctx;
216 CXClientData ClientData;
217 IndexerCallbacks &CB;
218 unsigned IndexOptions;
219 CXTranslationUnit CXTU;
220
Argyrios Kyrtzidisdd93c592011-11-11 00:23:36 +0000221 typedef llvm::DenseMap<const FileEntry *, CXIdxClientFile> FileMapTy;
Argyrios Kyrtzidis2957e6f2011-11-22 07:24:51 +0000222 typedef llvm::DenseMap<const DeclContext *, CXIdxClientContainer>
223 ContainerMapTy;
224 typedef llvm::DenseMap<const Decl *, CXIdxClientEntity> EntityMapTy;
225
Argyrios Kyrtzidis4e7064f2011-10-17 19:48:19 +0000226 FileMapTy FileMap;
Argyrios Kyrtzidis4e7064f2011-10-17 19:48:19 +0000227 ContainerMapTy ContainerMap;
Argyrios Kyrtzidis2957e6f2011-11-22 07:24:51 +0000228 EntityMapTy EntityMap;
Argyrios Kyrtzidis4e7064f2011-10-17 19:48:19 +0000229
Argyrios Kyrtzidisc6b4a502011-11-16 02:34:59 +0000230 llvm::DenseSet<RefFileOccurence> RefFileOccurences;
231
Argyrios Kyrtzidis4e7064f2011-10-17 19:48:19 +0000232 SmallVector<DeclGroupRef, 8> TUDeclsInObjCContainer;
233
Argyrios Kyrtzidis37f40572011-11-23 20:27:26 +0000234 llvm::BumpPtrAllocator StrScratch;
Argyrios Kyrtzidisdd93c592011-11-11 00:23:36 +0000235 unsigned StrAdapterCount;
Argyrios Kyrtzidis4e7064f2011-10-17 19:48:19 +0000236
237 class StrAdapter {
Argyrios Kyrtzidisdd93c592011-11-11 00:23:36 +0000238 IndexingContext &IdxCtx;
Argyrios Kyrtzidis4e7064f2011-10-17 19:48:19 +0000239
240 public:
Argyrios Kyrtzidis37f40572011-11-23 20:27:26 +0000241 StrAdapter(IndexingContext &indexCtx) : IdxCtx(indexCtx) {
Argyrios Kyrtzidisdd93c592011-11-11 00:23:36 +0000242 ++IdxCtx.StrAdapterCount;
243 }
244
245 ~StrAdapter() {
246 --IdxCtx.StrAdapterCount;
247 if (IdxCtx.StrAdapterCount == 0)
Argyrios Kyrtzidis37f40572011-11-23 20:27:26 +0000248 IdxCtx.StrScratch.Reset();
Argyrios Kyrtzidisdd93c592011-11-11 00:23:36 +0000249 }
Argyrios Kyrtzidis4e7064f2011-10-17 19:48:19 +0000250
251 const char *toCStr(StringRef Str);
Argyrios Kyrtzidis37f40572011-11-23 20:27:26 +0000252 const char *copyCStr(StringRef Str);
Argyrios Kyrtzidis4e7064f2011-10-17 19:48:19 +0000253 };
254
Argyrios Kyrtzidis6ec43ad2011-11-12 02:16:30 +0000255 struct ObjCProtocolListInfo {
256 SmallVector<CXIdxObjCProtocolRefInfo, 4> ProtInfos;
Argyrios Kyrtzidis2957e6f2011-11-22 07:24:51 +0000257 SmallVector<EntityInfo, 4> ProtEntities;
Argyrios Kyrtzidis6ec43ad2011-11-12 02:16:30 +0000258 SmallVector<CXIdxObjCProtocolRefInfo *, 4> Prots;
259
Argyrios Kyrtzidisb395c632011-11-18 00:26:51 +0000260 CXIdxObjCProtocolRefListInfo getListInfo() const {
Argyrios Kyrtzidisc71d5542011-11-14 22:39:19 +0000261 CXIdxObjCProtocolRefListInfo Info = { Prots.data(),
262 (unsigned)Prots.size() };
263 return Info;
264 }
Argyrios Kyrtzidis6ec43ad2011-11-12 02:16:30 +0000265
266 ObjCProtocolListInfo(const ObjCProtocolList &ProtList,
267 IndexingContext &IdxCtx,
268 IndexingContext::StrAdapter &SA);
269 };
270
Argyrios Kyrtzidisb395c632011-11-18 00:26:51 +0000271 struct AttrListInfo {
272 SmallVector<AttrInfo, 2> Attrs;
273 SmallVector<IBOutletCollectionInfo, 2> IBCollAttrs;
274 SmallVector<CXIdxAttrInfo *, 2> CXAttrs;
275
276 const CXIdxAttrInfo *const *getAttrs() const {
277 return CXAttrs.data();
278 }
279 unsigned getNumAttrs() const { return (unsigned)CXAttrs.size(); }
280
281 AttrListInfo(const Decl *D,
282 IndexingContext &IdxCtx,
283 IndexingContext::StrAdapter &SA);
Argyrios Kyrtzidis2957e6f2011-11-22 07:24:51 +0000284 };
285
286 struct CXXBasesListInfo {
287 SmallVector<CXIdxBaseClassInfo, 4> BaseInfos;
288 SmallVector<EntityInfo, 4> BaseEntities;
289 SmallVector<CXIdxBaseClassInfo *, 4> CXBases;
290
291 const CXIdxBaseClassInfo *const *getBases() const {
292 return CXBases.data();
293 }
294 unsigned getNumBases() const { return (unsigned)CXBases.size(); }
295
296 CXXBasesListInfo(const CXXRecordDecl *D,
297 IndexingContext &IdxCtx, IndexingContext::StrAdapter &SA);
Argyrios Kyrtzidisb526a872011-12-07 20:44:15 +0000298
299 private:
300 SourceLocation getBaseLoc(const CXXBaseSpecifier &Base) const;
Argyrios Kyrtzidis2957e6f2011-11-22 07:24:51 +0000301 };
Argyrios Kyrtzidisb395c632011-11-18 00:26:51 +0000302
Argyrios Kyrtzidis4e7064f2011-10-17 19:48:19 +0000303public:
304 IndexingContext(CXClientData clientData, IndexerCallbacks &indexCallbacks,
305 unsigned indexOptions, CXTranslationUnit cxTU)
306 : Ctx(0), ClientData(clientData), CB(indexCallbacks),
Argyrios Kyrtzidis37f40572011-11-23 20:27:26 +0000307 IndexOptions(indexOptions), CXTU(cxTU),
308 StrScratch(/*size=*/1024), StrAdapterCount(0) { }
Argyrios Kyrtzidis4e7064f2011-10-17 19:48:19 +0000309
310 ASTContext &getASTContext() const { return *Ctx; }
311
312 void setASTContext(ASTContext &ctx);
313
Argyrios Kyrtzidisb395c632011-11-18 00:26:51 +0000314 bool suppressRefs() const {
315 return IndexOptions & CXIndexOpt_SuppressRedundantRefs;
Argyrios Kyrtzidisc6b4a502011-11-16 02:34:59 +0000316 }
317
Argyrios Kyrtzidisb395c632011-11-18 00:26:51 +0000318 bool shouldAbort();
319
Argyrios Kyrtzidis996e6e52011-12-01 02:42:50 +0000320 bool hasDiagnosticCallback() const { return CB.diagnostic; }
321
Argyrios Kyrtzidisdd93c592011-11-11 00:23:36 +0000322 void enteredMainFile(const FileEntry *File);
323
Argyrios Kyrtzidis4e7064f2011-10-17 19:48:19 +0000324 void ppIncludedFile(SourceLocation hashLoc,
325 StringRef filename, const FileEntry *File,
326 bool isImport, bool isAngled);
327
Argyrios Kyrtzidis6ec43ad2011-11-12 02:16:30 +0000328 void startedTranslationUnit();
Argyrios Kyrtzidis4e7064f2011-10-17 19:48:19 +0000329
330 void indexDecl(const Decl *D);
331
332 void indexTagDecl(const TagDecl *D);
333
334 void indexTypeSourceInfo(TypeSourceInfo *TInfo, const NamedDecl *Parent,
335 const DeclContext *DC = 0);
336
337 void indexTypeLoc(TypeLoc TL, const NamedDecl *Parent,
Argyrios Kyrtzidise422e452011-12-13 18:47:41 +0000338 const DeclContext *DC = 0);
339
340 void indexNestedNameSpecifierLoc(NestedNameSpecifierLoc NNS,
341 const NamedDecl *Parent,
342 const DeclContext *DC = 0);
Argyrios Kyrtzidis4e7064f2011-10-17 19:48:19 +0000343
344 void indexDeclContext(const DeclContext *DC);
345
Argyrios Kyrtzidise422e452011-12-13 18:47:41 +0000346 void indexBody(const Stmt *S, const NamedDecl *Parent,
347 const DeclContext *DC = 0);
Argyrios Kyrtzidis4e7064f2011-10-17 19:48:19 +0000348
Argyrios Kyrtzidisb395c632011-11-18 00:26:51 +0000349 void handleDiagnosticSet(CXDiagnosticSet CXDiagSet);
Argyrios Kyrtzidis4e7064f2011-10-17 19:48:19 +0000350
Argyrios Kyrtzidisb395c632011-11-18 00:26:51 +0000351 bool handleFunction(const FunctionDecl *FD);
Argyrios Kyrtzidis4e7064f2011-10-17 19:48:19 +0000352
Argyrios Kyrtzidisb395c632011-11-18 00:26:51 +0000353 bool handleVar(const VarDecl *D);
Argyrios Kyrtzidis4e7064f2011-10-17 19:48:19 +0000354
Argyrios Kyrtzidisb395c632011-11-18 00:26:51 +0000355 bool handleField(const FieldDecl *D);
Argyrios Kyrtzidis4e7064f2011-10-17 19:48:19 +0000356
Argyrios Kyrtzidisb395c632011-11-18 00:26:51 +0000357 bool handleEnumerator(const EnumConstantDecl *D);
Argyrios Kyrtzidis4e7064f2011-10-17 19:48:19 +0000358
Argyrios Kyrtzidisb395c632011-11-18 00:26:51 +0000359 bool handleTagDecl(const TagDecl *D);
Argyrios Kyrtzidis4e7064f2011-10-17 19:48:19 +0000360
Argyrios Kyrtzidis2957e6f2011-11-22 07:24:51 +0000361 bool handleTypedefName(const TypedefNameDecl *D);
Argyrios Kyrtzidis4e7064f2011-10-17 19:48:19 +0000362
Argyrios Kyrtzidisb395c632011-11-18 00:26:51 +0000363 bool handleObjCClass(const ObjCClassDecl *D);
364 bool handleObjCInterface(const ObjCInterfaceDecl *D);
365 bool handleObjCImplementation(const ObjCImplementationDecl *D);
Argyrios Kyrtzidis4e7064f2011-10-17 19:48:19 +0000366
Argyrios Kyrtzidisb395c632011-11-18 00:26:51 +0000367 bool handleObjCForwardProtocol(const ObjCProtocolDecl *D,
Argyrios Kyrtzidisdd93c592011-11-11 00:23:36 +0000368 SourceLocation Loc,
369 bool isRedeclaration);
370
Argyrios Kyrtzidisb395c632011-11-18 00:26:51 +0000371 bool handleObjCProtocol(const ObjCProtocolDecl *D);
Argyrios Kyrtzidis4e7064f2011-10-17 19:48:19 +0000372
Argyrios Kyrtzidisb395c632011-11-18 00:26:51 +0000373 bool handleObjCCategory(const ObjCCategoryDecl *D);
374 bool handleObjCCategoryImpl(const ObjCCategoryImplDecl *D);
Argyrios Kyrtzidis4e7064f2011-10-17 19:48:19 +0000375
Argyrios Kyrtzidisb395c632011-11-18 00:26:51 +0000376 bool handleObjCMethod(const ObjCMethodDecl *D);
Argyrios Kyrtzidis4e7064f2011-10-17 19:48:19 +0000377
Argyrios Kyrtzidisb395c632011-11-18 00:26:51 +0000378 bool handleSynthesizedObjCProperty(const ObjCPropertyImplDecl *D);
379 bool handleSynthesizedObjCMethod(const ObjCMethodDecl *D, SourceLocation Loc);
Argyrios Kyrtzidis4e7064f2011-10-17 19:48:19 +0000380
Argyrios Kyrtzidisb395c632011-11-18 00:26:51 +0000381 bool handleObjCProperty(const ObjCPropertyDecl *D);
382
Argyrios Kyrtzidis68478b02011-12-07 05:52:06 +0000383 bool handleNamespace(const NamespaceDecl *D);
384
Argyrios Kyrtzidis2957e6f2011-11-22 07:24:51 +0000385 bool handleClassTemplate(const ClassTemplateDecl *D);
386 bool handleFunctionTemplate(const FunctionTemplateDecl *D);
387 bool handleTypeAliasTemplate(const TypeAliasTemplateDecl *D);
388
Argyrios Kyrtzidisb395c632011-11-18 00:26:51 +0000389 bool handleReference(const NamedDecl *D, SourceLocation Loc, CXCursor Cursor,
390 const NamedDecl *Parent,
391 const DeclContext *DC,
392 const Expr *E = 0,
393 CXIdxEntityRefKind Kind = CXIdxEntityRef_Direct);
394
395 bool handleReference(const NamedDecl *D, SourceLocation Loc,
Argyrios Kyrtzidis4e7064f2011-10-17 19:48:19 +0000396 const NamedDecl *Parent,
397 const DeclContext *DC,
Argyrios Kyrtzidisaca19be2011-10-18 15:50:50 +0000398 const Expr *E = 0,
399 CXIdxEntityRefKind Kind = CXIdxEntityRef_Direct);
Argyrios Kyrtzidis4e7064f2011-10-17 19:48:19 +0000400
401 bool isNotFromSourceFile(SourceLocation Loc) const;
402
Argyrios Kyrtzidis21ee5702011-11-15 06:20:16 +0000403 void indexTopLevelDecl(Decl *D);
Argyrios Kyrtzidis4e7064f2011-10-17 19:48:19 +0000404 void indexTUDeclsInObjCContainer();
405 void indexDeclGroupRef(DeclGroupRef DG);
406
407 void addTUDeclInObjCContainer(DeclGroupRef DG) {
408 TUDeclsInObjCContainer.push_back(DG);
409 }
410
Argyrios Kyrtzidisdd93c592011-11-11 00:23:36 +0000411 void translateLoc(SourceLocation Loc, CXIdxClientFile *indexFile, CXFile *file,
Argyrios Kyrtzidis4e7064f2011-10-17 19:48:19 +0000412 unsigned *line, unsigned *column, unsigned *offset);
413
Argyrios Kyrtzidis2957e6f2011-11-22 07:24:51 +0000414 CXIdxClientContainer getClientContainerForDC(const DeclContext *DC) const;
415 void addContainerInMap(const DeclContext *DC, CXIdxClientContainer container);
416
417 CXIdxClientEntity getClientEntity(const Decl *D) const;
418 void setClientEntity(const Decl *D, CXIdxClientEntity client);
419
Argyrios Kyrtzidis4e7064f2011-10-17 19:48:19 +0000420private:
Argyrios Kyrtzidisb395c632011-11-18 00:26:51 +0000421 bool handleDecl(const NamedDecl *D,
Argyrios Kyrtzidisdd93c592011-11-11 00:23:36 +0000422 SourceLocation Loc, CXCursor Cursor,
Argyrios Kyrtzidisdd93c592011-11-11 00:23:36 +0000423 DeclInfo &DInfo);
Argyrios Kyrtzidis4e7064f2011-10-17 19:48:19 +0000424
Argyrios Kyrtzidisb395c632011-11-18 00:26:51 +0000425 bool handleObjCContainer(const ObjCContainerDecl *D,
Argyrios Kyrtzidisdd93c592011-11-11 00:23:36 +0000426 SourceLocation Loc, CXCursor Cursor,
Argyrios Kyrtzidisdd93c592011-11-11 00:23:36 +0000427 ObjCContainerDeclInfo &ContDInfo);
Argyrios Kyrtzidis4e7064f2011-10-17 19:48:19 +0000428
Argyrios Kyrtzidis2957e6f2011-11-22 07:24:51 +0000429 bool handleCXXRecordDecl(const CXXRecordDecl *RD, const NamedDecl *OrigD);
Argyrios Kyrtzidisdd93c592011-11-11 00:23:36 +0000430
Argyrios Kyrtzidisb395c632011-11-18 00:26:51 +0000431 bool markEntityOccurrenceInFile(const NamedDecl *D, SourceLocation Loc);
432
Argyrios Kyrtzidis4e7064f2011-10-17 19:48:19 +0000433 const NamedDecl *getEntityDecl(const NamedDecl *D) const;
434
Argyrios Kyrtzidis2957e6f2011-11-22 07:24:51 +0000435 const DeclContext *getEntityContainer(const Decl *D) const;
436
Argyrios Kyrtzidisdd93c592011-11-11 00:23:36 +0000437 CXIdxClientFile getIndexFile(const FileEntry *File);
Argyrios Kyrtzidis4e7064f2011-10-17 19:48:19 +0000438
439 CXIdxLoc getIndexLoc(SourceLocation Loc) const;
440
Argyrios Kyrtzidis4e7064f2011-10-17 19:48:19 +0000441 void getEntityInfo(const NamedDecl *D,
Argyrios Kyrtzidis2957e6f2011-11-22 07:24:51 +0000442 EntityInfo &EntityInfo,
Argyrios Kyrtzidis4e7064f2011-10-17 19:48:19 +0000443 StrAdapter &SA);
444
Argyrios Kyrtzidis2957e6f2011-11-22 07:24:51 +0000445 void getContainerInfo(const DeclContext *DC, ContainerInfo &ContInfo);
446
Argyrios Kyrtzidisb395c632011-11-18 00:26:51 +0000447 CXCursor getCursor(const Decl *D) {
448 return cxcursor::MakeCXCursor(const_cast<Decl*>(D), CXTU);
Argyrios Kyrtzidis4e7064f2011-10-17 19:48:19 +0000449 }
450
451 CXCursor getRefCursor(const NamedDecl *D, SourceLocation Loc);
Argyrios Kyrtzidis2957e6f2011-11-22 07:24:51 +0000452
453 static bool shouldIgnoreIfImplicit(const NamedDecl *D);
Argyrios Kyrtzidis4e7064f2011-10-17 19:48:19 +0000454};
455
456}} // end clang::cxindex
Argyrios Kyrtzidisc6b4a502011-11-16 02:34:59 +0000457
458namespace llvm {
459 /// Define DenseMapInfo so that FileID's can be used as keys in DenseMap and
460 /// DenseSets.
461 template <>
462 struct DenseMapInfo<clang::cxindex::RefFileOccurence> {
463 static inline clang::cxindex::RefFileOccurence getEmptyKey() {
464 return clang::cxindex::RefFileOccurence(0, 0);
465 }
466
467 static inline clang::cxindex::RefFileOccurence getTombstoneKey() {
468 return clang::cxindex::RefFileOccurence((const clang::FileEntry *)~0,
469 (const clang::Decl *)~0);
470 }
471
472 static unsigned getHashValue(clang::cxindex::RefFileOccurence S) {
473 llvm::FoldingSetNodeID ID;
474 ID.AddPointer(S.File);
475 ID.AddPointer(S.Dcl);
476 return ID.ComputeHash();
477 }
478
479 static bool isEqual(clang::cxindex::RefFileOccurence LHS,
480 clang::cxindex::RefFileOccurence RHS) {
481 return LHS.File == RHS.File && LHS.Dcl == RHS.Dcl;
482 }
483 };
484}