blob: 93d4718e27c27b519a658cb034574871b54b0b1c [file] [log] [blame]
Argyrios Kyrtzidis4e7064f2011-10-17 19:48:19 +00001//===- IndexingContext.h - Higher level API functions ------------------------===//
2//
3// The LLVM Compiler Infrastructure
4//
5// This file is distributed under the University of Illinois Open Source
6// License. See LICENSE.TXT for details.
7//
8//===----------------------------------------------------------------------===//
9
10#include "Index_Internal.h"
11#include "CXCursor.h"
12
Argyrios Kyrtzidis6ec43ad2011-11-12 02:16:30 +000013#include "clang/AST/DeclObjC.h"
Argyrios Kyrtzidis4e7064f2011-10-17 19:48:19 +000014#include "clang/AST/DeclGroup.h"
Argyrios Kyrtzidisc6b4a502011-11-16 02:34:59 +000015#include "llvm/ADT/DenseSet.h"
Argyrios Kyrtzidis30a28052012-03-23 23:24:18 +000016#include <deque>
Argyrios Kyrtzidis4e7064f2011-10-17 19:48:19 +000017
18namespace clang {
19 class FileEntry;
20 class ObjCPropertyDecl;
Argyrios Kyrtzidis2957e6f2011-11-22 07:24:51 +000021 class ClassTemplateDecl;
22 class FunctionTemplateDecl;
23 class TypeAliasTemplateDecl;
Argyrios Kyrtzidis6d968362012-02-10 20:10:44 +000024 class ClassTemplateSpecializationDecl;
Argyrios Kyrtzidis4e7064f2011-10-17 19:48:19 +000025
26namespace cxindex {
27 class IndexingContext;
Argyrios Kyrtzidis643d3ce2011-12-15 00:05:00 +000028 class ScratchAlloc;
29 class AttrListInfo;
Argyrios Kyrtzidis4e7064f2011-10-17 19:48:19 +000030
Argyrios Kyrtzidis2957e6f2011-11-22 07:24:51 +000031struct EntityInfo : public CXIdxEntityInfo {
32 const NamedDecl *Dcl;
33 IndexingContext *IndexCtx;
Dylan Noblesmithc93dc782012-02-20 14:00:23 +000034 IntrusiveRefCntPtr<AttrListInfo> AttrList;
Argyrios Kyrtzidis37f40572011-11-23 20:27:26 +000035
36 EntityInfo() {
37 name = USR = 0;
Argyrios Kyrtzidis643d3ce2011-12-15 00:05:00 +000038 attributes = 0;
39 numAttributes = 0;
Argyrios Kyrtzidis37f40572011-11-23 20:27:26 +000040 }
Argyrios Kyrtzidis2957e6f2011-11-22 07:24:51 +000041};
42
43struct ContainerInfo : public CXIdxContainerInfo {
44 const DeclContext *DC;
45 IndexingContext *IndexCtx;
46};
47
Argyrios Kyrtzidisdd93c592011-11-11 00:23:36 +000048struct DeclInfo : public CXIdxDeclInfo {
Argyrios Kyrtzidisc71d5542011-11-14 22:39:19 +000049 enum DInfoKind {
50 Info_Decl,
51
52 Info_ObjCContainer,
53 Info_ObjCInterface,
54 Info_ObjCProtocol,
Argyrios Kyrtzidis2957e6f2011-11-22 07:24:51 +000055 Info_ObjCCategory,
56
Argyrios Kyrtzidis792db262012-02-28 17:50:33 +000057 Info_ObjCProperty,
58
Argyrios Kyrtzidis2957e6f2011-11-22 07:24:51 +000059 Info_CXXClass
Argyrios Kyrtzidisc71d5542011-11-14 22:39:19 +000060 };
61
62 DInfoKind Kind;
63
Argyrios Kyrtzidis2957e6f2011-11-22 07:24:51 +000064 EntityInfo EntInfo;
Argyrios Kyrtzidisb1febb62011-12-07 20:44:19 +000065 ContainerInfo SemanticContainer;
66 ContainerInfo LexicalContainer;
Argyrios Kyrtzidis2957e6f2011-11-22 07:24:51 +000067 ContainerInfo DeclAsContainer;
68
Argyrios Kyrtzidisc71d5542011-11-14 22:39:19 +000069 DeclInfo(bool isRedeclaration, bool isDefinition, bool isContainer)
70 : Kind(Info_Decl) {
71 this->isRedeclaration = isRedeclaration;
72 this->isDefinition = isDefinition;
73 this->isContainer = isContainer;
Argyrios Kyrtzidisb395c632011-11-18 00:26:51 +000074 attributes = 0;
75 numAttributes = 0;
Argyrios Kyrtzidisb1febb62011-12-07 20:44:19 +000076 declAsContainer = semanticContainer = lexicalContainer = 0;
Argyrios Kyrtzidisc71d5542011-11-14 22:39:19 +000077 }
78 DeclInfo(DInfoKind K,
79 bool isRedeclaration, bool isDefinition, bool isContainer)
80 : Kind(K) {
81 this->isRedeclaration = isRedeclaration;
82 this->isDefinition = isDefinition;
83 this->isContainer = isContainer;
Argyrios Kyrtzidisb395c632011-11-18 00:26:51 +000084 attributes = 0;
85 numAttributes = 0;
Argyrios Kyrtzidisb1febb62011-12-07 20:44:19 +000086 declAsContainer = semanticContainer = lexicalContainer = 0;
Argyrios Kyrtzidisc71d5542011-11-14 22:39:19 +000087 }
88
89 static bool classof(const DeclInfo *) { return true; }
Argyrios Kyrtzidisdd93c592011-11-11 00:23:36 +000090};
91
Argyrios Kyrtzidisdd93c592011-11-11 00:23:36 +000092struct ObjCContainerDeclInfo : public DeclInfo {
Argyrios Kyrtzidis6ec43ad2011-11-12 02:16:30 +000093 CXIdxObjCContainerDeclInfo ObjCContDeclInfo;
Argyrios Kyrtzidisc71d5542011-11-14 22:39:19 +000094
95 ObjCContainerDeclInfo(bool isForwardRef,
96 bool isRedeclaration,
97 bool isImplementation)
98 : DeclInfo(Info_ObjCContainer, isRedeclaration,
99 /*isDefinition=*/!isForwardRef, /*isContainer=*/!isForwardRef) {
100 init(isForwardRef, isImplementation);
101 }
102 ObjCContainerDeclInfo(DInfoKind K,
103 bool isForwardRef,
104 bool isRedeclaration,
105 bool isImplementation)
106 : DeclInfo(K, isRedeclaration, /*isDefinition=*/!isForwardRef,
107 /*isContainer=*/!isForwardRef) {
108 init(isForwardRef, isImplementation);
109 }
110
111 static bool classof(const DeclInfo *D) {
112 return Info_ObjCContainer <= D->Kind && D->Kind <= Info_ObjCCategory;
113 }
114 static bool classof(const ObjCContainerDeclInfo *D) { return true; }
115
116private:
117 void init(bool isForwardRef, bool isImplementation) {
118 if (isForwardRef)
119 ObjCContDeclInfo.kind = CXIdxObjCContainer_ForwardRef;
120 else if (isImplementation)
121 ObjCContDeclInfo.kind = CXIdxObjCContainer_Implementation;
122 else
123 ObjCContDeclInfo.kind = CXIdxObjCContainer_Interface;
124 }
125};
126
127struct ObjCInterfaceDeclInfo : public ObjCContainerDeclInfo {
128 CXIdxObjCInterfaceDeclInfo ObjCInterDeclInfo;
129 CXIdxObjCProtocolRefListInfo ObjCProtoListInfo;
130
131 ObjCInterfaceDeclInfo(const ObjCInterfaceDecl *D)
132 : ObjCContainerDeclInfo(Info_ObjCInterface,
133 /*isForwardRef=*/false,
Douglas Gregoref96ee02012-01-14 16:38:05 +0000134 /*isRedeclaration=*/D->getPreviousDecl() != 0,
Argyrios Kyrtzidisc71d5542011-11-14 22:39:19 +0000135 /*isImplementation=*/false) { }
136
137 static bool classof(const DeclInfo *D) {
138 return D->Kind == Info_ObjCInterface;
139 }
140 static bool classof(const ObjCInterfaceDeclInfo *D) { return true; }
141};
142
143struct ObjCProtocolDeclInfo : public ObjCContainerDeclInfo {
144 CXIdxObjCProtocolRefListInfo ObjCProtoRefListInfo;
145
146 ObjCProtocolDeclInfo(const ObjCProtocolDecl *D)
147 : ObjCContainerDeclInfo(Info_ObjCProtocol,
148 /*isForwardRef=*/false,
Douglas Gregoref96ee02012-01-14 16:38:05 +0000149 /*isRedeclaration=*/D->getPreviousDecl(),
Argyrios Kyrtzidisc71d5542011-11-14 22:39:19 +0000150 /*isImplementation=*/false) { }
151
152 static bool classof(const DeclInfo *D) {
153 return D->Kind == Info_ObjCProtocol;
154 }
155 static bool classof(const ObjCProtocolDeclInfo *D) { return true; }
Argyrios Kyrtzidisdd93c592011-11-11 00:23:36 +0000156};
157
158struct ObjCCategoryDeclInfo : public ObjCContainerDeclInfo {
Argyrios Kyrtzidis6ec43ad2011-11-12 02:16:30 +0000159 CXIdxObjCCategoryDeclInfo ObjCCatDeclInfo;
Argyrios Kyrtzidisc10a4c82011-12-13 18:47:45 +0000160 CXIdxObjCProtocolRefListInfo ObjCProtoListInfo;
Argyrios Kyrtzidis6ec43ad2011-11-12 02:16:30 +0000161
Argyrios Kyrtzidisc71d5542011-11-14 22:39:19 +0000162 explicit ObjCCategoryDeclInfo(bool isImplementation)
163 : ObjCContainerDeclInfo(Info_ObjCCategory,
164 /*isForwardRef=*/false,
165 /*isRedeclaration=*/isImplementation,
166 /*isImplementation=*/isImplementation) { }
Argyrios Kyrtzidis6ec43ad2011-11-12 02:16:30 +0000167
Argyrios Kyrtzidisc71d5542011-11-14 22:39:19 +0000168 static bool classof(const DeclInfo *D) {
169 return D->Kind == Info_ObjCCategory;
170 }
171 static bool classof(const ObjCCategoryDeclInfo *D) { return true; }
Argyrios Kyrtzidisdd93c592011-11-11 00:23:36 +0000172};
173
Argyrios Kyrtzidis792db262012-02-28 17:50:33 +0000174struct ObjCPropertyDeclInfo : public DeclInfo {
175 CXIdxObjCPropertyDeclInfo ObjCPropDeclInfo;
176
177 ObjCPropertyDeclInfo()
178 : DeclInfo(Info_ObjCProperty,
179 /*isRedeclaration=*/false, /*isDefinition=*/false,
180 /*isContainer=*/false) { }
181
182 static bool classof(const DeclInfo *D) {
183 return D->Kind == Info_ObjCProperty;
184 }
185 static bool classof(const ObjCPropertyDeclInfo *D) { return true; }
186};
187
Argyrios Kyrtzidis2957e6f2011-11-22 07:24:51 +0000188struct CXXClassDeclInfo : public DeclInfo {
189 CXIdxCXXClassDeclInfo CXXClassInfo;
190
191 CXXClassDeclInfo(bool isRedeclaration, bool isDefinition)
192 : DeclInfo(Info_CXXClass, isRedeclaration, isDefinition, isDefinition) { }
193
194 static bool classof(const DeclInfo *D) {
195 return D->Kind == Info_CXXClass;
196 }
197 static bool classof(const CXXClassDeclInfo *D) { return true; }
198};
199
Argyrios Kyrtzidisb395c632011-11-18 00:26:51 +0000200struct AttrInfo : public CXIdxAttrInfo {
201 const Attr *A;
202
203 AttrInfo(CXIdxAttrKind Kind, CXCursor C, CXIdxLoc Loc, const Attr *A) {
204 kind = Kind;
205 cursor = C;
206 loc = Loc;
207 this->A = A;
208 }
209
210 static bool classof(const AttrInfo *) { return true; }
211};
212
213struct IBOutletCollectionInfo : public AttrInfo {
Argyrios Kyrtzidis2957e6f2011-11-22 07:24:51 +0000214 EntityInfo ClassInfo;
Argyrios Kyrtzidisb395c632011-11-18 00:26:51 +0000215 CXIdxIBOutletCollectionAttrInfo IBCollInfo;
216
217 IBOutletCollectionInfo(CXCursor C, CXIdxLoc Loc, const Attr *A) :
218 AttrInfo(CXIdxAttr_IBOutletCollection, C, Loc, A) {
219 assert(C.kind == CXCursor_IBOutletCollectionAttr);
Argyrios Kyrtzidis643d3ce2011-12-15 00:05:00 +0000220 IBCollInfo.objcClass = 0;
Argyrios Kyrtzidisb395c632011-11-18 00:26:51 +0000221 }
222
Argyrios Kyrtzidis643d3ce2011-12-15 00:05:00 +0000223 IBOutletCollectionInfo(const IBOutletCollectionInfo &other);
224
Argyrios Kyrtzidisb395c632011-11-18 00:26:51 +0000225 static bool classof(const AttrInfo *A) {
226 return A->kind == CXIdxAttr_IBOutletCollection;
227 }
228 static bool classof(const IBOutletCollectionInfo *D) { return true; }
229};
230
Argyrios Kyrtzidis643d3ce2011-12-15 00:05:00 +0000231class AttrListInfo {
232 SmallVector<AttrInfo, 2> Attrs;
233 SmallVector<IBOutletCollectionInfo, 2> IBCollAttrs;
234 SmallVector<CXIdxAttrInfo *, 2> CXAttrs;
235 unsigned ref_cnt;
236
237public:
238 AttrListInfo(const Decl *D,
239 IndexingContext &IdxCtx,
240 ScratchAlloc &SA);
241 AttrListInfo(const AttrListInfo &other);
242
243 const CXIdxAttrInfo *const *getAttrs() const {
244 if (CXAttrs.empty())
245 return 0;
246 return CXAttrs.data();
247 }
248 unsigned getNumAttrs() const { return (unsigned)CXAttrs.size(); }
249
250 /// \brief Retain/Release only useful when we allocate a AttrListInfo from the
251 /// BumpPtrAllocator, and not from the stack; so that we keep a pointer
252 // in the EntityInfo
253 void Retain() { ++ref_cnt; }
254 void Release() {
255 assert (ref_cnt > 0 && "Reference count is already zero.");
256 if (--ref_cnt == 0) {
257 // Memory is allocated from a BumpPtrAllocator, no need to delete it.
258 this->~AttrListInfo();
259 }
260 }
261};
262
Argyrios Kyrtzidisc6b4a502011-11-16 02:34:59 +0000263struct RefFileOccurence {
264 const FileEntry *File;
265 const Decl *Dcl;
266
267 RefFileOccurence(const FileEntry *File, const Decl *Dcl)
268 : File(File), Dcl(Dcl) { }
269};
270
Argyrios Kyrtzidis4e7064f2011-10-17 19:48:19 +0000271class IndexingContext {
272 ASTContext *Ctx;
273 CXClientData ClientData;
274 IndexerCallbacks &CB;
275 unsigned IndexOptions;
276 CXTranslationUnit CXTU;
277
Argyrios Kyrtzidisdd93c592011-11-11 00:23:36 +0000278 typedef llvm::DenseMap<const FileEntry *, CXIdxClientFile> FileMapTy;
Argyrios Kyrtzidis2957e6f2011-11-22 07:24:51 +0000279 typedef llvm::DenseMap<const DeclContext *, CXIdxClientContainer>
280 ContainerMapTy;
281 typedef llvm::DenseMap<const Decl *, CXIdxClientEntity> EntityMapTy;
282
Argyrios Kyrtzidis4e7064f2011-10-17 19:48:19 +0000283 FileMapTy FileMap;
Argyrios Kyrtzidis4e7064f2011-10-17 19:48:19 +0000284 ContainerMapTy ContainerMap;
Argyrios Kyrtzidis2957e6f2011-11-22 07:24:51 +0000285 EntityMapTy EntityMap;
Argyrios Kyrtzidis4e7064f2011-10-17 19:48:19 +0000286
Argyrios Kyrtzidisc6b4a502011-11-16 02:34:59 +0000287 llvm::DenseSet<RefFileOccurence> RefFileOccurences;
288
Argyrios Kyrtzidis30a28052012-03-23 23:24:18 +0000289 std::deque<DeclGroupRef> TUDeclsInObjCContainer;
Argyrios Kyrtzidis4e7064f2011-10-17 19:48:19 +0000290
Argyrios Kyrtzidis37f40572011-11-23 20:27:26 +0000291 llvm::BumpPtrAllocator StrScratch;
Argyrios Kyrtzidisdd93c592011-11-11 00:23:36 +0000292 unsigned StrAdapterCount;
Argyrios Kyrtzidis643d3ce2011-12-15 00:05:00 +0000293 friend class ScratchAlloc;
Argyrios Kyrtzidis4e7064f2011-10-17 19:48:19 +0000294
Argyrios Kyrtzidis6ec43ad2011-11-12 02:16:30 +0000295 struct ObjCProtocolListInfo {
296 SmallVector<CXIdxObjCProtocolRefInfo, 4> ProtInfos;
Argyrios Kyrtzidis2957e6f2011-11-22 07:24:51 +0000297 SmallVector<EntityInfo, 4> ProtEntities;
Argyrios Kyrtzidis6ec43ad2011-11-12 02:16:30 +0000298 SmallVector<CXIdxObjCProtocolRefInfo *, 4> Prots;
299
Argyrios Kyrtzidisb395c632011-11-18 00:26:51 +0000300 CXIdxObjCProtocolRefListInfo getListInfo() const {
Argyrios Kyrtzidisc71d5542011-11-14 22:39:19 +0000301 CXIdxObjCProtocolRefListInfo Info = { Prots.data(),
302 (unsigned)Prots.size() };
303 return Info;
304 }
Argyrios Kyrtzidis6ec43ad2011-11-12 02:16:30 +0000305
306 ObjCProtocolListInfo(const ObjCProtocolList &ProtList,
307 IndexingContext &IdxCtx,
Argyrios Kyrtzidis643d3ce2011-12-15 00:05:00 +0000308 ScratchAlloc &SA);
Argyrios Kyrtzidis2957e6f2011-11-22 07:24:51 +0000309 };
310
311 struct CXXBasesListInfo {
312 SmallVector<CXIdxBaseClassInfo, 4> BaseInfos;
313 SmallVector<EntityInfo, 4> BaseEntities;
314 SmallVector<CXIdxBaseClassInfo *, 4> CXBases;
315
316 const CXIdxBaseClassInfo *const *getBases() const {
317 return CXBases.data();
318 }
319 unsigned getNumBases() const { return (unsigned)CXBases.size(); }
320
321 CXXBasesListInfo(const CXXRecordDecl *D,
Argyrios Kyrtzidis643d3ce2011-12-15 00:05:00 +0000322 IndexingContext &IdxCtx, ScratchAlloc &SA);
Argyrios Kyrtzidisb526a872011-12-07 20:44:15 +0000323
324 private:
325 SourceLocation getBaseLoc(const CXXBaseSpecifier &Base) const;
Argyrios Kyrtzidis2957e6f2011-11-22 07:24:51 +0000326 };
Argyrios Kyrtzidisb395c632011-11-18 00:26:51 +0000327
Argyrios Kyrtzidis643d3ce2011-12-15 00:05:00 +0000328 friend class AttrListInfo;
329
Argyrios Kyrtzidis4e7064f2011-10-17 19:48:19 +0000330public:
331 IndexingContext(CXClientData clientData, IndexerCallbacks &indexCallbacks,
332 unsigned indexOptions, CXTranslationUnit cxTU)
333 : Ctx(0), ClientData(clientData), CB(indexCallbacks),
Argyrios Kyrtzidis37f40572011-11-23 20:27:26 +0000334 IndexOptions(indexOptions), CXTU(cxTU),
335 StrScratch(/*size=*/1024), StrAdapterCount(0) { }
Argyrios Kyrtzidis4e7064f2011-10-17 19:48:19 +0000336
337 ASTContext &getASTContext() const { return *Ctx; }
338
339 void setASTContext(ASTContext &ctx);
Argyrios Kyrtzidis7fe90f32012-01-17 18:48:07 +0000340 void setPreprocessor(Preprocessor &PP);
Argyrios Kyrtzidis4e7064f2011-10-17 19:48:19 +0000341
Argyrios Kyrtzidis58d2dbe2012-02-14 22:23:11 +0000342 bool shouldSuppressRefs() const {
Argyrios Kyrtzidisb395c632011-11-18 00:26:51 +0000343 return IndexOptions & CXIndexOpt_SuppressRedundantRefs;
Argyrios Kyrtzidisc6b4a502011-11-16 02:34:59 +0000344 }
345
Argyrios Kyrtzidis58d2dbe2012-02-14 22:23:11 +0000346 bool shouldIndexFunctionLocalSymbols() const {
Argyrios Kyrtzidis22490742012-01-14 00:11:49 +0000347 return IndexOptions & CXIndexOpt_IndexFunctionLocalSymbols;
348 }
349
Argyrios Kyrtzidis58d2dbe2012-02-14 22:23:11 +0000350 bool shouldIndexImplicitTemplateInsts() const {
351 return IndexOptions & CXIndexOpt_IndexImplicitTemplateInstantiations;
352 }
353
Argyrios Kyrtzidisb395c632011-11-18 00:26:51 +0000354 bool shouldAbort();
355
Argyrios Kyrtzidis996e6e52011-12-01 02:42:50 +0000356 bool hasDiagnosticCallback() const { return CB.diagnostic; }
357
Argyrios Kyrtzidisdd93c592011-11-11 00:23:36 +0000358 void enteredMainFile(const FileEntry *File);
359
Argyrios Kyrtzidis4e7064f2011-10-17 19:48:19 +0000360 void ppIncludedFile(SourceLocation hashLoc,
361 StringRef filename, const FileEntry *File,
362 bool isImport, bool isAngled);
363
Argyrios Kyrtzidis6ec43ad2011-11-12 02:16:30 +0000364 void startedTranslationUnit();
Argyrios Kyrtzidis4e7064f2011-10-17 19:48:19 +0000365
366 void indexDecl(const Decl *D);
367
368 void indexTagDecl(const TagDecl *D);
369
370 void indexTypeSourceInfo(TypeSourceInfo *TInfo, const NamedDecl *Parent,
371 const DeclContext *DC = 0);
372
373 void indexTypeLoc(TypeLoc TL, const NamedDecl *Parent,
Argyrios Kyrtzidise422e452011-12-13 18:47:41 +0000374 const DeclContext *DC = 0);
375
376 void indexNestedNameSpecifierLoc(NestedNameSpecifierLoc NNS,
377 const NamedDecl *Parent,
378 const DeclContext *DC = 0);
Argyrios Kyrtzidis4e7064f2011-10-17 19:48:19 +0000379
380 void indexDeclContext(const DeclContext *DC);
381
Argyrios Kyrtzidise422e452011-12-13 18:47:41 +0000382 void indexBody(const Stmt *S, const NamedDecl *Parent,
383 const DeclContext *DC = 0);
Argyrios Kyrtzidis4e7064f2011-10-17 19:48:19 +0000384
Argyrios Kyrtzidisb395c632011-11-18 00:26:51 +0000385 void handleDiagnosticSet(CXDiagnosticSet CXDiagSet);
Argyrios Kyrtzidis4e7064f2011-10-17 19:48:19 +0000386
Argyrios Kyrtzidisb395c632011-11-18 00:26:51 +0000387 bool handleFunction(const FunctionDecl *FD);
Argyrios Kyrtzidis4e7064f2011-10-17 19:48:19 +0000388
Argyrios Kyrtzidisb395c632011-11-18 00:26:51 +0000389 bool handleVar(const VarDecl *D);
Argyrios Kyrtzidis4e7064f2011-10-17 19:48:19 +0000390
Argyrios Kyrtzidisb395c632011-11-18 00:26:51 +0000391 bool handleField(const FieldDecl *D);
Argyrios Kyrtzidis4e7064f2011-10-17 19:48:19 +0000392
Argyrios Kyrtzidisb395c632011-11-18 00:26:51 +0000393 bool handleEnumerator(const EnumConstantDecl *D);
Argyrios Kyrtzidis4e7064f2011-10-17 19:48:19 +0000394
Argyrios Kyrtzidisb395c632011-11-18 00:26:51 +0000395 bool handleTagDecl(const TagDecl *D);
Argyrios Kyrtzidis4e7064f2011-10-17 19:48:19 +0000396
Argyrios Kyrtzidis2957e6f2011-11-22 07:24:51 +0000397 bool handleTypedefName(const TypedefNameDecl *D);
Argyrios Kyrtzidis4e7064f2011-10-17 19:48:19 +0000398
Argyrios Kyrtzidisb395c632011-11-18 00:26:51 +0000399 bool handleObjCInterface(const ObjCInterfaceDecl *D);
400 bool handleObjCImplementation(const ObjCImplementationDecl *D);
Argyrios Kyrtzidis4e7064f2011-10-17 19:48:19 +0000401
Argyrios Kyrtzidisb395c632011-11-18 00:26:51 +0000402 bool handleObjCProtocol(const ObjCProtocolDecl *D);
Argyrios Kyrtzidis4e7064f2011-10-17 19:48:19 +0000403
Argyrios Kyrtzidisb395c632011-11-18 00:26:51 +0000404 bool handleObjCCategory(const ObjCCategoryDecl *D);
405 bool handleObjCCategoryImpl(const ObjCCategoryImplDecl *D);
Argyrios Kyrtzidis4e7064f2011-10-17 19:48:19 +0000406
Argyrios Kyrtzidisb395c632011-11-18 00:26:51 +0000407 bool handleObjCMethod(const ObjCMethodDecl *D);
Argyrios Kyrtzidis4e7064f2011-10-17 19:48:19 +0000408
Argyrios Kyrtzidisb395c632011-11-18 00:26:51 +0000409 bool handleSynthesizedObjCProperty(const ObjCPropertyImplDecl *D);
Argyrios Kyrtzidisf9112422012-02-28 17:50:39 +0000410 bool handleSynthesizedObjCMethod(const ObjCMethodDecl *D, SourceLocation Loc,
411 const DeclContext *LexicalDC);
Argyrios Kyrtzidis4e7064f2011-10-17 19:48:19 +0000412
Argyrios Kyrtzidisb395c632011-11-18 00:26:51 +0000413 bool handleObjCProperty(const ObjCPropertyDecl *D);
414
Argyrios Kyrtzidis68478b02011-12-07 05:52:06 +0000415 bool handleNamespace(const NamespaceDecl *D);
416
Argyrios Kyrtzidis2957e6f2011-11-22 07:24:51 +0000417 bool handleClassTemplate(const ClassTemplateDecl *D);
418 bool handleFunctionTemplate(const FunctionTemplateDecl *D);
419 bool handleTypeAliasTemplate(const TypeAliasTemplateDecl *D);
420
Argyrios Kyrtzidisb395c632011-11-18 00:26:51 +0000421 bool handleReference(const NamedDecl *D, SourceLocation Loc, CXCursor Cursor,
422 const NamedDecl *Parent,
423 const DeclContext *DC,
424 const Expr *E = 0,
425 CXIdxEntityRefKind Kind = CXIdxEntityRef_Direct);
426
427 bool handleReference(const NamedDecl *D, SourceLocation Loc,
Argyrios Kyrtzidis4e7064f2011-10-17 19:48:19 +0000428 const NamedDecl *Parent,
429 const DeclContext *DC,
Argyrios Kyrtzidisaca19be2011-10-18 15:50:50 +0000430 const Expr *E = 0,
431 CXIdxEntityRefKind Kind = CXIdxEntityRef_Direct);
Argyrios Kyrtzidis4e7064f2011-10-17 19:48:19 +0000432
433 bool isNotFromSourceFile(SourceLocation Loc) const;
434
Argyrios Kyrtzidis21ee5702011-11-15 06:20:16 +0000435 void indexTopLevelDecl(Decl *D);
Argyrios Kyrtzidis4e7064f2011-10-17 19:48:19 +0000436 void indexTUDeclsInObjCContainer();
437 void indexDeclGroupRef(DeclGroupRef DG);
438
439 void addTUDeclInObjCContainer(DeclGroupRef DG) {
440 TUDeclsInObjCContainer.push_back(DG);
441 }
442
Argyrios Kyrtzidisdd93c592011-11-11 00:23:36 +0000443 void translateLoc(SourceLocation Loc, CXIdxClientFile *indexFile, CXFile *file,
Argyrios Kyrtzidis4e7064f2011-10-17 19:48:19 +0000444 unsigned *line, unsigned *column, unsigned *offset);
445
Argyrios Kyrtzidis2957e6f2011-11-22 07:24:51 +0000446 CXIdxClientContainer getClientContainerForDC(const DeclContext *DC) const;
447 void addContainerInMap(const DeclContext *DC, CXIdxClientContainer container);
448
449 CXIdxClientEntity getClientEntity(const Decl *D) const;
450 void setClientEntity(const Decl *D, CXIdxClientEntity client);
451
Argyrios Kyrtzidis6d968362012-02-10 20:10:44 +0000452 static bool isTemplateImplicitInstantiation(const Decl *D);
453
Argyrios Kyrtzidis4e7064f2011-10-17 19:48:19 +0000454private:
Argyrios Kyrtzidisb395c632011-11-18 00:26:51 +0000455 bool handleDecl(const NamedDecl *D,
Argyrios Kyrtzidisdd93c592011-11-11 00:23:36 +0000456 SourceLocation Loc, CXCursor Cursor,
Argyrios Kyrtzidisf9112422012-02-28 17:50:39 +0000457 DeclInfo &DInfo,
458 const DeclContext *LexicalDC = 0);
Argyrios Kyrtzidis4e7064f2011-10-17 19:48:19 +0000459
Argyrios Kyrtzidisb395c632011-11-18 00:26:51 +0000460 bool handleObjCContainer(const ObjCContainerDecl *D,
Argyrios Kyrtzidisdd93c592011-11-11 00:23:36 +0000461 SourceLocation Loc, CXCursor Cursor,
Argyrios Kyrtzidisdd93c592011-11-11 00:23:36 +0000462 ObjCContainerDeclInfo &ContDInfo);
Argyrios Kyrtzidis4e7064f2011-10-17 19:48:19 +0000463
Argyrios Kyrtzidis2957e6f2011-11-22 07:24:51 +0000464 bool handleCXXRecordDecl(const CXXRecordDecl *RD, const NamedDecl *OrigD);
Argyrios Kyrtzidisdd93c592011-11-11 00:23:36 +0000465
Argyrios Kyrtzidisb395c632011-11-18 00:26:51 +0000466 bool markEntityOccurrenceInFile(const NamedDecl *D, SourceLocation Loc);
467
Argyrios Kyrtzidis4e7064f2011-10-17 19:48:19 +0000468 const NamedDecl *getEntityDecl(const NamedDecl *D) const;
469
Argyrios Kyrtzidis2957e6f2011-11-22 07:24:51 +0000470 const DeclContext *getEntityContainer(const Decl *D) const;
471
Argyrios Kyrtzidisdd93c592011-11-11 00:23:36 +0000472 CXIdxClientFile getIndexFile(const FileEntry *File);
Argyrios Kyrtzidis4e7064f2011-10-17 19:48:19 +0000473
474 CXIdxLoc getIndexLoc(SourceLocation Loc) const;
475
Argyrios Kyrtzidis4e7064f2011-10-17 19:48:19 +0000476 void getEntityInfo(const NamedDecl *D,
Argyrios Kyrtzidis2957e6f2011-11-22 07:24:51 +0000477 EntityInfo &EntityInfo,
Argyrios Kyrtzidis643d3ce2011-12-15 00:05:00 +0000478 ScratchAlloc &SA);
Argyrios Kyrtzidis4e7064f2011-10-17 19:48:19 +0000479
Argyrios Kyrtzidis2957e6f2011-11-22 07:24:51 +0000480 void getContainerInfo(const DeclContext *DC, ContainerInfo &ContInfo);
481
Argyrios Kyrtzidisb395c632011-11-18 00:26:51 +0000482 CXCursor getCursor(const Decl *D) {
483 return cxcursor::MakeCXCursor(const_cast<Decl*>(D), CXTU);
Argyrios Kyrtzidis4e7064f2011-10-17 19:48:19 +0000484 }
485
486 CXCursor getRefCursor(const NamedDecl *D, SourceLocation Loc);
Argyrios Kyrtzidis2957e6f2011-11-22 07:24:51 +0000487
Argyrios Kyrtzidisd0890082012-02-07 22:46:16 +0000488 static bool shouldIgnoreIfImplicit(const Decl *D);
Argyrios Kyrtzidis4e7064f2011-10-17 19:48:19 +0000489};
490
Argyrios Kyrtzidis643d3ce2011-12-15 00:05:00 +0000491class ScratchAlloc {
492 IndexingContext &IdxCtx;
493
494public:
495 explicit ScratchAlloc(IndexingContext &indexCtx) : IdxCtx(indexCtx) {
496 ++IdxCtx.StrAdapterCount;
497 }
498
499 ~ScratchAlloc() {
500 --IdxCtx.StrAdapterCount;
501 if (IdxCtx.StrAdapterCount == 0)
502 IdxCtx.StrScratch.Reset();
503 }
504
505 const char *toCStr(StringRef Str);
506 const char *copyCStr(StringRef Str);
507
508 template <typename T>
509 T *allocate() {
510 return IdxCtx.StrScratch.Allocate<T>();
511 }
512};
513
Argyrios Kyrtzidis4e7064f2011-10-17 19:48:19 +0000514}} // end clang::cxindex
Argyrios Kyrtzidisc6b4a502011-11-16 02:34:59 +0000515
516namespace llvm {
517 /// Define DenseMapInfo so that FileID's can be used as keys in DenseMap and
518 /// DenseSets.
519 template <>
520 struct DenseMapInfo<clang::cxindex::RefFileOccurence> {
521 static inline clang::cxindex::RefFileOccurence getEmptyKey() {
522 return clang::cxindex::RefFileOccurence(0, 0);
523 }
524
525 static inline clang::cxindex::RefFileOccurence getTombstoneKey() {
526 return clang::cxindex::RefFileOccurence((const clang::FileEntry *)~0,
527 (const clang::Decl *)~0);
528 }
529
530 static unsigned getHashValue(clang::cxindex::RefFileOccurence S) {
531 llvm::FoldingSetNodeID ID;
532 ID.AddPointer(S.File);
533 ID.AddPointer(S.Dcl);
534 return ID.ComputeHash();
535 }
536
537 static bool isEqual(clang::cxindex::RefFileOccurence LHS,
538 clang::cxindex::RefFileOccurence RHS) {
539 return LHS.File == RHS.File && LHS.Dcl == RHS.Dcl;
540 }
541 };
542}