blob: ef8e24e7c34a9e1bc18cbe3de82b754634472940 [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 Kyrtzidis4e7064f2011-10-17 19:48:19 +000023
24namespace cxindex {
25 class IndexingContext;
Argyrios Kyrtzidis643d3ce2011-12-15 00:05:00 +000026 class ScratchAlloc;
27 class AttrListInfo;
Argyrios Kyrtzidis4e7064f2011-10-17 19:48:19 +000028
Argyrios Kyrtzidis2957e6f2011-11-22 07:24:51 +000029struct EntityInfo : public CXIdxEntityInfo {
30 const NamedDecl *Dcl;
31 IndexingContext *IndexCtx;
Argyrios Kyrtzidis643d3ce2011-12-15 00:05:00 +000032 llvm::IntrusiveRefCntPtr<AttrListInfo> AttrList;
Argyrios Kyrtzidis37f40572011-11-23 20:27:26 +000033
34 EntityInfo() {
35 name = USR = 0;
Argyrios Kyrtzidis643d3ce2011-12-15 00:05:00 +000036 attributes = 0;
37 numAttributes = 0;
Argyrios Kyrtzidis37f40572011-11-23 20:27:26 +000038 }
Argyrios Kyrtzidis2957e6f2011-11-22 07:24:51 +000039};
40
41struct ContainerInfo : public CXIdxContainerInfo {
42 const DeclContext *DC;
43 IndexingContext *IndexCtx;
44};
45
Argyrios Kyrtzidisdd93c592011-11-11 00:23:36 +000046struct DeclInfo : public CXIdxDeclInfo {
Argyrios Kyrtzidisc71d5542011-11-14 22:39:19 +000047 enum DInfoKind {
48 Info_Decl,
49
50 Info_ObjCContainer,
51 Info_ObjCInterface,
52 Info_ObjCProtocol,
Argyrios Kyrtzidis2957e6f2011-11-22 07:24:51 +000053 Info_ObjCCategory,
54
55 Info_CXXClass
Argyrios Kyrtzidisc71d5542011-11-14 22:39:19 +000056 };
57
58 DInfoKind Kind;
59
Argyrios Kyrtzidis2957e6f2011-11-22 07:24:51 +000060 EntityInfo EntInfo;
Argyrios Kyrtzidisb1febb62011-12-07 20:44:19 +000061 ContainerInfo SemanticContainer;
62 ContainerInfo LexicalContainer;
Argyrios Kyrtzidis2957e6f2011-11-22 07:24:51 +000063 ContainerInfo DeclAsContainer;
64
Argyrios Kyrtzidisc71d5542011-11-14 22:39:19 +000065 DeclInfo(bool isRedeclaration, bool isDefinition, bool isContainer)
66 : Kind(Info_Decl) {
67 this->isRedeclaration = isRedeclaration;
68 this->isDefinition = isDefinition;
69 this->isContainer = isContainer;
Argyrios Kyrtzidisb395c632011-11-18 00:26:51 +000070 attributes = 0;
71 numAttributes = 0;
Argyrios Kyrtzidisb1febb62011-12-07 20:44:19 +000072 declAsContainer = semanticContainer = lexicalContainer = 0;
Argyrios Kyrtzidisc71d5542011-11-14 22:39:19 +000073 }
74 DeclInfo(DInfoKind K,
75 bool isRedeclaration, bool isDefinition, bool isContainer)
76 : Kind(K) {
77 this->isRedeclaration = isRedeclaration;
78 this->isDefinition = isDefinition;
79 this->isContainer = isContainer;
Argyrios Kyrtzidisb395c632011-11-18 00:26:51 +000080 attributes = 0;
81 numAttributes = 0;
Argyrios Kyrtzidisb1febb62011-12-07 20:44:19 +000082 declAsContainer = semanticContainer = lexicalContainer = 0;
Argyrios Kyrtzidisc71d5542011-11-14 22:39:19 +000083 }
84
85 static bool classof(const DeclInfo *) { return true; }
Argyrios Kyrtzidisdd93c592011-11-11 00:23:36 +000086};
87
Argyrios Kyrtzidisdd93c592011-11-11 00:23:36 +000088struct ObjCContainerDeclInfo : public DeclInfo {
Argyrios Kyrtzidis6ec43ad2011-11-12 02:16:30 +000089 CXIdxObjCContainerDeclInfo ObjCContDeclInfo;
Argyrios Kyrtzidisc71d5542011-11-14 22:39:19 +000090
91 ObjCContainerDeclInfo(bool isForwardRef,
92 bool isRedeclaration,
93 bool isImplementation)
94 : DeclInfo(Info_ObjCContainer, isRedeclaration,
95 /*isDefinition=*/!isForwardRef, /*isContainer=*/!isForwardRef) {
96 init(isForwardRef, isImplementation);
97 }
98 ObjCContainerDeclInfo(DInfoKind K,
99 bool isForwardRef,
100 bool isRedeclaration,
101 bool isImplementation)
102 : DeclInfo(K, isRedeclaration, /*isDefinition=*/!isForwardRef,
103 /*isContainer=*/!isForwardRef) {
104 init(isForwardRef, isImplementation);
105 }
106
107 static bool classof(const DeclInfo *D) {
108 return Info_ObjCContainer <= D->Kind && D->Kind <= Info_ObjCCategory;
109 }
110 static bool classof(const ObjCContainerDeclInfo *D) { return true; }
111
112private:
113 void init(bool isForwardRef, bool isImplementation) {
114 if (isForwardRef)
115 ObjCContDeclInfo.kind = CXIdxObjCContainer_ForwardRef;
116 else if (isImplementation)
117 ObjCContDeclInfo.kind = CXIdxObjCContainer_Implementation;
118 else
119 ObjCContDeclInfo.kind = CXIdxObjCContainer_Interface;
120 }
121};
122
123struct ObjCInterfaceDeclInfo : public ObjCContainerDeclInfo {
124 CXIdxObjCInterfaceDeclInfo ObjCInterDeclInfo;
125 CXIdxObjCProtocolRefListInfo ObjCProtoListInfo;
126
127 ObjCInterfaceDeclInfo(const ObjCInterfaceDecl *D)
128 : ObjCContainerDeclInfo(Info_ObjCInterface,
129 /*isForwardRef=*/false,
Douglas Gregoref96ee02012-01-14 16:38:05 +0000130 /*isRedeclaration=*/D->getPreviousDecl() != 0,
Argyrios Kyrtzidisc71d5542011-11-14 22:39:19 +0000131 /*isImplementation=*/false) { }
132
133 static bool classof(const DeclInfo *D) {
134 return D->Kind == Info_ObjCInterface;
135 }
136 static bool classof(const ObjCInterfaceDeclInfo *D) { return true; }
137};
138
139struct ObjCProtocolDeclInfo : public ObjCContainerDeclInfo {
140 CXIdxObjCProtocolRefListInfo ObjCProtoRefListInfo;
141
142 ObjCProtocolDeclInfo(const ObjCProtocolDecl *D)
143 : ObjCContainerDeclInfo(Info_ObjCProtocol,
144 /*isForwardRef=*/false,
Douglas Gregoref96ee02012-01-14 16:38:05 +0000145 /*isRedeclaration=*/D->getPreviousDecl(),
Argyrios Kyrtzidisc71d5542011-11-14 22:39:19 +0000146 /*isImplementation=*/false) { }
147
148 static bool classof(const DeclInfo *D) {
149 return D->Kind == Info_ObjCProtocol;
150 }
151 static bool classof(const ObjCProtocolDeclInfo *D) { return true; }
Argyrios Kyrtzidisdd93c592011-11-11 00:23:36 +0000152};
153
154struct ObjCCategoryDeclInfo : public ObjCContainerDeclInfo {
Argyrios Kyrtzidis6ec43ad2011-11-12 02:16:30 +0000155 CXIdxObjCCategoryDeclInfo ObjCCatDeclInfo;
Argyrios Kyrtzidisc10a4c82011-12-13 18:47:45 +0000156 CXIdxObjCProtocolRefListInfo ObjCProtoListInfo;
Argyrios Kyrtzidis6ec43ad2011-11-12 02:16:30 +0000157
Argyrios Kyrtzidisc71d5542011-11-14 22:39:19 +0000158 explicit ObjCCategoryDeclInfo(bool isImplementation)
159 : ObjCContainerDeclInfo(Info_ObjCCategory,
160 /*isForwardRef=*/false,
161 /*isRedeclaration=*/isImplementation,
162 /*isImplementation=*/isImplementation) { }
Argyrios Kyrtzidis6ec43ad2011-11-12 02:16:30 +0000163
Argyrios Kyrtzidisc71d5542011-11-14 22:39:19 +0000164 static bool classof(const DeclInfo *D) {
165 return D->Kind == Info_ObjCCategory;
166 }
167 static bool classof(const ObjCCategoryDeclInfo *D) { return true; }
Argyrios Kyrtzidisdd93c592011-11-11 00:23:36 +0000168};
169
Argyrios Kyrtzidis2957e6f2011-11-22 07:24:51 +0000170struct CXXClassDeclInfo : public DeclInfo {
171 CXIdxCXXClassDeclInfo CXXClassInfo;
172
173 CXXClassDeclInfo(bool isRedeclaration, bool isDefinition)
174 : DeclInfo(Info_CXXClass, isRedeclaration, isDefinition, isDefinition) { }
175
176 static bool classof(const DeclInfo *D) {
177 return D->Kind == Info_CXXClass;
178 }
179 static bool classof(const CXXClassDeclInfo *D) { return true; }
180};
181
Argyrios Kyrtzidisb395c632011-11-18 00:26:51 +0000182struct AttrInfo : public CXIdxAttrInfo {
183 const Attr *A;
184
185 AttrInfo(CXIdxAttrKind Kind, CXCursor C, CXIdxLoc Loc, const Attr *A) {
186 kind = Kind;
187 cursor = C;
188 loc = Loc;
189 this->A = A;
190 }
191
192 static bool classof(const AttrInfo *) { return true; }
193};
194
195struct IBOutletCollectionInfo : public AttrInfo {
Argyrios Kyrtzidis2957e6f2011-11-22 07:24:51 +0000196 EntityInfo ClassInfo;
Argyrios Kyrtzidisb395c632011-11-18 00:26:51 +0000197 CXIdxIBOutletCollectionAttrInfo IBCollInfo;
198
199 IBOutletCollectionInfo(CXCursor C, CXIdxLoc Loc, const Attr *A) :
200 AttrInfo(CXIdxAttr_IBOutletCollection, C, Loc, A) {
201 assert(C.kind == CXCursor_IBOutletCollectionAttr);
Argyrios Kyrtzidis643d3ce2011-12-15 00:05:00 +0000202 IBCollInfo.objcClass = 0;
Argyrios Kyrtzidisb395c632011-11-18 00:26:51 +0000203 }
204
Argyrios Kyrtzidis643d3ce2011-12-15 00:05:00 +0000205 IBOutletCollectionInfo(const IBOutletCollectionInfo &other);
206
Argyrios Kyrtzidisb395c632011-11-18 00:26:51 +0000207 static bool classof(const AttrInfo *A) {
208 return A->kind == CXIdxAttr_IBOutletCollection;
209 }
210 static bool classof(const IBOutletCollectionInfo *D) { return true; }
211};
212
Argyrios Kyrtzidis643d3ce2011-12-15 00:05:00 +0000213class AttrListInfo {
214 SmallVector<AttrInfo, 2> Attrs;
215 SmallVector<IBOutletCollectionInfo, 2> IBCollAttrs;
216 SmallVector<CXIdxAttrInfo *, 2> CXAttrs;
217 unsigned ref_cnt;
218
219public:
220 AttrListInfo(const Decl *D,
221 IndexingContext &IdxCtx,
222 ScratchAlloc &SA);
223 AttrListInfo(const AttrListInfo &other);
224
225 const CXIdxAttrInfo *const *getAttrs() const {
226 if (CXAttrs.empty())
227 return 0;
228 return CXAttrs.data();
229 }
230 unsigned getNumAttrs() const { return (unsigned)CXAttrs.size(); }
231
232 /// \brief Retain/Release only useful when we allocate a AttrListInfo from the
233 /// BumpPtrAllocator, and not from the stack; so that we keep a pointer
234 // in the EntityInfo
235 void Retain() { ++ref_cnt; }
236 void Release() {
237 assert (ref_cnt > 0 && "Reference count is already zero.");
238 if (--ref_cnt == 0) {
239 // Memory is allocated from a BumpPtrAllocator, no need to delete it.
240 this->~AttrListInfo();
241 }
242 }
243};
244
Argyrios Kyrtzidisc6b4a502011-11-16 02:34:59 +0000245struct RefFileOccurence {
246 const FileEntry *File;
247 const Decl *Dcl;
248
249 RefFileOccurence(const FileEntry *File, const Decl *Dcl)
250 : File(File), Dcl(Dcl) { }
251};
252
Argyrios Kyrtzidis4e7064f2011-10-17 19:48:19 +0000253class IndexingContext {
254 ASTContext *Ctx;
255 CXClientData ClientData;
256 IndexerCallbacks &CB;
257 unsigned IndexOptions;
258 CXTranslationUnit CXTU;
259
Argyrios Kyrtzidisdd93c592011-11-11 00:23:36 +0000260 typedef llvm::DenseMap<const FileEntry *, CXIdxClientFile> FileMapTy;
Argyrios Kyrtzidis2957e6f2011-11-22 07:24:51 +0000261 typedef llvm::DenseMap<const DeclContext *, CXIdxClientContainer>
262 ContainerMapTy;
263 typedef llvm::DenseMap<const Decl *, CXIdxClientEntity> EntityMapTy;
264
Argyrios Kyrtzidis4e7064f2011-10-17 19:48:19 +0000265 FileMapTy FileMap;
Argyrios Kyrtzidis4e7064f2011-10-17 19:48:19 +0000266 ContainerMapTy ContainerMap;
Argyrios Kyrtzidis2957e6f2011-11-22 07:24:51 +0000267 EntityMapTy EntityMap;
Argyrios Kyrtzidis4e7064f2011-10-17 19:48:19 +0000268
Argyrios Kyrtzidisc6b4a502011-11-16 02:34:59 +0000269 llvm::DenseSet<RefFileOccurence> RefFileOccurences;
270
Argyrios Kyrtzidis4e7064f2011-10-17 19:48:19 +0000271 SmallVector<DeclGroupRef, 8> TUDeclsInObjCContainer;
272
Argyrios Kyrtzidis37f40572011-11-23 20:27:26 +0000273 llvm::BumpPtrAllocator StrScratch;
Argyrios Kyrtzidisdd93c592011-11-11 00:23:36 +0000274 unsigned StrAdapterCount;
Argyrios Kyrtzidis643d3ce2011-12-15 00:05:00 +0000275 friend class ScratchAlloc;
Argyrios Kyrtzidis4e7064f2011-10-17 19:48:19 +0000276
Argyrios Kyrtzidis6ec43ad2011-11-12 02:16:30 +0000277 struct ObjCProtocolListInfo {
278 SmallVector<CXIdxObjCProtocolRefInfo, 4> ProtInfos;
Argyrios Kyrtzidis2957e6f2011-11-22 07:24:51 +0000279 SmallVector<EntityInfo, 4> ProtEntities;
Argyrios Kyrtzidis6ec43ad2011-11-12 02:16:30 +0000280 SmallVector<CXIdxObjCProtocolRefInfo *, 4> Prots;
281
Argyrios Kyrtzidisb395c632011-11-18 00:26:51 +0000282 CXIdxObjCProtocolRefListInfo getListInfo() const {
Argyrios Kyrtzidisc71d5542011-11-14 22:39:19 +0000283 CXIdxObjCProtocolRefListInfo Info = { Prots.data(),
284 (unsigned)Prots.size() };
285 return Info;
286 }
Argyrios Kyrtzidis6ec43ad2011-11-12 02:16:30 +0000287
288 ObjCProtocolListInfo(const ObjCProtocolList &ProtList,
289 IndexingContext &IdxCtx,
Argyrios Kyrtzidis643d3ce2011-12-15 00:05:00 +0000290 ScratchAlloc &SA);
Argyrios Kyrtzidis2957e6f2011-11-22 07:24:51 +0000291 };
292
293 struct CXXBasesListInfo {
294 SmallVector<CXIdxBaseClassInfo, 4> BaseInfos;
295 SmallVector<EntityInfo, 4> BaseEntities;
296 SmallVector<CXIdxBaseClassInfo *, 4> CXBases;
297
298 const CXIdxBaseClassInfo *const *getBases() const {
299 return CXBases.data();
300 }
301 unsigned getNumBases() const { return (unsigned)CXBases.size(); }
302
303 CXXBasesListInfo(const CXXRecordDecl *D,
Argyrios Kyrtzidis643d3ce2011-12-15 00:05:00 +0000304 IndexingContext &IdxCtx, ScratchAlloc &SA);
Argyrios Kyrtzidisb526a872011-12-07 20:44:15 +0000305
306 private:
307 SourceLocation getBaseLoc(const CXXBaseSpecifier &Base) const;
Argyrios Kyrtzidis2957e6f2011-11-22 07:24:51 +0000308 };
Argyrios Kyrtzidisb395c632011-11-18 00:26:51 +0000309
Argyrios Kyrtzidis643d3ce2011-12-15 00:05:00 +0000310 friend class AttrListInfo;
311
Argyrios Kyrtzidis4e7064f2011-10-17 19:48:19 +0000312public:
313 IndexingContext(CXClientData clientData, IndexerCallbacks &indexCallbacks,
314 unsigned indexOptions, CXTranslationUnit cxTU)
315 : Ctx(0), ClientData(clientData), CB(indexCallbacks),
Argyrios Kyrtzidis37f40572011-11-23 20:27:26 +0000316 IndexOptions(indexOptions), CXTU(cxTU),
317 StrScratch(/*size=*/1024), StrAdapterCount(0) { }
Argyrios Kyrtzidis4e7064f2011-10-17 19:48:19 +0000318
319 ASTContext &getASTContext() const { return *Ctx; }
320
321 void setASTContext(ASTContext &ctx);
Argyrios Kyrtzidis7fe90f32012-01-17 18:48:07 +0000322 void setPreprocessor(Preprocessor &PP);
Argyrios Kyrtzidis4e7064f2011-10-17 19:48:19 +0000323
Argyrios Kyrtzidisb395c632011-11-18 00:26:51 +0000324 bool suppressRefs() const {
325 return IndexOptions & CXIndexOpt_SuppressRedundantRefs;
Argyrios Kyrtzidisc6b4a502011-11-16 02:34:59 +0000326 }
327
Argyrios Kyrtzidis22490742012-01-14 00:11:49 +0000328 bool indexFunctionLocalSymbols() const {
329 return IndexOptions & CXIndexOpt_IndexFunctionLocalSymbols;
330 }
331
Argyrios Kyrtzidisb395c632011-11-18 00:26:51 +0000332 bool shouldAbort();
333
Argyrios Kyrtzidis996e6e52011-12-01 02:42:50 +0000334 bool hasDiagnosticCallback() const { return CB.diagnostic; }
335
Argyrios Kyrtzidisdd93c592011-11-11 00:23:36 +0000336 void enteredMainFile(const FileEntry *File);
337
Argyrios Kyrtzidis4e7064f2011-10-17 19:48:19 +0000338 void ppIncludedFile(SourceLocation hashLoc,
339 StringRef filename, const FileEntry *File,
340 bool isImport, bool isAngled);
341
Argyrios Kyrtzidis6ec43ad2011-11-12 02:16:30 +0000342 void startedTranslationUnit();
Argyrios Kyrtzidis4e7064f2011-10-17 19:48:19 +0000343
344 void indexDecl(const Decl *D);
345
346 void indexTagDecl(const TagDecl *D);
347
348 void indexTypeSourceInfo(TypeSourceInfo *TInfo, const NamedDecl *Parent,
349 const DeclContext *DC = 0);
350
351 void indexTypeLoc(TypeLoc TL, const NamedDecl *Parent,
Argyrios Kyrtzidise422e452011-12-13 18:47:41 +0000352 const DeclContext *DC = 0);
353
354 void indexNestedNameSpecifierLoc(NestedNameSpecifierLoc NNS,
355 const NamedDecl *Parent,
356 const DeclContext *DC = 0);
Argyrios Kyrtzidis4e7064f2011-10-17 19:48:19 +0000357
358 void indexDeclContext(const DeclContext *DC);
359
Argyrios Kyrtzidise422e452011-12-13 18:47:41 +0000360 void indexBody(const Stmt *S, const NamedDecl *Parent,
361 const DeclContext *DC = 0);
Argyrios Kyrtzidis4e7064f2011-10-17 19:48:19 +0000362
Argyrios Kyrtzidisb395c632011-11-18 00:26:51 +0000363 void handleDiagnosticSet(CXDiagnosticSet CXDiagSet);
Argyrios Kyrtzidis4e7064f2011-10-17 19:48:19 +0000364
Argyrios Kyrtzidisb395c632011-11-18 00:26:51 +0000365 bool handleFunction(const FunctionDecl *FD);
Argyrios Kyrtzidis4e7064f2011-10-17 19:48:19 +0000366
Argyrios Kyrtzidisb395c632011-11-18 00:26:51 +0000367 bool handleVar(const VarDecl *D);
Argyrios Kyrtzidis4e7064f2011-10-17 19:48:19 +0000368
Argyrios Kyrtzidisb395c632011-11-18 00:26:51 +0000369 bool handleField(const FieldDecl *D);
Argyrios Kyrtzidis4e7064f2011-10-17 19:48:19 +0000370
Argyrios Kyrtzidisb395c632011-11-18 00:26:51 +0000371 bool handleEnumerator(const EnumConstantDecl *D);
Argyrios Kyrtzidis4e7064f2011-10-17 19:48:19 +0000372
Argyrios Kyrtzidisb395c632011-11-18 00:26:51 +0000373 bool handleTagDecl(const TagDecl *D);
Argyrios Kyrtzidis4e7064f2011-10-17 19:48:19 +0000374
Argyrios Kyrtzidis2957e6f2011-11-22 07:24:51 +0000375 bool handleTypedefName(const TypedefNameDecl *D);
Argyrios Kyrtzidis4e7064f2011-10-17 19:48:19 +0000376
Argyrios Kyrtzidisb395c632011-11-18 00:26:51 +0000377 bool handleObjCInterface(const ObjCInterfaceDecl *D);
378 bool handleObjCImplementation(const ObjCImplementationDecl *D);
Argyrios Kyrtzidis4e7064f2011-10-17 19:48:19 +0000379
Argyrios Kyrtzidisb395c632011-11-18 00:26:51 +0000380 bool handleObjCProtocol(const ObjCProtocolDecl *D);
Argyrios Kyrtzidis4e7064f2011-10-17 19:48:19 +0000381
Argyrios Kyrtzidisb395c632011-11-18 00:26:51 +0000382 bool handleObjCCategory(const ObjCCategoryDecl *D);
383 bool handleObjCCategoryImpl(const ObjCCategoryImplDecl *D);
Argyrios Kyrtzidis4e7064f2011-10-17 19:48:19 +0000384
Argyrios Kyrtzidisb395c632011-11-18 00:26:51 +0000385 bool handleObjCMethod(const ObjCMethodDecl *D);
Argyrios Kyrtzidis4e7064f2011-10-17 19:48:19 +0000386
Argyrios Kyrtzidisb395c632011-11-18 00:26:51 +0000387 bool handleSynthesizedObjCProperty(const ObjCPropertyImplDecl *D);
388 bool handleSynthesizedObjCMethod(const ObjCMethodDecl *D, SourceLocation Loc);
Argyrios Kyrtzidis4e7064f2011-10-17 19:48:19 +0000389
Argyrios Kyrtzidisb395c632011-11-18 00:26:51 +0000390 bool handleObjCProperty(const ObjCPropertyDecl *D);
391
Argyrios Kyrtzidis68478b02011-12-07 05:52:06 +0000392 bool handleNamespace(const NamespaceDecl *D);
393
Argyrios Kyrtzidis2957e6f2011-11-22 07:24:51 +0000394 bool handleClassTemplate(const ClassTemplateDecl *D);
395 bool handleFunctionTemplate(const FunctionTemplateDecl *D);
396 bool handleTypeAliasTemplate(const TypeAliasTemplateDecl *D);
397
Argyrios Kyrtzidisb395c632011-11-18 00:26:51 +0000398 bool handleReference(const NamedDecl *D, SourceLocation Loc, CXCursor Cursor,
399 const NamedDecl *Parent,
400 const DeclContext *DC,
401 const Expr *E = 0,
402 CXIdxEntityRefKind Kind = CXIdxEntityRef_Direct);
403
404 bool handleReference(const NamedDecl *D, SourceLocation Loc,
Argyrios Kyrtzidis4e7064f2011-10-17 19:48:19 +0000405 const NamedDecl *Parent,
406 const DeclContext *DC,
Argyrios Kyrtzidisaca19be2011-10-18 15:50:50 +0000407 const Expr *E = 0,
408 CXIdxEntityRefKind Kind = CXIdxEntityRef_Direct);
Argyrios Kyrtzidis4e7064f2011-10-17 19:48:19 +0000409
410 bool isNotFromSourceFile(SourceLocation Loc) const;
411
Argyrios Kyrtzidis21ee5702011-11-15 06:20:16 +0000412 void indexTopLevelDecl(Decl *D);
Argyrios Kyrtzidis4e7064f2011-10-17 19:48:19 +0000413 void indexTUDeclsInObjCContainer();
414 void indexDeclGroupRef(DeclGroupRef DG);
415
416 void addTUDeclInObjCContainer(DeclGroupRef DG) {
417 TUDeclsInObjCContainer.push_back(DG);
418 }
419
Argyrios Kyrtzidisdd93c592011-11-11 00:23:36 +0000420 void translateLoc(SourceLocation Loc, CXIdxClientFile *indexFile, CXFile *file,
Argyrios Kyrtzidis4e7064f2011-10-17 19:48:19 +0000421 unsigned *line, unsigned *column, unsigned *offset);
422
Argyrios Kyrtzidis2957e6f2011-11-22 07:24:51 +0000423 CXIdxClientContainer getClientContainerForDC(const DeclContext *DC) const;
424 void addContainerInMap(const DeclContext *DC, CXIdxClientContainer container);
425
426 CXIdxClientEntity getClientEntity(const Decl *D) const;
427 void setClientEntity(const Decl *D, CXIdxClientEntity client);
428
Argyrios Kyrtzidis4e7064f2011-10-17 19:48:19 +0000429private:
Argyrios Kyrtzidisb395c632011-11-18 00:26:51 +0000430 bool handleDecl(const NamedDecl *D,
Argyrios Kyrtzidisdd93c592011-11-11 00:23:36 +0000431 SourceLocation Loc, CXCursor Cursor,
Argyrios Kyrtzidisdd93c592011-11-11 00:23:36 +0000432 DeclInfo &DInfo);
Argyrios Kyrtzidis4e7064f2011-10-17 19:48:19 +0000433
Argyrios Kyrtzidisb395c632011-11-18 00:26:51 +0000434 bool handleObjCContainer(const ObjCContainerDecl *D,
Argyrios Kyrtzidisdd93c592011-11-11 00:23:36 +0000435 SourceLocation Loc, CXCursor Cursor,
Argyrios Kyrtzidisdd93c592011-11-11 00:23:36 +0000436 ObjCContainerDeclInfo &ContDInfo);
Argyrios Kyrtzidis4e7064f2011-10-17 19:48:19 +0000437
Argyrios Kyrtzidis2957e6f2011-11-22 07:24:51 +0000438 bool handleCXXRecordDecl(const CXXRecordDecl *RD, const NamedDecl *OrigD);
Argyrios Kyrtzidisdd93c592011-11-11 00:23:36 +0000439
Argyrios Kyrtzidisb395c632011-11-18 00:26:51 +0000440 bool markEntityOccurrenceInFile(const NamedDecl *D, SourceLocation Loc);
441
Argyrios Kyrtzidis4e7064f2011-10-17 19:48:19 +0000442 const NamedDecl *getEntityDecl(const NamedDecl *D) const;
443
Argyrios Kyrtzidis2957e6f2011-11-22 07:24:51 +0000444 const DeclContext *getEntityContainer(const Decl *D) const;
445
Argyrios Kyrtzidisdd93c592011-11-11 00:23:36 +0000446 CXIdxClientFile getIndexFile(const FileEntry *File);
Argyrios Kyrtzidis4e7064f2011-10-17 19:48:19 +0000447
448 CXIdxLoc getIndexLoc(SourceLocation Loc) const;
449
Argyrios Kyrtzidis4e7064f2011-10-17 19:48:19 +0000450 void getEntityInfo(const NamedDecl *D,
Argyrios Kyrtzidis2957e6f2011-11-22 07:24:51 +0000451 EntityInfo &EntityInfo,
Argyrios Kyrtzidis643d3ce2011-12-15 00:05:00 +0000452 ScratchAlloc &SA);
Argyrios Kyrtzidis4e7064f2011-10-17 19:48:19 +0000453
Argyrios Kyrtzidis2957e6f2011-11-22 07:24:51 +0000454 void getContainerInfo(const DeclContext *DC, ContainerInfo &ContInfo);
455
Argyrios Kyrtzidisb395c632011-11-18 00:26:51 +0000456 CXCursor getCursor(const Decl *D) {
457 return cxcursor::MakeCXCursor(const_cast<Decl*>(D), CXTU);
Argyrios Kyrtzidis4e7064f2011-10-17 19:48:19 +0000458 }
459
460 CXCursor getRefCursor(const NamedDecl *D, SourceLocation Loc);
Argyrios Kyrtzidis2957e6f2011-11-22 07:24:51 +0000461
Argyrios Kyrtzidisd0890082012-02-07 22:46:16 +0000462 static bool shouldIgnoreIfImplicit(const Decl *D);
Argyrios Kyrtzidis4e7064f2011-10-17 19:48:19 +0000463};
464
Argyrios Kyrtzidis643d3ce2011-12-15 00:05:00 +0000465class ScratchAlloc {
466 IndexingContext &IdxCtx;
467
468public:
469 explicit ScratchAlloc(IndexingContext &indexCtx) : IdxCtx(indexCtx) {
470 ++IdxCtx.StrAdapterCount;
471 }
472
473 ~ScratchAlloc() {
474 --IdxCtx.StrAdapterCount;
475 if (IdxCtx.StrAdapterCount == 0)
476 IdxCtx.StrScratch.Reset();
477 }
478
479 const char *toCStr(StringRef Str);
480 const char *copyCStr(StringRef Str);
481
482 template <typename T>
483 T *allocate() {
484 return IdxCtx.StrScratch.Allocate<T>();
485 }
486};
487
Argyrios Kyrtzidis4e7064f2011-10-17 19:48:19 +0000488}} // end clang::cxindex
Argyrios Kyrtzidisc6b4a502011-11-16 02:34:59 +0000489
490namespace llvm {
491 /// Define DenseMapInfo so that FileID's can be used as keys in DenseMap and
492 /// DenseSets.
493 template <>
494 struct DenseMapInfo<clang::cxindex::RefFileOccurence> {
495 static inline clang::cxindex::RefFileOccurence getEmptyKey() {
496 return clang::cxindex::RefFileOccurence(0, 0);
497 }
498
499 static inline clang::cxindex::RefFileOccurence getTombstoneKey() {
500 return clang::cxindex::RefFileOccurence((const clang::FileEntry *)~0,
501 (const clang::Decl *)~0);
502 }
503
504 static unsigned getHashValue(clang::cxindex::RefFileOccurence S) {
505 llvm::FoldingSetNodeID ID;
506 ID.AddPointer(S.File);
507 ID.AddPointer(S.Dcl);
508 return ID.ComputeHash();
509 }
510
511 static bool isEqual(clang::cxindex::RefFileOccurence LHS,
512 clang::cxindex::RefFileOccurence RHS) {
513 return LHS.File == RHS.File && LHS.Dcl == RHS.Dcl;
514 }
515 };
516}