blob: 66c635d6b9b13fed76f1c752f34d8a39ed42a52c [file] [log] [blame]
Argyrios Kyrtzidis4e7064f2011-10-17 19:48:19 +00001//===- IndexingContext.h - Higher level API functions ------------------------===//
2//
3// The LLVM Compiler Infrastructure
4//
5// This file is distributed under the University of Illinois Open Source
6// License. See LICENSE.TXT for details.
7//
8//===----------------------------------------------------------------------===//
9
10#include "Index_Internal.h"
11#include "CXCursor.h"
12
Argyrios Kyrtzidis6ec43ad2011-11-12 02:16:30 +000013#include "clang/AST/DeclObjC.h"
Argyrios Kyrtzidis4e7064f2011-10-17 19:48:19 +000014#include "clang/AST/DeclGroup.h"
Argyrios Kyrtzidisc6b4a502011-11-16 02:34:59 +000015#include "llvm/ADT/DenseSet.h"
Argyrios Kyrtzidis4e7064f2011-10-17 19:48:19 +000016
17namespace clang {
18 class FileEntry;
19 class ObjCPropertyDecl;
Argyrios Kyrtzidis2957e6f2011-11-22 07:24:51 +000020 class ClassTemplateDecl;
21 class FunctionTemplateDecl;
22 class TypeAliasTemplateDecl;
Argyrios Kyrtzidis6d968362012-02-10 20:10:44 +000023 class ClassTemplateSpecializationDecl;
Argyrios Kyrtzidis4e7064f2011-10-17 19:48:19 +000024
25namespace cxindex {
26 class IndexingContext;
Argyrios Kyrtzidis643d3ce2011-12-15 00:05:00 +000027 class ScratchAlloc;
28 class AttrListInfo;
Argyrios Kyrtzidis4e7064f2011-10-17 19:48:19 +000029
Argyrios Kyrtzidis2957e6f2011-11-22 07:24:51 +000030struct EntityInfo : public CXIdxEntityInfo {
31 const NamedDecl *Dcl;
32 IndexingContext *IndexCtx;
Argyrios Kyrtzidis643d3ce2011-12-15 00:05:00 +000033 llvm::IntrusiveRefCntPtr<AttrListInfo> AttrList;
Argyrios Kyrtzidis37f40572011-11-23 20:27:26 +000034
35 EntityInfo() {
36 name = USR = 0;
Argyrios Kyrtzidis643d3ce2011-12-15 00:05:00 +000037 attributes = 0;
38 numAttributes = 0;
Argyrios Kyrtzidis37f40572011-11-23 20:27:26 +000039 }
Argyrios Kyrtzidis2957e6f2011-11-22 07:24:51 +000040};
41
42struct ContainerInfo : public CXIdxContainerInfo {
43 const DeclContext *DC;
44 IndexingContext *IndexCtx;
45};
46
Argyrios Kyrtzidisdd93c592011-11-11 00:23:36 +000047struct DeclInfo : public CXIdxDeclInfo {
Argyrios Kyrtzidisc71d5542011-11-14 22:39:19 +000048 enum DInfoKind {
49 Info_Decl,
50
51 Info_ObjCContainer,
52 Info_ObjCInterface,
53 Info_ObjCProtocol,
Argyrios Kyrtzidis2957e6f2011-11-22 07:24:51 +000054 Info_ObjCCategory,
55
56 Info_CXXClass
Argyrios Kyrtzidisc71d5542011-11-14 22:39:19 +000057 };
58
59 DInfoKind Kind;
60
Argyrios Kyrtzidis2957e6f2011-11-22 07:24:51 +000061 EntityInfo EntInfo;
Argyrios Kyrtzidisb1febb62011-12-07 20:44:19 +000062 ContainerInfo SemanticContainer;
63 ContainerInfo LexicalContainer;
Argyrios Kyrtzidis2957e6f2011-11-22 07:24:51 +000064 ContainerInfo DeclAsContainer;
65
Argyrios Kyrtzidisc71d5542011-11-14 22:39:19 +000066 DeclInfo(bool isRedeclaration, bool isDefinition, bool isContainer)
67 : Kind(Info_Decl) {
68 this->isRedeclaration = isRedeclaration;
69 this->isDefinition = isDefinition;
70 this->isContainer = isContainer;
Argyrios Kyrtzidisb395c632011-11-18 00:26:51 +000071 attributes = 0;
72 numAttributes = 0;
Argyrios Kyrtzidisb1febb62011-12-07 20:44:19 +000073 declAsContainer = semanticContainer = lexicalContainer = 0;
Argyrios Kyrtzidisc71d5542011-11-14 22:39:19 +000074 }
75 DeclInfo(DInfoKind K,
76 bool isRedeclaration, bool isDefinition, bool isContainer)
77 : Kind(K) {
78 this->isRedeclaration = isRedeclaration;
79 this->isDefinition = isDefinition;
80 this->isContainer = isContainer;
Argyrios Kyrtzidisb395c632011-11-18 00:26:51 +000081 attributes = 0;
82 numAttributes = 0;
Argyrios Kyrtzidisb1febb62011-12-07 20:44:19 +000083 declAsContainer = semanticContainer = lexicalContainer = 0;
Argyrios Kyrtzidisc71d5542011-11-14 22:39:19 +000084 }
85
86 static bool classof(const DeclInfo *) { return true; }
Argyrios Kyrtzidisdd93c592011-11-11 00:23:36 +000087};
88
Argyrios Kyrtzidisdd93c592011-11-11 00:23:36 +000089struct ObjCContainerDeclInfo : public DeclInfo {
Argyrios Kyrtzidis6ec43ad2011-11-12 02:16:30 +000090 CXIdxObjCContainerDeclInfo ObjCContDeclInfo;
Argyrios Kyrtzidisc71d5542011-11-14 22:39:19 +000091
92 ObjCContainerDeclInfo(bool isForwardRef,
93 bool isRedeclaration,
94 bool isImplementation)
95 : DeclInfo(Info_ObjCContainer, isRedeclaration,
96 /*isDefinition=*/!isForwardRef, /*isContainer=*/!isForwardRef) {
97 init(isForwardRef, isImplementation);
98 }
99 ObjCContainerDeclInfo(DInfoKind K,
100 bool isForwardRef,
101 bool isRedeclaration,
102 bool isImplementation)
103 : DeclInfo(K, isRedeclaration, /*isDefinition=*/!isForwardRef,
104 /*isContainer=*/!isForwardRef) {
105 init(isForwardRef, isImplementation);
106 }
107
108 static bool classof(const DeclInfo *D) {
109 return Info_ObjCContainer <= D->Kind && D->Kind <= Info_ObjCCategory;
110 }
111 static bool classof(const ObjCContainerDeclInfo *D) { return true; }
112
113private:
114 void init(bool isForwardRef, bool isImplementation) {
115 if (isForwardRef)
116 ObjCContDeclInfo.kind = CXIdxObjCContainer_ForwardRef;
117 else if (isImplementation)
118 ObjCContDeclInfo.kind = CXIdxObjCContainer_Implementation;
119 else
120 ObjCContDeclInfo.kind = CXIdxObjCContainer_Interface;
121 }
122};
123
124struct ObjCInterfaceDeclInfo : public ObjCContainerDeclInfo {
125 CXIdxObjCInterfaceDeclInfo ObjCInterDeclInfo;
126 CXIdxObjCProtocolRefListInfo ObjCProtoListInfo;
127
128 ObjCInterfaceDeclInfo(const ObjCInterfaceDecl *D)
129 : ObjCContainerDeclInfo(Info_ObjCInterface,
130 /*isForwardRef=*/false,
Douglas Gregoref96ee02012-01-14 16:38:05 +0000131 /*isRedeclaration=*/D->getPreviousDecl() != 0,
Argyrios Kyrtzidisc71d5542011-11-14 22:39:19 +0000132 /*isImplementation=*/false) { }
133
134 static bool classof(const DeclInfo *D) {
135 return D->Kind == Info_ObjCInterface;
136 }
137 static bool classof(const ObjCInterfaceDeclInfo *D) { return true; }
138};
139
140struct ObjCProtocolDeclInfo : public ObjCContainerDeclInfo {
141 CXIdxObjCProtocolRefListInfo ObjCProtoRefListInfo;
142
143 ObjCProtocolDeclInfo(const ObjCProtocolDecl *D)
144 : ObjCContainerDeclInfo(Info_ObjCProtocol,
145 /*isForwardRef=*/false,
Douglas Gregoref96ee02012-01-14 16:38:05 +0000146 /*isRedeclaration=*/D->getPreviousDecl(),
Argyrios Kyrtzidisc71d5542011-11-14 22:39:19 +0000147 /*isImplementation=*/false) { }
148
149 static bool classof(const DeclInfo *D) {
150 return D->Kind == Info_ObjCProtocol;
151 }
152 static bool classof(const ObjCProtocolDeclInfo *D) { return true; }
Argyrios Kyrtzidisdd93c592011-11-11 00:23:36 +0000153};
154
155struct ObjCCategoryDeclInfo : public ObjCContainerDeclInfo {
Argyrios Kyrtzidis6ec43ad2011-11-12 02:16:30 +0000156 CXIdxObjCCategoryDeclInfo ObjCCatDeclInfo;
Argyrios Kyrtzidisc10a4c82011-12-13 18:47:45 +0000157 CXIdxObjCProtocolRefListInfo ObjCProtoListInfo;
Argyrios Kyrtzidis6ec43ad2011-11-12 02:16:30 +0000158
Argyrios Kyrtzidisc71d5542011-11-14 22:39:19 +0000159 explicit ObjCCategoryDeclInfo(bool isImplementation)
160 : ObjCContainerDeclInfo(Info_ObjCCategory,
161 /*isForwardRef=*/false,
162 /*isRedeclaration=*/isImplementation,
163 /*isImplementation=*/isImplementation) { }
Argyrios Kyrtzidis6ec43ad2011-11-12 02:16:30 +0000164
Argyrios Kyrtzidisc71d5542011-11-14 22:39:19 +0000165 static bool classof(const DeclInfo *D) {
166 return D->Kind == Info_ObjCCategory;
167 }
168 static bool classof(const ObjCCategoryDeclInfo *D) { return true; }
Argyrios Kyrtzidisdd93c592011-11-11 00:23:36 +0000169};
170
Argyrios Kyrtzidis2957e6f2011-11-22 07:24:51 +0000171struct CXXClassDeclInfo : public DeclInfo {
172 CXIdxCXXClassDeclInfo CXXClassInfo;
173
174 CXXClassDeclInfo(bool isRedeclaration, bool isDefinition)
175 : DeclInfo(Info_CXXClass, isRedeclaration, isDefinition, isDefinition) { }
176
177 static bool classof(const DeclInfo *D) {
178 return D->Kind == Info_CXXClass;
179 }
180 static bool classof(const CXXClassDeclInfo *D) { return true; }
181};
182
Argyrios Kyrtzidisb395c632011-11-18 00:26:51 +0000183struct AttrInfo : public CXIdxAttrInfo {
184 const Attr *A;
185
186 AttrInfo(CXIdxAttrKind Kind, CXCursor C, CXIdxLoc Loc, const Attr *A) {
187 kind = Kind;
188 cursor = C;
189 loc = Loc;
190 this->A = A;
191 }
192
193 static bool classof(const AttrInfo *) { return true; }
194};
195
196struct IBOutletCollectionInfo : public AttrInfo {
Argyrios Kyrtzidis2957e6f2011-11-22 07:24:51 +0000197 EntityInfo ClassInfo;
Argyrios Kyrtzidisb395c632011-11-18 00:26:51 +0000198 CXIdxIBOutletCollectionAttrInfo IBCollInfo;
199
200 IBOutletCollectionInfo(CXCursor C, CXIdxLoc Loc, const Attr *A) :
201 AttrInfo(CXIdxAttr_IBOutletCollection, C, Loc, A) {
202 assert(C.kind == CXCursor_IBOutletCollectionAttr);
Argyrios Kyrtzidis643d3ce2011-12-15 00:05:00 +0000203 IBCollInfo.objcClass = 0;
Argyrios Kyrtzidisb395c632011-11-18 00:26:51 +0000204 }
205
Argyrios Kyrtzidis643d3ce2011-12-15 00:05:00 +0000206 IBOutletCollectionInfo(const IBOutletCollectionInfo &other);
207
Argyrios Kyrtzidisb395c632011-11-18 00:26:51 +0000208 static bool classof(const AttrInfo *A) {
209 return A->kind == CXIdxAttr_IBOutletCollection;
210 }
211 static bool classof(const IBOutletCollectionInfo *D) { return true; }
212};
213
Argyrios Kyrtzidis643d3ce2011-12-15 00:05:00 +0000214class AttrListInfo {
215 SmallVector<AttrInfo, 2> Attrs;
216 SmallVector<IBOutletCollectionInfo, 2> IBCollAttrs;
217 SmallVector<CXIdxAttrInfo *, 2> CXAttrs;
218 unsigned ref_cnt;
219
220public:
221 AttrListInfo(const Decl *D,
222 IndexingContext &IdxCtx,
223 ScratchAlloc &SA);
224 AttrListInfo(const AttrListInfo &other);
225
226 const CXIdxAttrInfo *const *getAttrs() const {
227 if (CXAttrs.empty())
228 return 0;
229 return CXAttrs.data();
230 }
231 unsigned getNumAttrs() const { return (unsigned)CXAttrs.size(); }
232
233 /// \brief Retain/Release only useful when we allocate a AttrListInfo from the
234 /// BumpPtrAllocator, and not from the stack; so that we keep a pointer
235 // in the EntityInfo
236 void Retain() { ++ref_cnt; }
237 void Release() {
238 assert (ref_cnt > 0 && "Reference count is already zero.");
239 if (--ref_cnt == 0) {
240 // Memory is allocated from a BumpPtrAllocator, no need to delete it.
241 this->~AttrListInfo();
242 }
243 }
244};
245
Argyrios Kyrtzidisc6b4a502011-11-16 02:34:59 +0000246struct RefFileOccurence {
247 const FileEntry *File;
248 const Decl *Dcl;
249
250 RefFileOccurence(const FileEntry *File, const Decl *Dcl)
251 : File(File), Dcl(Dcl) { }
252};
253
Argyrios Kyrtzidis4e7064f2011-10-17 19:48:19 +0000254class IndexingContext {
255 ASTContext *Ctx;
256 CXClientData ClientData;
257 IndexerCallbacks &CB;
258 unsigned IndexOptions;
259 CXTranslationUnit CXTU;
260
Argyrios Kyrtzidisdd93c592011-11-11 00:23:36 +0000261 typedef llvm::DenseMap<const FileEntry *, CXIdxClientFile> FileMapTy;
Argyrios Kyrtzidis2957e6f2011-11-22 07:24:51 +0000262 typedef llvm::DenseMap<const DeclContext *, CXIdxClientContainer>
263 ContainerMapTy;
264 typedef llvm::DenseMap<const Decl *, CXIdxClientEntity> EntityMapTy;
265
Argyrios Kyrtzidis4e7064f2011-10-17 19:48:19 +0000266 FileMapTy FileMap;
Argyrios Kyrtzidis4e7064f2011-10-17 19:48:19 +0000267 ContainerMapTy ContainerMap;
Argyrios Kyrtzidis2957e6f2011-11-22 07:24:51 +0000268 EntityMapTy EntityMap;
Argyrios Kyrtzidis4e7064f2011-10-17 19:48:19 +0000269
Argyrios Kyrtzidisc6b4a502011-11-16 02:34:59 +0000270 llvm::DenseSet<RefFileOccurence> RefFileOccurences;
271
Argyrios Kyrtzidis4e7064f2011-10-17 19:48:19 +0000272 SmallVector<DeclGroupRef, 8> TUDeclsInObjCContainer;
273
Argyrios Kyrtzidis37f40572011-11-23 20:27:26 +0000274 llvm::BumpPtrAllocator StrScratch;
Argyrios Kyrtzidisdd93c592011-11-11 00:23:36 +0000275 unsigned StrAdapterCount;
Argyrios Kyrtzidis643d3ce2011-12-15 00:05:00 +0000276 friend class ScratchAlloc;
Argyrios Kyrtzidis4e7064f2011-10-17 19:48:19 +0000277
Argyrios Kyrtzidis6ec43ad2011-11-12 02:16:30 +0000278 struct ObjCProtocolListInfo {
279 SmallVector<CXIdxObjCProtocolRefInfo, 4> ProtInfos;
Argyrios Kyrtzidis2957e6f2011-11-22 07:24:51 +0000280 SmallVector<EntityInfo, 4> ProtEntities;
Argyrios Kyrtzidis6ec43ad2011-11-12 02:16:30 +0000281 SmallVector<CXIdxObjCProtocolRefInfo *, 4> Prots;
282
Argyrios Kyrtzidisb395c632011-11-18 00:26:51 +0000283 CXIdxObjCProtocolRefListInfo getListInfo() const {
Argyrios Kyrtzidisc71d5542011-11-14 22:39:19 +0000284 CXIdxObjCProtocolRefListInfo Info = { Prots.data(),
285 (unsigned)Prots.size() };
286 return Info;
287 }
Argyrios Kyrtzidis6ec43ad2011-11-12 02:16:30 +0000288
289 ObjCProtocolListInfo(const ObjCProtocolList &ProtList,
290 IndexingContext &IdxCtx,
Argyrios Kyrtzidis643d3ce2011-12-15 00:05:00 +0000291 ScratchAlloc &SA);
Argyrios Kyrtzidis2957e6f2011-11-22 07:24:51 +0000292 };
293
294 struct CXXBasesListInfo {
295 SmallVector<CXIdxBaseClassInfo, 4> BaseInfos;
296 SmallVector<EntityInfo, 4> BaseEntities;
297 SmallVector<CXIdxBaseClassInfo *, 4> CXBases;
298
299 const CXIdxBaseClassInfo *const *getBases() const {
300 return CXBases.data();
301 }
302 unsigned getNumBases() const { return (unsigned)CXBases.size(); }
303
304 CXXBasesListInfo(const CXXRecordDecl *D,
Argyrios Kyrtzidis643d3ce2011-12-15 00:05:00 +0000305 IndexingContext &IdxCtx, ScratchAlloc &SA);
Argyrios Kyrtzidisb526a872011-12-07 20:44:15 +0000306
307 private:
308 SourceLocation getBaseLoc(const CXXBaseSpecifier &Base) const;
Argyrios Kyrtzidis2957e6f2011-11-22 07:24:51 +0000309 };
Argyrios Kyrtzidisb395c632011-11-18 00:26:51 +0000310
Argyrios Kyrtzidis643d3ce2011-12-15 00:05:00 +0000311 friend class AttrListInfo;
312
Argyrios Kyrtzidis4e7064f2011-10-17 19:48:19 +0000313public:
314 IndexingContext(CXClientData clientData, IndexerCallbacks &indexCallbacks,
315 unsigned indexOptions, CXTranslationUnit cxTU)
316 : Ctx(0), ClientData(clientData), CB(indexCallbacks),
Argyrios Kyrtzidis37f40572011-11-23 20:27:26 +0000317 IndexOptions(indexOptions), CXTU(cxTU),
318 StrScratch(/*size=*/1024), StrAdapterCount(0) { }
Argyrios Kyrtzidis4e7064f2011-10-17 19:48:19 +0000319
320 ASTContext &getASTContext() const { return *Ctx; }
321
322 void setASTContext(ASTContext &ctx);
Argyrios Kyrtzidis7fe90f32012-01-17 18:48:07 +0000323 void setPreprocessor(Preprocessor &PP);
Argyrios Kyrtzidis4e7064f2011-10-17 19:48:19 +0000324
Argyrios Kyrtzidis58d2dbe2012-02-14 22:23:11 +0000325 bool shouldSuppressRefs() const {
Argyrios Kyrtzidisb395c632011-11-18 00:26:51 +0000326 return IndexOptions & CXIndexOpt_SuppressRedundantRefs;
Argyrios Kyrtzidisc6b4a502011-11-16 02:34:59 +0000327 }
328
Argyrios Kyrtzidis58d2dbe2012-02-14 22:23:11 +0000329 bool shouldIndexFunctionLocalSymbols() const {
Argyrios Kyrtzidis22490742012-01-14 00:11:49 +0000330 return IndexOptions & CXIndexOpt_IndexFunctionLocalSymbols;
331 }
332
Argyrios Kyrtzidis58d2dbe2012-02-14 22:23:11 +0000333 bool shouldIndexImplicitTemplateInsts() const {
334 return IndexOptions & CXIndexOpt_IndexImplicitTemplateInstantiations;
335 }
336
Argyrios Kyrtzidisb395c632011-11-18 00:26:51 +0000337 bool shouldAbort();
338
Argyrios Kyrtzidis996e6e52011-12-01 02:42:50 +0000339 bool hasDiagnosticCallback() const { return CB.diagnostic; }
340
Argyrios Kyrtzidisdd93c592011-11-11 00:23:36 +0000341 void enteredMainFile(const FileEntry *File);
342
Argyrios Kyrtzidis4e7064f2011-10-17 19:48:19 +0000343 void ppIncludedFile(SourceLocation hashLoc,
344 StringRef filename, const FileEntry *File,
345 bool isImport, bool isAngled);
346
Argyrios Kyrtzidis6ec43ad2011-11-12 02:16:30 +0000347 void startedTranslationUnit();
Argyrios Kyrtzidis4e7064f2011-10-17 19:48:19 +0000348
349 void indexDecl(const Decl *D);
350
351 void indexTagDecl(const TagDecl *D);
352
353 void indexTypeSourceInfo(TypeSourceInfo *TInfo, const NamedDecl *Parent,
354 const DeclContext *DC = 0);
355
356 void indexTypeLoc(TypeLoc TL, const NamedDecl *Parent,
Argyrios Kyrtzidise422e452011-12-13 18:47:41 +0000357 const DeclContext *DC = 0);
358
359 void indexNestedNameSpecifierLoc(NestedNameSpecifierLoc NNS,
360 const NamedDecl *Parent,
361 const DeclContext *DC = 0);
Argyrios Kyrtzidis4e7064f2011-10-17 19:48:19 +0000362
363 void indexDeclContext(const DeclContext *DC);
364
Argyrios Kyrtzidise422e452011-12-13 18:47:41 +0000365 void indexBody(const Stmt *S, const NamedDecl *Parent,
366 const DeclContext *DC = 0);
Argyrios Kyrtzidis4e7064f2011-10-17 19:48:19 +0000367
Argyrios Kyrtzidisb395c632011-11-18 00:26:51 +0000368 void handleDiagnosticSet(CXDiagnosticSet CXDiagSet);
Argyrios Kyrtzidis4e7064f2011-10-17 19:48:19 +0000369
Argyrios Kyrtzidisb395c632011-11-18 00:26:51 +0000370 bool handleFunction(const FunctionDecl *FD);
Argyrios Kyrtzidis4e7064f2011-10-17 19:48:19 +0000371
Argyrios Kyrtzidisb395c632011-11-18 00:26:51 +0000372 bool handleVar(const VarDecl *D);
Argyrios Kyrtzidis4e7064f2011-10-17 19:48:19 +0000373
Argyrios Kyrtzidisb395c632011-11-18 00:26:51 +0000374 bool handleField(const FieldDecl *D);
Argyrios Kyrtzidis4e7064f2011-10-17 19:48:19 +0000375
Argyrios Kyrtzidisb395c632011-11-18 00:26:51 +0000376 bool handleEnumerator(const EnumConstantDecl *D);
Argyrios Kyrtzidis4e7064f2011-10-17 19:48:19 +0000377
Argyrios Kyrtzidisb395c632011-11-18 00:26:51 +0000378 bool handleTagDecl(const TagDecl *D);
Argyrios Kyrtzidis4e7064f2011-10-17 19:48:19 +0000379
Argyrios Kyrtzidis2957e6f2011-11-22 07:24:51 +0000380 bool handleTypedefName(const TypedefNameDecl *D);
Argyrios Kyrtzidis4e7064f2011-10-17 19:48:19 +0000381
Argyrios Kyrtzidisb395c632011-11-18 00:26:51 +0000382 bool handleObjCInterface(const ObjCInterfaceDecl *D);
383 bool handleObjCImplementation(const ObjCImplementationDecl *D);
Argyrios Kyrtzidis4e7064f2011-10-17 19:48:19 +0000384
Argyrios Kyrtzidisb395c632011-11-18 00:26:51 +0000385 bool handleObjCProtocol(const ObjCProtocolDecl *D);
Argyrios Kyrtzidis4e7064f2011-10-17 19:48:19 +0000386
Argyrios Kyrtzidisb395c632011-11-18 00:26:51 +0000387 bool handleObjCCategory(const ObjCCategoryDecl *D);
388 bool handleObjCCategoryImpl(const ObjCCategoryImplDecl *D);
Argyrios Kyrtzidis4e7064f2011-10-17 19:48:19 +0000389
Argyrios Kyrtzidisb395c632011-11-18 00:26:51 +0000390 bool handleObjCMethod(const ObjCMethodDecl *D);
Argyrios Kyrtzidis4e7064f2011-10-17 19:48:19 +0000391
Argyrios Kyrtzidisb395c632011-11-18 00:26:51 +0000392 bool handleSynthesizedObjCProperty(const ObjCPropertyImplDecl *D);
393 bool handleSynthesizedObjCMethod(const ObjCMethodDecl *D, SourceLocation Loc);
Argyrios Kyrtzidis4e7064f2011-10-17 19:48:19 +0000394
Argyrios Kyrtzidisb395c632011-11-18 00:26:51 +0000395 bool handleObjCProperty(const ObjCPropertyDecl *D);
396
Argyrios Kyrtzidis68478b02011-12-07 05:52:06 +0000397 bool handleNamespace(const NamespaceDecl *D);
398
Argyrios Kyrtzidis2957e6f2011-11-22 07:24:51 +0000399 bool handleClassTemplate(const ClassTemplateDecl *D);
400 bool handleFunctionTemplate(const FunctionTemplateDecl *D);
401 bool handleTypeAliasTemplate(const TypeAliasTemplateDecl *D);
402
Argyrios Kyrtzidisb395c632011-11-18 00:26:51 +0000403 bool handleReference(const NamedDecl *D, SourceLocation Loc, CXCursor Cursor,
404 const NamedDecl *Parent,
405 const DeclContext *DC,
406 const Expr *E = 0,
407 CXIdxEntityRefKind Kind = CXIdxEntityRef_Direct);
408
409 bool handleReference(const NamedDecl *D, SourceLocation Loc,
Argyrios Kyrtzidis4e7064f2011-10-17 19:48:19 +0000410 const NamedDecl *Parent,
411 const DeclContext *DC,
Argyrios Kyrtzidisaca19be2011-10-18 15:50:50 +0000412 const Expr *E = 0,
413 CXIdxEntityRefKind Kind = CXIdxEntityRef_Direct);
Argyrios Kyrtzidis4e7064f2011-10-17 19:48:19 +0000414
415 bool isNotFromSourceFile(SourceLocation Loc) const;
416
Argyrios Kyrtzidis21ee5702011-11-15 06:20:16 +0000417 void indexTopLevelDecl(Decl *D);
Argyrios Kyrtzidis4e7064f2011-10-17 19:48:19 +0000418 void indexTUDeclsInObjCContainer();
419 void indexDeclGroupRef(DeclGroupRef DG);
420
421 void addTUDeclInObjCContainer(DeclGroupRef DG) {
422 TUDeclsInObjCContainer.push_back(DG);
423 }
424
Argyrios Kyrtzidisdd93c592011-11-11 00:23:36 +0000425 void translateLoc(SourceLocation Loc, CXIdxClientFile *indexFile, CXFile *file,
Argyrios Kyrtzidis4e7064f2011-10-17 19:48:19 +0000426 unsigned *line, unsigned *column, unsigned *offset);
427
Argyrios Kyrtzidis2957e6f2011-11-22 07:24:51 +0000428 CXIdxClientContainer getClientContainerForDC(const DeclContext *DC) const;
429 void addContainerInMap(const DeclContext *DC, CXIdxClientContainer container);
430
431 CXIdxClientEntity getClientEntity(const Decl *D) const;
432 void setClientEntity(const Decl *D, CXIdxClientEntity client);
433
Argyrios Kyrtzidis6d968362012-02-10 20:10:44 +0000434 static bool isTemplateImplicitInstantiation(const Decl *D);
435
Argyrios Kyrtzidis4e7064f2011-10-17 19:48:19 +0000436private:
Argyrios Kyrtzidisb395c632011-11-18 00:26:51 +0000437 bool handleDecl(const NamedDecl *D,
Argyrios Kyrtzidisdd93c592011-11-11 00:23:36 +0000438 SourceLocation Loc, CXCursor Cursor,
Argyrios Kyrtzidisdd93c592011-11-11 00:23:36 +0000439 DeclInfo &DInfo);
Argyrios Kyrtzidis4e7064f2011-10-17 19:48:19 +0000440
Argyrios Kyrtzidisb395c632011-11-18 00:26:51 +0000441 bool handleObjCContainer(const ObjCContainerDecl *D,
Argyrios Kyrtzidisdd93c592011-11-11 00:23:36 +0000442 SourceLocation Loc, CXCursor Cursor,
Argyrios Kyrtzidisdd93c592011-11-11 00:23:36 +0000443 ObjCContainerDeclInfo &ContDInfo);
Argyrios Kyrtzidis4e7064f2011-10-17 19:48:19 +0000444
Argyrios Kyrtzidis2957e6f2011-11-22 07:24:51 +0000445 bool handleCXXRecordDecl(const CXXRecordDecl *RD, const NamedDecl *OrigD);
Argyrios Kyrtzidisdd93c592011-11-11 00:23:36 +0000446
Argyrios Kyrtzidisb395c632011-11-18 00:26:51 +0000447 bool markEntityOccurrenceInFile(const NamedDecl *D, SourceLocation Loc);
448
Argyrios Kyrtzidis4e7064f2011-10-17 19:48:19 +0000449 const NamedDecl *getEntityDecl(const NamedDecl *D) const;
450
Argyrios Kyrtzidis2957e6f2011-11-22 07:24:51 +0000451 const DeclContext *getEntityContainer(const Decl *D) const;
452
Argyrios Kyrtzidisdd93c592011-11-11 00:23:36 +0000453 CXIdxClientFile getIndexFile(const FileEntry *File);
Argyrios Kyrtzidis4e7064f2011-10-17 19:48:19 +0000454
455 CXIdxLoc getIndexLoc(SourceLocation Loc) const;
456
Argyrios Kyrtzidis4e7064f2011-10-17 19:48:19 +0000457 void getEntityInfo(const NamedDecl *D,
Argyrios Kyrtzidis2957e6f2011-11-22 07:24:51 +0000458 EntityInfo &EntityInfo,
Argyrios Kyrtzidis643d3ce2011-12-15 00:05:00 +0000459 ScratchAlloc &SA);
Argyrios Kyrtzidis4e7064f2011-10-17 19:48:19 +0000460
Argyrios Kyrtzidis2957e6f2011-11-22 07:24:51 +0000461 void getContainerInfo(const DeclContext *DC, ContainerInfo &ContInfo);
462
Argyrios Kyrtzidisb395c632011-11-18 00:26:51 +0000463 CXCursor getCursor(const Decl *D) {
464 return cxcursor::MakeCXCursor(const_cast<Decl*>(D), CXTU);
Argyrios Kyrtzidis4e7064f2011-10-17 19:48:19 +0000465 }
466
467 CXCursor getRefCursor(const NamedDecl *D, SourceLocation Loc);
Argyrios Kyrtzidis2957e6f2011-11-22 07:24:51 +0000468
Argyrios Kyrtzidisd0890082012-02-07 22:46:16 +0000469 static bool shouldIgnoreIfImplicit(const Decl *D);
Argyrios Kyrtzidis4e7064f2011-10-17 19:48:19 +0000470};
471
Argyrios Kyrtzidis643d3ce2011-12-15 00:05:00 +0000472class ScratchAlloc {
473 IndexingContext &IdxCtx;
474
475public:
476 explicit ScratchAlloc(IndexingContext &indexCtx) : IdxCtx(indexCtx) {
477 ++IdxCtx.StrAdapterCount;
478 }
479
480 ~ScratchAlloc() {
481 --IdxCtx.StrAdapterCount;
482 if (IdxCtx.StrAdapterCount == 0)
483 IdxCtx.StrScratch.Reset();
484 }
485
486 const char *toCStr(StringRef Str);
487 const char *copyCStr(StringRef Str);
488
489 template <typename T>
490 T *allocate() {
491 return IdxCtx.StrScratch.Allocate<T>();
492 }
493};
494
Argyrios Kyrtzidis4e7064f2011-10-17 19:48:19 +0000495}} // end clang::cxindex
Argyrios Kyrtzidisc6b4a502011-11-16 02:34:59 +0000496
497namespace llvm {
498 /// Define DenseMapInfo so that FileID's can be used as keys in DenseMap and
499 /// DenseSets.
500 template <>
501 struct DenseMapInfo<clang::cxindex::RefFileOccurence> {
502 static inline clang::cxindex::RefFileOccurence getEmptyKey() {
503 return clang::cxindex::RefFileOccurence(0, 0);
504 }
505
506 static inline clang::cxindex::RefFileOccurence getTombstoneKey() {
507 return clang::cxindex::RefFileOccurence((const clang::FileEntry *)~0,
508 (const clang::Decl *)~0);
509 }
510
511 static unsigned getHashValue(clang::cxindex::RefFileOccurence S) {
512 llvm::FoldingSetNodeID ID;
513 ID.AddPointer(S.File);
514 ID.AddPointer(S.Dcl);
515 return ID.ComputeHash();
516 }
517
518 static bool isEqual(clang::cxindex::RefFileOccurence LHS,
519 clang::cxindex::RefFileOccurence RHS) {
520 return LHS.File == RHS.File && LHS.Dcl == RHS.Dcl;
521 }
522 };
523}