blob: 0fc7238ee23d03421383d8e5fa6a0734ae6478ec [file] [log] [blame]
Nick Lewyckyeb86dcc2012-10-29 06:02:59 +00001//===- IndexingContext.h - Higher level API functions -----------*- C++ -*-===//
Argyrios Kyrtzidis4e7064f2011-10-17 19:48:19 +00002//
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 AttrListInfo;
Argyrios Kyrtzidis4e7064f2011-10-17 19:48:19 +000029
Argyrios Kyrtzidisd786f1a2012-03-31 01:14:06 +000030class ScratchAlloc {
31 IndexingContext &IdxCtx;
32
33public:
34 explicit ScratchAlloc(IndexingContext &indexCtx);
35 ScratchAlloc(const ScratchAlloc &SA);
36
37 ~ScratchAlloc();
38
39 const char *toCStr(StringRef Str);
40 const char *copyCStr(StringRef Str);
41
42 template <typename T>
43 T *allocate();
44};
45
Argyrios Kyrtzidis2957e6f2011-11-22 07:24:51 +000046struct EntityInfo : public CXIdxEntityInfo {
47 const NamedDecl *Dcl;
48 IndexingContext *IndexCtx;
Dylan Noblesmithc93dc782012-02-20 14:00:23 +000049 IntrusiveRefCntPtr<AttrListInfo> AttrList;
Argyrios Kyrtzidis37f40572011-11-23 20:27:26 +000050
51 EntityInfo() {
52 name = USR = 0;
Argyrios Kyrtzidis643d3ce2011-12-15 00:05:00 +000053 attributes = 0;
54 numAttributes = 0;
Argyrios Kyrtzidis37f40572011-11-23 20:27:26 +000055 }
Argyrios Kyrtzidis2957e6f2011-11-22 07:24:51 +000056};
57
58struct ContainerInfo : public CXIdxContainerInfo {
59 const DeclContext *DC;
60 IndexingContext *IndexCtx;
61};
62
Argyrios Kyrtzidisdd93c592011-11-11 00:23:36 +000063struct DeclInfo : public CXIdxDeclInfo {
Argyrios Kyrtzidisc71d5542011-11-14 22:39:19 +000064 enum DInfoKind {
65 Info_Decl,
66
67 Info_ObjCContainer,
68 Info_ObjCInterface,
69 Info_ObjCProtocol,
Argyrios Kyrtzidis2957e6f2011-11-22 07:24:51 +000070 Info_ObjCCategory,
71
Argyrios Kyrtzidis792db262012-02-28 17:50:33 +000072 Info_ObjCProperty,
73
Argyrios Kyrtzidis2957e6f2011-11-22 07:24:51 +000074 Info_CXXClass
Argyrios Kyrtzidisc71d5542011-11-14 22:39:19 +000075 };
76
77 DInfoKind Kind;
78
Argyrios Kyrtzidis2957e6f2011-11-22 07:24:51 +000079 EntityInfo EntInfo;
Argyrios Kyrtzidisb1febb62011-12-07 20:44:19 +000080 ContainerInfo SemanticContainer;
81 ContainerInfo LexicalContainer;
Argyrios Kyrtzidis2957e6f2011-11-22 07:24:51 +000082 ContainerInfo DeclAsContainer;
83
Argyrios Kyrtzidisc71d5542011-11-14 22:39:19 +000084 DeclInfo(bool isRedeclaration, bool isDefinition, bool isContainer)
85 : Kind(Info_Decl) {
86 this->isRedeclaration = isRedeclaration;
87 this->isDefinition = isDefinition;
88 this->isContainer = isContainer;
Argyrios Kyrtzidisb395c632011-11-18 00:26:51 +000089 attributes = 0;
90 numAttributes = 0;
Argyrios Kyrtzidisb1febb62011-12-07 20:44:19 +000091 declAsContainer = semanticContainer = lexicalContainer = 0;
Argyrios Kyrtzidisc71d5542011-11-14 22:39:19 +000092 }
93 DeclInfo(DInfoKind K,
94 bool isRedeclaration, bool isDefinition, bool isContainer)
95 : Kind(K) {
96 this->isRedeclaration = isRedeclaration;
97 this->isDefinition = isDefinition;
98 this->isContainer = isContainer;
Argyrios Kyrtzidisb395c632011-11-18 00:26:51 +000099 attributes = 0;
100 numAttributes = 0;
Argyrios Kyrtzidisb1febb62011-12-07 20:44:19 +0000101 declAsContainer = semanticContainer = lexicalContainer = 0;
Argyrios Kyrtzidisc71d5542011-11-14 22:39:19 +0000102 }
Argyrios Kyrtzidisdd93c592011-11-11 00:23:36 +0000103};
104
Argyrios Kyrtzidisdd93c592011-11-11 00:23:36 +0000105struct ObjCContainerDeclInfo : public DeclInfo {
Argyrios Kyrtzidis6ec43ad2011-11-12 02:16:30 +0000106 CXIdxObjCContainerDeclInfo ObjCContDeclInfo;
Argyrios Kyrtzidisc71d5542011-11-14 22:39:19 +0000107
108 ObjCContainerDeclInfo(bool isForwardRef,
109 bool isRedeclaration,
110 bool isImplementation)
111 : DeclInfo(Info_ObjCContainer, isRedeclaration,
112 /*isDefinition=*/!isForwardRef, /*isContainer=*/!isForwardRef) {
113 init(isForwardRef, isImplementation);
114 }
115 ObjCContainerDeclInfo(DInfoKind K,
116 bool isForwardRef,
117 bool isRedeclaration,
118 bool isImplementation)
119 : DeclInfo(K, isRedeclaration, /*isDefinition=*/!isForwardRef,
120 /*isContainer=*/!isForwardRef) {
121 init(isForwardRef, isImplementation);
122 }
123
124 static bool classof(const DeclInfo *D) {
125 return Info_ObjCContainer <= D->Kind && D->Kind <= Info_ObjCCategory;
126 }
Argyrios Kyrtzidisc71d5542011-11-14 22:39:19 +0000127
128private:
129 void init(bool isForwardRef, bool isImplementation) {
130 if (isForwardRef)
131 ObjCContDeclInfo.kind = CXIdxObjCContainer_ForwardRef;
132 else if (isImplementation)
133 ObjCContDeclInfo.kind = CXIdxObjCContainer_Implementation;
134 else
135 ObjCContDeclInfo.kind = CXIdxObjCContainer_Interface;
136 }
137};
138
139struct ObjCInterfaceDeclInfo : public ObjCContainerDeclInfo {
140 CXIdxObjCInterfaceDeclInfo ObjCInterDeclInfo;
141 CXIdxObjCProtocolRefListInfo ObjCProtoListInfo;
142
143 ObjCInterfaceDeclInfo(const ObjCInterfaceDecl *D)
144 : ObjCContainerDeclInfo(Info_ObjCInterface,
145 /*isForwardRef=*/false,
Douglas Gregoref96ee02012-01-14 16:38:05 +0000146 /*isRedeclaration=*/D->getPreviousDecl() != 0,
Argyrios Kyrtzidisc71d5542011-11-14 22:39:19 +0000147 /*isImplementation=*/false) { }
148
149 static bool classof(const DeclInfo *D) {
150 return D->Kind == Info_ObjCInterface;
151 }
Argyrios Kyrtzidisc71d5542011-11-14 22:39:19 +0000152};
153
154struct ObjCProtocolDeclInfo : public ObjCContainerDeclInfo {
155 CXIdxObjCProtocolRefListInfo ObjCProtoRefListInfo;
156
157 ObjCProtocolDeclInfo(const ObjCProtocolDecl *D)
158 : ObjCContainerDeclInfo(Info_ObjCProtocol,
159 /*isForwardRef=*/false,
Douglas Gregoref96ee02012-01-14 16:38:05 +0000160 /*isRedeclaration=*/D->getPreviousDecl(),
Argyrios Kyrtzidisc71d5542011-11-14 22:39:19 +0000161 /*isImplementation=*/false) { }
162
163 static bool classof(const DeclInfo *D) {
164 return D->Kind == Info_ObjCProtocol;
165 }
Argyrios Kyrtzidisdd93c592011-11-11 00:23:36 +0000166};
167
168struct ObjCCategoryDeclInfo : public ObjCContainerDeclInfo {
Argyrios Kyrtzidis6ec43ad2011-11-12 02:16:30 +0000169 CXIdxObjCCategoryDeclInfo ObjCCatDeclInfo;
Argyrios Kyrtzidisc10a4c82011-12-13 18:47:45 +0000170 CXIdxObjCProtocolRefListInfo ObjCProtoListInfo;
Argyrios Kyrtzidis6ec43ad2011-11-12 02:16:30 +0000171
Argyrios Kyrtzidisc71d5542011-11-14 22:39:19 +0000172 explicit ObjCCategoryDeclInfo(bool isImplementation)
173 : ObjCContainerDeclInfo(Info_ObjCCategory,
174 /*isForwardRef=*/false,
175 /*isRedeclaration=*/isImplementation,
176 /*isImplementation=*/isImplementation) { }
Argyrios Kyrtzidis6ec43ad2011-11-12 02:16:30 +0000177
Argyrios Kyrtzidisc71d5542011-11-14 22:39:19 +0000178 static bool classof(const DeclInfo *D) {
179 return D->Kind == Info_ObjCCategory;
180 }
Argyrios Kyrtzidisdd93c592011-11-11 00:23:36 +0000181};
182
Argyrios Kyrtzidis792db262012-02-28 17:50:33 +0000183struct ObjCPropertyDeclInfo : public DeclInfo {
184 CXIdxObjCPropertyDeclInfo ObjCPropDeclInfo;
185
186 ObjCPropertyDeclInfo()
187 : DeclInfo(Info_ObjCProperty,
188 /*isRedeclaration=*/false, /*isDefinition=*/false,
189 /*isContainer=*/false) { }
190
191 static bool classof(const DeclInfo *D) {
192 return D->Kind == Info_ObjCProperty;
193 }
Argyrios Kyrtzidis792db262012-02-28 17:50:33 +0000194};
195
Argyrios Kyrtzidis2957e6f2011-11-22 07:24:51 +0000196struct CXXClassDeclInfo : public DeclInfo {
197 CXIdxCXXClassDeclInfo CXXClassInfo;
198
199 CXXClassDeclInfo(bool isRedeclaration, bool isDefinition)
200 : DeclInfo(Info_CXXClass, isRedeclaration, isDefinition, isDefinition) { }
201
202 static bool classof(const DeclInfo *D) {
203 return D->Kind == Info_CXXClass;
204 }
Argyrios Kyrtzidis2957e6f2011-11-22 07:24:51 +0000205};
206
Argyrios Kyrtzidisb395c632011-11-18 00:26:51 +0000207struct AttrInfo : public CXIdxAttrInfo {
208 const Attr *A;
209
210 AttrInfo(CXIdxAttrKind Kind, CXCursor C, CXIdxLoc Loc, const Attr *A) {
211 kind = Kind;
212 cursor = C;
213 loc = Loc;
214 this->A = A;
215 }
Argyrios Kyrtzidisb395c632011-11-18 00:26:51 +0000216};
217
218struct IBOutletCollectionInfo : public AttrInfo {
Argyrios Kyrtzidis2957e6f2011-11-22 07:24:51 +0000219 EntityInfo ClassInfo;
Argyrios Kyrtzidisb395c632011-11-18 00:26:51 +0000220 CXIdxIBOutletCollectionAttrInfo IBCollInfo;
221
222 IBOutletCollectionInfo(CXCursor C, CXIdxLoc Loc, const Attr *A) :
223 AttrInfo(CXIdxAttr_IBOutletCollection, C, Loc, A) {
224 assert(C.kind == CXCursor_IBOutletCollectionAttr);
Argyrios Kyrtzidis643d3ce2011-12-15 00:05:00 +0000225 IBCollInfo.objcClass = 0;
Argyrios Kyrtzidisb395c632011-11-18 00:26:51 +0000226 }
227
Argyrios Kyrtzidis643d3ce2011-12-15 00:05:00 +0000228 IBOutletCollectionInfo(const IBOutletCollectionInfo &other);
229
Argyrios Kyrtzidisb395c632011-11-18 00:26:51 +0000230 static bool classof(const AttrInfo *A) {
231 return A->kind == CXIdxAttr_IBOutletCollection;
232 }
Argyrios Kyrtzidisb395c632011-11-18 00:26:51 +0000233};
234
Argyrios Kyrtzidis643d3ce2011-12-15 00:05:00 +0000235class AttrListInfo {
Argyrios Kyrtzidisd786f1a2012-03-31 01:14:06 +0000236 ScratchAlloc SA;
237
Argyrios Kyrtzidis643d3ce2011-12-15 00:05:00 +0000238 SmallVector<AttrInfo, 2> Attrs;
239 SmallVector<IBOutletCollectionInfo, 2> IBCollAttrs;
240 SmallVector<CXIdxAttrInfo *, 2> CXAttrs;
241 unsigned ref_cnt;
242
Dmitri Gribenkof56faa02012-09-15 20:20:27 +0000243 AttrListInfo(const AttrListInfo &) LLVM_DELETED_FUNCTION;
244 void operator=(const AttrListInfo &) LLVM_DELETED_FUNCTION;
Argyrios Kyrtzidis643d3ce2011-12-15 00:05:00 +0000245public:
Argyrios Kyrtzidisd786f1a2012-03-31 01:14:06 +0000246 AttrListInfo(const Decl *D, IndexingContext &IdxCtx);
247
248 static IntrusiveRefCntPtr<AttrListInfo> create(const Decl *D,
249 IndexingContext &IdxCtx);
Argyrios Kyrtzidis643d3ce2011-12-15 00:05:00 +0000250
251 const CXIdxAttrInfo *const *getAttrs() const {
252 if (CXAttrs.empty())
253 return 0;
254 return CXAttrs.data();
255 }
256 unsigned getNumAttrs() const { return (unsigned)CXAttrs.size(); }
257
258 /// \brief Retain/Release only useful when we allocate a AttrListInfo from the
259 /// BumpPtrAllocator, and not from the stack; so that we keep a pointer
260 // in the EntityInfo
261 void Retain() { ++ref_cnt; }
262 void Release() {
263 assert (ref_cnt > 0 && "Reference count is already zero.");
264 if (--ref_cnt == 0) {
265 // Memory is allocated from a BumpPtrAllocator, no need to delete it.
266 this->~AttrListInfo();
267 }
268 }
269};
270
Argyrios Kyrtzidisc6b4a502011-11-16 02:34:59 +0000271struct RefFileOccurence {
272 const FileEntry *File;
273 const Decl *Dcl;
274
275 RefFileOccurence(const FileEntry *File, const Decl *Dcl)
276 : File(File), Dcl(Dcl) { }
277};
278
Argyrios Kyrtzidis4e7064f2011-10-17 19:48:19 +0000279class IndexingContext {
280 ASTContext *Ctx;
281 CXClientData ClientData;
282 IndexerCallbacks &CB;
283 unsigned IndexOptions;
284 CXTranslationUnit CXTU;
285
Argyrios Kyrtzidisdd93c592011-11-11 00:23:36 +0000286 typedef llvm::DenseMap<const FileEntry *, CXIdxClientFile> FileMapTy;
Argyrios Kyrtzidis2957e6f2011-11-22 07:24:51 +0000287 typedef llvm::DenseMap<const DeclContext *, CXIdxClientContainer>
288 ContainerMapTy;
289 typedef llvm::DenseMap<const Decl *, CXIdxClientEntity> EntityMapTy;
290
Argyrios Kyrtzidis4e7064f2011-10-17 19:48:19 +0000291 FileMapTy FileMap;
Argyrios Kyrtzidis4e7064f2011-10-17 19:48:19 +0000292 ContainerMapTy ContainerMap;
Argyrios Kyrtzidis2957e6f2011-11-22 07:24:51 +0000293 EntityMapTy EntityMap;
Argyrios Kyrtzidis4e7064f2011-10-17 19:48:19 +0000294
Argyrios Kyrtzidisc6b4a502011-11-16 02:34:59 +0000295 llvm::DenseSet<RefFileOccurence> RefFileOccurences;
296
Argyrios Kyrtzidis30a28052012-03-23 23:24:18 +0000297 std::deque<DeclGroupRef> TUDeclsInObjCContainer;
Argyrios Kyrtzidis4e7064f2011-10-17 19:48:19 +0000298
Argyrios Kyrtzidis37f40572011-11-23 20:27:26 +0000299 llvm::BumpPtrAllocator StrScratch;
Argyrios Kyrtzidisdd93c592011-11-11 00:23:36 +0000300 unsigned StrAdapterCount;
Argyrios Kyrtzidis643d3ce2011-12-15 00:05:00 +0000301 friend class ScratchAlloc;
Argyrios Kyrtzidis4e7064f2011-10-17 19:48:19 +0000302
Argyrios Kyrtzidis6ec43ad2011-11-12 02:16:30 +0000303 struct ObjCProtocolListInfo {
304 SmallVector<CXIdxObjCProtocolRefInfo, 4> ProtInfos;
Argyrios Kyrtzidis2957e6f2011-11-22 07:24:51 +0000305 SmallVector<EntityInfo, 4> ProtEntities;
Argyrios Kyrtzidis6ec43ad2011-11-12 02:16:30 +0000306 SmallVector<CXIdxObjCProtocolRefInfo *, 4> Prots;
307
Argyrios Kyrtzidisb395c632011-11-18 00:26:51 +0000308 CXIdxObjCProtocolRefListInfo getListInfo() const {
Argyrios Kyrtzidisc71d5542011-11-14 22:39:19 +0000309 CXIdxObjCProtocolRefListInfo Info = { Prots.data(),
310 (unsigned)Prots.size() };
311 return Info;
312 }
Argyrios Kyrtzidis6ec43ad2011-11-12 02:16:30 +0000313
314 ObjCProtocolListInfo(const ObjCProtocolList &ProtList,
315 IndexingContext &IdxCtx,
Argyrios Kyrtzidis643d3ce2011-12-15 00:05:00 +0000316 ScratchAlloc &SA);
Argyrios Kyrtzidis2957e6f2011-11-22 07:24:51 +0000317 };
318
319 struct CXXBasesListInfo {
320 SmallVector<CXIdxBaseClassInfo, 4> BaseInfos;
321 SmallVector<EntityInfo, 4> BaseEntities;
322 SmallVector<CXIdxBaseClassInfo *, 4> CXBases;
323
324 const CXIdxBaseClassInfo *const *getBases() const {
325 return CXBases.data();
326 }
327 unsigned getNumBases() const { return (unsigned)CXBases.size(); }
328
329 CXXBasesListInfo(const CXXRecordDecl *D,
Argyrios Kyrtzidis643d3ce2011-12-15 00:05:00 +0000330 IndexingContext &IdxCtx, ScratchAlloc &SA);
Argyrios Kyrtzidisb526a872011-12-07 20:44:15 +0000331
332 private:
333 SourceLocation getBaseLoc(const CXXBaseSpecifier &Base) const;
Argyrios Kyrtzidis2957e6f2011-11-22 07:24:51 +0000334 };
Argyrios Kyrtzidisb395c632011-11-18 00:26:51 +0000335
Argyrios Kyrtzidis643d3ce2011-12-15 00:05:00 +0000336 friend class AttrListInfo;
337
Argyrios Kyrtzidis4e7064f2011-10-17 19:48:19 +0000338public:
339 IndexingContext(CXClientData clientData, IndexerCallbacks &indexCallbacks,
340 unsigned indexOptions, CXTranslationUnit cxTU)
341 : Ctx(0), ClientData(clientData), CB(indexCallbacks),
Argyrios Kyrtzidis37f40572011-11-23 20:27:26 +0000342 IndexOptions(indexOptions), CXTU(cxTU),
343 StrScratch(/*size=*/1024), StrAdapterCount(0) { }
Argyrios Kyrtzidis4e7064f2011-10-17 19:48:19 +0000344
345 ASTContext &getASTContext() const { return *Ctx; }
346
347 void setASTContext(ASTContext &ctx);
Argyrios Kyrtzidis7fe90f32012-01-17 18:48:07 +0000348 void setPreprocessor(Preprocessor &PP);
Argyrios Kyrtzidis4e7064f2011-10-17 19:48:19 +0000349
Argyrios Kyrtzidis58d2dbe2012-02-14 22:23:11 +0000350 bool shouldSuppressRefs() const {
Argyrios Kyrtzidisb395c632011-11-18 00:26:51 +0000351 return IndexOptions & CXIndexOpt_SuppressRedundantRefs;
Argyrios Kyrtzidisc6b4a502011-11-16 02:34:59 +0000352 }
353
Argyrios Kyrtzidis58d2dbe2012-02-14 22:23:11 +0000354 bool shouldIndexFunctionLocalSymbols() const {
Argyrios Kyrtzidis22490742012-01-14 00:11:49 +0000355 return IndexOptions & CXIndexOpt_IndexFunctionLocalSymbols;
356 }
357
Argyrios Kyrtzidis58d2dbe2012-02-14 22:23:11 +0000358 bool shouldIndexImplicitTemplateInsts() const {
359 return IndexOptions & CXIndexOpt_IndexImplicitTemplateInstantiations;
360 }
361
Argyrios Kyrtzidis3bed3d12012-09-10 22:58:04 +0000362 static bool isFunctionLocalDecl(const Decl *D);
363
Argyrios Kyrtzidisb395c632011-11-18 00:26:51 +0000364 bool shouldAbort();
365
Argyrios Kyrtzidis996e6e52011-12-01 02:42:50 +0000366 bool hasDiagnosticCallback() const { return CB.diagnostic; }
367
Argyrios Kyrtzidisdd93c592011-11-11 00:23:36 +0000368 void enteredMainFile(const FileEntry *File);
369
Argyrios Kyrtzidis4e7064f2011-10-17 19:48:19 +0000370 void ppIncludedFile(SourceLocation hashLoc,
371 StringRef filename, const FileEntry *File,
Argyrios Kyrtzidis8d7a24e2012-10-18 00:17:05 +0000372 bool isImport, bool isAngled, bool isModuleImport);
Argyrios Kyrtzidis4e7064f2011-10-17 19:48:19 +0000373
Argyrios Kyrtzidis37f2f522012-10-03 21:05:44 +0000374 void importedModule(const ImportDecl *ImportD);
Argyrios Kyrtzidis3da76bf2012-10-03 21:05:51 +0000375 void importedPCH(const FileEntry *File);
Argyrios Kyrtzidis2c3e05c2012-10-02 16:10:38 +0000376
Argyrios Kyrtzidis6ec43ad2011-11-12 02:16:30 +0000377 void startedTranslationUnit();
Argyrios Kyrtzidis4e7064f2011-10-17 19:48:19 +0000378
379 void indexDecl(const Decl *D);
380
381 void indexTagDecl(const TagDecl *D);
382
383 void indexTypeSourceInfo(TypeSourceInfo *TInfo, const NamedDecl *Parent,
384 const DeclContext *DC = 0);
385
386 void indexTypeLoc(TypeLoc TL, const NamedDecl *Parent,
Argyrios Kyrtzidise422e452011-12-13 18:47:41 +0000387 const DeclContext *DC = 0);
388
389 void indexNestedNameSpecifierLoc(NestedNameSpecifierLoc NNS,
390 const NamedDecl *Parent,
391 const DeclContext *DC = 0);
Argyrios Kyrtzidis4e7064f2011-10-17 19:48:19 +0000392
393 void indexDeclContext(const DeclContext *DC);
394
Argyrios Kyrtzidise422e452011-12-13 18:47:41 +0000395 void indexBody(const Stmt *S, const NamedDecl *Parent,
396 const DeclContext *DC = 0);
Argyrios Kyrtzidis4e7064f2011-10-17 19:48:19 +0000397
Argyrios Kyrtzidisb395c632011-11-18 00:26:51 +0000398 void handleDiagnosticSet(CXDiagnosticSet CXDiagSet);
Argyrios Kyrtzidis4e7064f2011-10-17 19:48:19 +0000399
Argyrios Kyrtzidisb395c632011-11-18 00:26:51 +0000400 bool handleFunction(const FunctionDecl *FD);
Argyrios Kyrtzidis4e7064f2011-10-17 19:48:19 +0000401
Argyrios Kyrtzidisb395c632011-11-18 00:26:51 +0000402 bool handleVar(const VarDecl *D);
Argyrios Kyrtzidis4e7064f2011-10-17 19:48:19 +0000403
Argyrios Kyrtzidisb395c632011-11-18 00:26:51 +0000404 bool handleField(const FieldDecl *D);
Argyrios Kyrtzidis4e7064f2011-10-17 19:48:19 +0000405
Argyrios Kyrtzidisb395c632011-11-18 00:26:51 +0000406 bool handleEnumerator(const EnumConstantDecl *D);
Argyrios Kyrtzidis4e7064f2011-10-17 19:48:19 +0000407
Argyrios Kyrtzidisb395c632011-11-18 00:26:51 +0000408 bool handleTagDecl(const TagDecl *D);
Argyrios Kyrtzidis4e7064f2011-10-17 19:48:19 +0000409
Argyrios Kyrtzidis2957e6f2011-11-22 07:24:51 +0000410 bool handleTypedefName(const TypedefNameDecl *D);
Argyrios Kyrtzidis4e7064f2011-10-17 19:48:19 +0000411
Argyrios Kyrtzidisb395c632011-11-18 00:26:51 +0000412 bool handleObjCInterface(const ObjCInterfaceDecl *D);
413 bool handleObjCImplementation(const ObjCImplementationDecl *D);
Argyrios Kyrtzidis4e7064f2011-10-17 19:48:19 +0000414
Argyrios Kyrtzidisb395c632011-11-18 00:26:51 +0000415 bool handleObjCProtocol(const ObjCProtocolDecl *D);
Argyrios Kyrtzidis4e7064f2011-10-17 19:48:19 +0000416
Argyrios Kyrtzidisb395c632011-11-18 00:26:51 +0000417 bool handleObjCCategory(const ObjCCategoryDecl *D);
418 bool handleObjCCategoryImpl(const ObjCCategoryImplDecl *D);
Argyrios Kyrtzidis4e7064f2011-10-17 19:48:19 +0000419
Argyrios Kyrtzidisb395c632011-11-18 00:26:51 +0000420 bool handleObjCMethod(const ObjCMethodDecl *D);
Argyrios Kyrtzidis4e7064f2011-10-17 19:48:19 +0000421
Argyrios Kyrtzidisb395c632011-11-18 00:26:51 +0000422 bool handleSynthesizedObjCProperty(const ObjCPropertyImplDecl *D);
Argyrios Kyrtzidisf9112422012-02-28 17:50:39 +0000423 bool handleSynthesizedObjCMethod(const ObjCMethodDecl *D, SourceLocation Loc,
424 const DeclContext *LexicalDC);
Argyrios Kyrtzidis4e7064f2011-10-17 19:48:19 +0000425
Argyrios Kyrtzidisb395c632011-11-18 00:26:51 +0000426 bool handleObjCProperty(const ObjCPropertyDecl *D);
427
Argyrios Kyrtzidis68478b02011-12-07 05:52:06 +0000428 bool handleNamespace(const NamespaceDecl *D);
429
Argyrios Kyrtzidis2957e6f2011-11-22 07:24:51 +0000430 bool handleClassTemplate(const ClassTemplateDecl *D);
431 bool handleFunctionTemplate(const FunctionTemplateDecl *D);
432 bool handleTypeAliasTemplate(const TypeAliasTemplateDecl *D);
433
Argyrios Kyrtzidisb395c632011-11-18 00:26:51 +0000434 bool handleReference(const NamedDecl *D, SourceLocation Loc, CXCursor Cursor,
435 const NamedDecl *Parent,
436 const DeclContext *DC,
437 const Expr *E = 0,
438 CXIdxEntityRefKind Kind = CXIdxEntityRef_Direct);
439
440 bool handleReference(const NamedDecl *D, SourceLocation Loc,
Argyrios Kyrtzidis4e7064f2011-10-17 19:48:19 +0000441 const NamedDecl *Parent,
442 const DeclContext *DC,
Argyrios Kyrtzidisaca19be2011-10-18 15:50:50 +0000443 const Expr *E = 0,
444 CXIdxEntityRefKind Kind = CXIdxEntityRef_Direct);
Argyrios Kyrtzidis4e7064f2011-10-17 19:48:19 +0000445
446 bool isNotFromSourceFile(SourceLocation Loc) const;
447
Argyrios Kyrtzidis3bed3d12012-09-10 22:58:04 +0000448 void indexTopLevelDecl(const Decl *D);
Argyrios Kyrtzidis4e7064f2011-10-17 19:48:19 +0000449 void indexTUDeclsInObjCContainer();
450 void indexDeclGroupRef(DeclGroupRef DG);
451
452 void addTUDeclInObjCContainer(DeclGroupRef DG) {
453 TUDeclsInObjCContainer.push_back(DG);
454 }
455
Argyrios Kyrtzidisdd93c592011-11-11 00:23:36 +0000456 void translateLoc(SourceLocation Loc, CXIdxClientFile *indexFile, CXFile *file,
Argyrios Kyrtzidis4e7064f2011-10-17 19:48:19 +0000457 unsigned *line, unsigned *column, unsigned *offset);
458
Argyrios Kyrtzidis2957e6f2011-11-22 07:24:51 +0000459 CXIdxClientContainer getClientContainerForDC(const DeclContext *DC) const;
460 void addContainerInMap(const DeclContext *DC, CXIdxClientContainer container);
461
462 CXIdxClientEntity getClientEntity(const Decl *D) const;
463 void setClientEntity(const Decl *D, CXIdxClientEntity client);
464
Argyrios Kyrtzidis6d968362012-02-10 20:10:44 +0000465 static bool isTemplateImplicitInstantiation(const Decl *D);
466
Argyrios Kyrtzidis4e7064f2011-10-17 19:48:19 +0000467private:
Argyrios Kyrtzidisb395c632011-11-18 00:26:51 +0000468 bool handleDecl(const NamedDecl *D,
Argyrios Kyrtzidisdd93c592011-11-11 00:23:36 +0000469 SourceLocation Loc, CXCursor Cursor,
Argyrios Kyrtzidisf9112422012-02-28 17:50:39 +0000470 DeclInfo &DInfo,
471 const DeclContext *LexicalDC = 0);
Argyrios Kyrtzidis4e7064f2011-10-17 19:48:19 +0000472
Argyrios Kyrtzidisb395c632011-11-18 00:26:51 +0000473 bool handleObjCContainer(const ObjCContainerDecl *D,
Argyrios Kyrtzidisdd93c592011-11-11 00:23:36 +0000474 SourceLocation Loc, CXCursor Cursor,
Argyrios Kyrtzidisdd93c592011-11-11 00:23:36 +0000475 ObjCContainerDeclInfo &ContDInfo);
Argyrios Kyrtzidis4e7064f2011-10-17 19:48:19 +0000476
Argyrios Kyrtzidis2957e6f2011-11-22 07:24:51 +0000477 bool handleCXXRecordDecl(const CXXRecordDecl *RD, const NamedDecl *OrigD);
Argyrios Kyrtzidisdd93c592011-11-11 00:23:36 +0000478
Argyrios Kyrtzidisb395c632011-11-18 00:26:51 +0000479 bool markEntityOccurrenceInFile(const NamedDecl *D, SourceLocation Loc);
480
Argyrios Kyrtzidis4e7064f2011-10-17 19:48:19 +0000481 const NamedDecl *getEntityDecl(const NamedDecl *D) const;
482
Argyrios Kyrtzidis2957e6f2011-11-22 07:24:51 +0000483 const DeclContext *getEntityContainer(const Decl *D) const;
484
Argyrios Kyrtzidisdd93c592011-11-11 00:23:36 +0000485 CXIdxClientFile getIndexFile(const FileEntry *File);
Argyrios Kyrtzidis4e7064f2011-10-17 19:48:19 +0000486
487 CXIdxLoc getIndexLoc(SourceLocation Loc) const;
488
Argyrios Kyrtzidis4e7064f2011-10-17 19:48:19 +0000489 void getEntityInfo(const NamedDecl *D,
Argyrios Kyrtzidis2957e6f2011-11-22 07:24:51 +0000490 EntityInfo &EntityInfo,
Argyrios Kyrtzidis643d3ce2011-12-15 00:05:00 +0000491 ScratchAlloc &SA);
Argyrios Kyrtzidis4e7064f2011-10-17 19:48:19 +0000492
Argyrios Kyrtzidis2957e6f2011-11-22 07:24:51 +0000493 void getContainerInfo(const DeclContext *DC, ContainerInfo &ContInfo);
494
Argyrios Kyrtzidisb395c632011-11-18 00:26:51 +0000495 CXCursor getCursor(const Decl *D) {
496 return cxcursor::MakeCXCursor(const_cast<Decl*>(D), CXTU);
Argyrios Kyrtzidis4e7064f2011-10-17 19:48:19 +0000497 }
498
499 CXCursor getRefCursor(const NamedDecl *D, SourceLocation Loc);
Argyrios Kyrtzidis2957e6f2011-11-22 07:24:51 +0000500
Argyrios Kyrtzidisd0890082012-02-07 22:46:16 +0000501 static bool shouldIgnoreIfImplicit(const Decl *D);
Argyrios Kyrtzidis4e7064f2011-10-17 19:48:19 +0000502};
503
Argyrios Kyrtzidisd786f1a2012-03-31 01:14:06 +0000504inline ScratchAlloc::ScratchAlloc(IndexingContext &idxCtx) : IdxCtx(idxCtx) {
505 ++IdxCtx.StrAdapterCount;
506}
507inline ScratchAlloc::ScratchAlloc(const ScratchAlloc &SA) : IdxCtx(SA.IdxCtx) {
508 ++IdxCtx.StrAdapterCount;
509}
Argyrios Kyrtzidis643d3ce2011-12-15 00:05:00 +0000510
Argyrios Kyrtzidisd786f1a2012-03-31 01:14:06 +0000511inline ScratchAlloc::~ScratchAlloc() {
512 --IdxCtx.StrAdapterCount;
513 if (IdxCtx.StrAdapterCount == 0)
514 IdxCtx.StrScratch.Reset();
515}
Argyrios Kyrtzidis643d3ce2011-12-15 00:05:00 +0000516
Argyrios Kyrtzidisd786f1a2012-03-31 01:14:06 +0000517template <typename T>
518inline T *ScratchAlloc::allocate() {
519 return IdxCtx.StrScratch.Allocate<T>();
520}
Argyrios Kyrtzidis643d3ce2011-12-15 00:05:00 +0000521
Argyrios Kyrtzidis4e7064f2011-10-17 19:48:19 +0000522}} // end clang::cxindex
Argyrios Kyrtzidisc6b4a502011-11-16 02:34:59 +0000523
524namespace llvm {
525 /// Define DenseMapInfo so that FileID's can be used as keys in DenseMap and
526 /// DenseSets.
527 template <>
528 struct DenseMapInfo<clang::cxindex::RefFileOccurence> {
529 static inline clang::cxindex::RefFileOccurence getEmptyKey() {
530 return clang::cxindex::RefFileOccurence(0, 0);
531 }
532
533 static inline clang::cxindex::RefFileOccurence getTombstoneKey() {
534 return clang::cxindex::RefFileOccurence((const clang::FileEntry *)~0,
535 (const clang::Decl *)~0);
536 }
537
538 static unsigned getHashValue(clang::cxindex::RefFileOccurence S) {
Benjamin Kramer28b23072012-05-27 13:28:44 +0000539 typedef std::pair<const clang::FileEntry *, const clang::Decl *> PairTy;
540 return DenseMapInfo<PairTy>::getHashValue(PairTy(S.File, S.Dcl));
Argyrios Kyrtzidisc6b4a502011-11-16 02:34:59 +0000541 }
542
543 static bool isEqual(clang::cxindex::RefFileOccurence LHS,
544 clang::cxindex::RefFileOccurence RHS) {
545 return LHS.File == RHS.File && LHS.Dcl == RHS.Dcl;
546 }
547 };
548}