IndexingContext.h revision 30a2805c2c85e6abfe3149293f83f60da018b2df
14e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis//===- IndexingContext.h - Higher level API functions ------------------------===//
24e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis//
34e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis//                     The LLVM Compiler Infrastructure
44e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis//
54e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis// This file is distributed under the University of Illinois Open Source
64e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis// License. See LICENSE.TXT for details.
74e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis//
84e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis//===----------------------------------------------------------------------===//
94e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis
104e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis#include "Index_Internal.h"
114e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis#include "CXCursor.h"
124e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis
136ec43adc39006a7fce94188956d0239bd54c0363Argyrios Kyrtzidis#include "clang/AST/DeclObjC.h"
144e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis#include "clang/AST/DeclGroup.h"
15c6b4a5099588fd21b49c80f730a596a64b2766c6Argyrios Kyrtzidis#include "llvm/ADT/DenseSet.h"
1630a2805c2c85e6abfe3149293f83f60da018b2dfArgyrios Kyrtzidis#include <deque>
174e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis
184e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidisnamespace clang {
194e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis  class FileEntry;
204e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis  class ObjCPropertyDecl;
212957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis  class ClassTemplateDecl;
222957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis  class FunctionTemplateDecl;
232957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis  class TypeAliasTemplateDecl;
246d968363877388f0a0268711d59367907b465ae1Argyrios Kyrtzidis  class ClassTemplateSpecializationDecl;
254e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis
264e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidisnamespace cxindex {
274e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis  class IndexingContext;
28643d3ce93c501d19353f2fa578fee3e97f1d1b4bArgyrios Kyrtzidis  class ScratchAlloc;
29643d3ce93c501d19353f2fa578fee3e97f1d1b4bArgyrios Kyrtzidis  class AttrListInfo;
304e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis
312957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidisstruct EntityInfo : public CXIdxEntityInfo {
322957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis  const NamedDecl *Dcl;
332957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis  IndexingContext *IndexCtx;
34c93dc7889644293e318e19d82830ea2acc45b678Dylan Noblesmith  IntrusiveRefCntPtr<AttrListInfo> AttrList;
3537f40572c4c78a8c57a7b45266f8b86db172a7c1Argyrios Kyrtzidis
3637f40572c4c78a8c57a7b45266f8b86db172a7c1Argyrios Kyrtzidis  EntityInfo() {
3737f40572c4c78a8c57a7b45266f8b86db172a7c1Argyrios Kyrtzidis    name = USR = 0;
38643d3ce93c501d19353f2fa578fee3e97f1d1b4bArgyrios Kyrtzidis    attributes = 0;
39643d3ce93c501d19353f2fa578fee3e97f1d1b4bArgyrios Kyrtzidis    numAttributes = 0;
4037f40572c4c78a8c57a7b45266f8b86db172a7c1Argyrios Kyrtzidis  }
412957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis};
422957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis
432957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidisstruct ContainerInfo : public CXIdxContainerInfo {
442957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis  const DeclContext *DC;
452957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis  IndexingContext *IndexCtx;
462957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis};
472957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis
48dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidisstruct DeclInfo : public CXIdxDeclInfo {
49c71d55469e7d5f7b376a30620617a175a9442da9Argyrios Kyrtzidis  enum DInfoKind {
50c71d55469e7d5f7b376a30620617a175a9442da9Argyrios Kyrtzidis    Info_Decl,
51c71d55469e7d5f7b376a30620617a175a9442da9Argyrios Kyrtzidis
52c71d55469e7d5f7b376a30620617a175a9442da9Argyrios Kyrtzidis    Info_ObjCContainer,
53c71d55469e7d5f7b376a30620617a175a9442da9Argyrios Kyrtzidis      Info_ObjCInterface,
54c71d55469e7d5f7b376a30620617a175a9442da9Argyrios Kyrtzidis      Info_ObjCProtocol,
552957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis      Info_ObjCCategory,
562957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis
57792db266f3d2f12a7a16bf37d90074f54bca1e6fArgyrios Kyrtzidis    Info_ObjCProperty,
58792db266f3d2f12a7a16bf37d90074f54bca1e6fArgyrios Kyrtzidis
592957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis    Info_CXXClass
60c71d55469e7d5f7b376a30620617a175a9442da9Argyrios Kyrtzidis  };
61c71d55469e7d5f7b376a30620617a175a9442da9Argyrios Kyrtzidis
62c71d55469e7d5f7b376a30620617a175a9442da9Argyrios Kyrtzidis  DInfoKind Kind;
63c71d55469e7d5f7b376a30620617a175a9442da9Argyrios Kyrtzidis
642957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis  EntityInfo EntInfo;
65b1febb646bf7a2f319ad894c9833968c52d21711Argyrios Kyrtzidis  ContainerInfo SemanticContainer;
66b1febb646bf7a2f319ad894c9833968c52d21711Argyrios Kyrtzidis  ContainerInfo LexicalContainer;
672957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis  ContainerInfo DeclAsContainer;
682957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis
69c71d55469e7d5f7b376a30620617a175a9442da9Argyrios Kyrtzidis  DeclInfo(bool isRedeclaration, bool isDefinition, bool isContainer)
70c71d55469e7d5f7b376a30620617a175a9442da9Argyrios Kyrtzidis    : Kind(Info_Decl) {
71c71d55469e7d5f7b376a30620617a175a9442da9Argyrios Kyrtzidis    this->isRedeclaration = isRedeclaration;
72c71d55469e7d5f7b376a30620617a175a9442da9Argyrios Kyrtzidis    this->isDefinition = isDefinition;
73c71d55469e7d5f7b376a30620617a175a9442da9Argyrios Kyrtzidis    this->isContainer = isContainer;
74b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis    attributes = 0;
75b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis    numAttributes = 0;
76b1febb646bf7a2f319ad894c9833968c52d21711Argyrios Kyrtzidis    declAsContainer = semanticContainer = lexicalContainer = 0;
77c71d55469e7d5f7b376a30620617a175a9442da9Argyrios Kyrtzidis  }
78c71d55469e7d5f7b376a30620617a175a9442da9Argyrios Kyrtzidis  DeclInfo(DInfoKind K,
79c71d55469e7d5f7b376a30620617a175a9442da9Argyrios Kyrtzidis           bool isRedeclaration, bool isDefinition, bool isContainer)
80c71d55469e7d5f7b376a30620617a175a9442da9Argyrios Kyrtzidis    : Kind(K) {
81c71d55469e7d5f7b376a30620617a175a9442da9Argyrios Kyrtzidis    this->isRedeclaration = isRedeclaration;
82c71d55469e7d5f7b376a30620617a175a9442da9Argyrios Kyrtzidis    this->isDefinition = isDefinition;
83c71d55469e7d5f7b376a30620617a175a9442da9Argyrios Kyrtzidis    this->isContainer = isContainer;
84b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis    attributes = 0;
85b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis    numAttributes = 0;
86b1febb646bf7a2f319ad894c9833968c52d21711Argyrios Kyrtzidis    declAsContainer = semanticContainer = lexicalContainer = 0;
87c71d55469e7d5f7b376a30620617a175a9442da9Argyrios Kyrtzidis  }
88c71d55469e7d5f7b376a30620617a175a9442da9Argyrios Kyrtzidis
89c71d55469e7d5f7b376a30620617a175a9442da9Argyrios Kyrtzidis  static bool classof(const DeclInfo *) { return true; }
90dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis};
91dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis
92dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidisstruct ObjCContainerDeclInfo : public DeclInfo {
936ec43adc39006a7fce94188956d0239bd54c0363Argyrios Kyrtzidis  CXIdxObjCContainerDeclInfo ObjCContDeclInfo;
94dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis
95c71d55469e7d5f7b376a30620617a175a9442da9Argyrios Kyrtzidis  ObjCContainerDeclInfo(bool isForwardRef,
96c71d55469e7d5f7b376a30620617a175a9442da9Argyrios Kyrtzidis                        bool isRedeclaration,
97c71d55469e7d5f7b376a30620617a175a9442da9Argyrios Kyrtzidis                        bool isImplementation)
98c71d55469e7d5f7b376a30620617a175a9442da9Argyrios Kyrtzidis    : DeclInfo(Info_ObjCContainer, isRedeclaration,
99c71d55469e7d5f7b376a30620617a175a9442da9Argyrios Kyrtzidis               /*isDefinition=*/!isForwardRef, /*isContainer=*/!isForwardRef) {
100c71d55469e7d5f7b376a30620617a175a9442da9Argyrios Kyrtzidis    init(isForwardRef, isImplementation);
101c71d55469e7d5f7b376a30620617a175a9442da9Argyrios Kyrtzidis  }
102c71d55469e7d5f7b376a30620617a175a9442da9Argyrios Kyrtzidis  ObjCContainerDeclInfo(DInfoKind K,
103c71d55469e7d5f7b376a30620617a175a9442da9Argyrios Kyrtzidis                        bool isForwardRef,
104c71d55469e7d5f7b376a30620617a175a9442da9Argyrios Kyrtzidis                        bool isRedeclaration,
105c71d55469e7d5f7b376a30620617a175a9442da9Argyrios Kyrtzidis                        bool isImplementation)
106c71d55469e7d5f7b376a30620617a175a9442da9Argyrios Kyrtzidis    : DeclInfo(K, isRedeclaration, /*isDefinition=*/!isForwardRef,
107c71d55469e7d5f7b376a30620617a175a9442da9Argyrios Kyrtzidis               /*isContainer=*/!isForwardRef) {
108c71d55469e7d5f7b376a30620617a175a9442da9Argyrios Kyrtzidis    init(isForwardRef, isImplementation);
109c71d55469e7d5f7b376a30620617a175a9442da9Argyrios Kyrtzidis  }
110c71d55469e7d5f7b376a30620617a175a9442da9Argyrios Kyrtzidis
111c71d55469e7d5f7b376a30620617a175a9442da9Argyrios Kyrtzidis  static bool classof(const DeclInfo *D) {
112c71d55469e7d5f7b376a30620617a175a9442da9Argyrios Kyrtzidis    return Info_ObjCContainer <= D->Kind && D->Kind <= Info_ObjCCategory;
113c71d55469e7d5f7b376a30620617a175a9442da9Argyrios Kyrtzidis  }
114c71d55469e7d5f7b376a30620617a175a9442da9Argyrios Kyrtzidis  static bool classof(const ObjCContainerDeclInfo *D) { return true; }
115c71d55469e7d5f7b376a30620617a175a9442da9Argyrios Kyrtzidis
116c71d55469e7d5f7b376a30620617a175a9442da9Argyrios Kyrtzidisprivate:
117c71d55469e7d5f7b376a30620617a175a9442da9Argyrios Kyrtzidis  void init(bool isForwardRef, bool isImplementation) {
118c71d55469e7d5f7b376a30620617a175a9442da9Argyrios Kyrtzidis    if (isForwardRef)
119c71d55469e7d5f7b376a30620617a175a9442da9Argyrios Kyrtzidis      ObjCContDeclInfo.kind = CXIdxObjCContainer_ForwardRef;
120c71d55469e7d5f7b376a30620617a175a9442da9Argyrios Kyrtzidis    else if (isImplementation)
121c71d55469e7d5f7b376a30620617a175a9442da9Argyrios Kyrtzidis      ObjCContDeclInfo.kind = CXIdxObjCContainer_Implementation;
122c71d55469e7d5f7b376a30620617a175a9442da9Argyrios Kyrtzidis    else
123c71d55469e7d5f7b376a30620617a175a9442da9Argyrios Kyrtzidis      ObjCContDeclInfo.kind = CXIdxObjCContainer_Interface;
124c71d55469e7d5f7b376a30620617a175a9442da9Argyrios Kyrtzidis  }
1256ec43adc39006a7fce94188956d0239bd54c0363Argyrios Kyrtzidis};
1266ec43adc39006a7fce94188956d0239bd54c0363Argyrios Kyrtzidis
127c71d55469e7d5f7b376a30620617a175a9442da9Argyrios Kyrtzidisstruct ObjCInterfaceDeclInfo : public ObjCContainerDeclInfo {
1286ec43adc39006a7fce94188956d0239bd54c0363Argyrios Kyrtzidis  CXIdxObjCInterfaceDeclInfo ObjCInterDeclInfo;
129c71d55469e7d5f7b376a30620617a175a9442da9Argyrios Kyrtzidis  CXIdxObjCProtocolRefListInfo ObjCProtoListInfo;
130c71d55469e7d5f7b376a30620617a175a9442da9Argyrios Kyrtzidis
131c71d55469e7d5f7b376a30620617a175a9442da9Argyrios Kyrtzidis  ObjCInterfaceDeclInfo(const ObjCInterfaceDecl *D)
132c71d55469e7d5f7b376a30620617a175a9442da9Argyrios Kyrtzidis    : ObjCContainerDeclInfo(Info_ObjCInterface,
133c71d55469e7d5f7b376a30620617a175a9442da9Argyrios Kyrtzidis                            /*isForwardRef=*/false,
134ef96ee0be5f100789f451641542a69cd719144d2Douglas Gregor                          /*isRedeclaration=*/D->getPreviousDecl() != 0,
135c71d55469e7d5f7b376a30620617a175a9442da9Argyrios Kyrtzidis                            /*isImplementation=*/false) { }
136c71d55469e7d5f7b376a30620617a175a9442da9Argyrios Kyrtzidis
137c71d55469e7d5f7b376a30620617a175a9442da9Argyrios Kyrtzidis  static bool classof(const DeclInfo *D) {
138c71d55469e7d5f7b376a30620617a175a9442da9Argyrios Kyrtzidis    return D->Kind == Info_ObjCInterface;
139c71d55469e7d5f7b376a30620617a175a9442da9Argyrios Kyrtzidis  }
140c71d55469e7d5f7b376a30620617a175a9442da9Argyrios Kyrtzidis  static bool classof(const ObjCInterfaceDeclInfo *D) { return true; }
1416ec43adc39006a7fce94188956d0239bd54c0363Argyrios Kyrtzidis};
1426ec43adc39006a7fce94188956d0239bd54c0363Argyrios Kyrtzidis
143c71d55469e7d5f7b376a30620617a175a9442da9Argyrios Kyrtzidisstruct ObjCProtocolDeclInfo : public ObjCContainerDeclInfo {
144c71d55469e7d5f7b376a30620617a175a9442da9Argyrios Kyrtzidis  CXIdxObjCProtocolRefListInfo ObjCProtoRefListInfo;
145c71d55469e7d5f7b376a30620617a175a9442da9Argyrios Kyrtzidis
146c71d55469e7d5f7b376a30620617a175a9442da9Argyrios Kyrtzidis  ObjCProtocolDeclInfo(const ObjCProtocolDecl *D)
147c71d55469e7d5f7b376a30620617a175a9442da9Argyrios Kyrtzidis    : ObjCContainerDeclInfo(Info_ObjCProtocol,
148c71d55469e7d5f7b376a30620617a175a9442da9Argyrios Kyrtzidis                            /*isForwardRef=*/false,
149ef96ee0be5f100789f451641542a69cd719144d2Douglas Gregor                            /*isRedeclaration=*/D->getPreviousDecl(),
150c71d55469e7d5f7b376a30620617a175a9442da9Argyrios Kyrtzidis                            /*isImplementation=*/false) { }
151c71d55469e7d5f7b376a30620617a175a9442da9Argyrios Kyrtzidis
152c71d55469e7d5f7b376a30620617a175a9442da9Argyrios Kyrtzidis  static bool classof(const DeclInfo *D) {
153c71d55469e7d5f7b376a30620617a175a9442da9Argyrios Kyrtzidis    return D->Kind == Info_ObjCProtocol;
154c71d55469e7d5f7b376a30620617a175a9442da9Argyrios Kyrtzidis  }
155c71d55469e7d5f7b376a30620617a175a9442da9Argyrios Kyrtzidis  static bool classof(const ObjCProtocolDeclInfo *D) { return true; }
156c71d55469e7d5f7b376a30620617a175a9442da9Argyrios Kyrtzidis};
157c71d55469e7d5f7b376a30620617a175a9442da9Argyrios Kyrtzidis
158c71d55469e7d5f7b376a30620617a175a9442da9Argyrios Kyrtzidisstruct ObjCCategoryDeclInfo : public ObjCContainerDeclInfo {
159c71d55469e7d5f7b376a30620617a175a9442da9Argyrios Kyrtzidis  CXIdxObjCCategoryDeclInfo ObjCCatDeclInfo;
160c10a4c8baff3164bee9b7fc293679a5a5a90eb74Argyrios Kyrtzidis  CXIdxObjCProtocolRefListInfo ObjCProtoListInfo;
161c71d55469e7d5f7b376a30620617a175a9442da9Argyrios Kyrtzidis
162c71d55469e7d5f7b376a30620617a175a9442da9Argyrios Kyrtzidis  explicit ObjCCategoryDeclInfo(bool isImplementation)
163c71d55469e7d5f7b376a30620617a175a9442da9Argyrios Kyrtzidis    : ObjCContainerDeclInfo(Info_ObjCCategory,
164c71d55469e7d5f7b376a30620617a175a9442da9Argyrios Kyrtzidis                            /*isForwardRef=*/false,
165c71d55469e7d5f7b376a30620617a175a9442da9Argyrios Kyrtzidis                            /*isRedeclaration=*/isImplementation,
166c71d55469e7d5f7b376a30620617a175a9442da9Argyrios Kyrtzidis                            /*isImplementation=*/isImplementation) { }
167c71d55469e7d5f7b376a30620617a175a9442da9Argyrios Kyrtzidis
168c71d55469e7d5f7b376a30620617a175a9442da9Argyrios Kyrtzidis  static bool classof(const DeclInfo *D) {
169c71d55469e7d5f7b376a30620617a175a9442da9Argyrios Kyrtzidis    return D->Kind == Info_ObjCCategory;
170c71d55469e7d5f7b376a30620617a175a9442da9Argyrios Kyrtzidis  }
171c71d55469e7d5f7b376a30620617a175a9442da9Argyrios Kyrtzidis  static bool classof(const ObjCCategoryDeclInfo *D) { return true; }
172dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis};
173dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis
174792db266f3d2f12a7a16bf37d90074f54bca1e6fArgyrios Kyrtzidisstruct ObjCPropertyDeclInfo : public DeclInfo {
175792db266f3d2f12a7a16bf37d90074f54bca1e6fArgyrios Kyrtzidis  CXIdxObjCPropertyDeclInfo ObjCPropDeclInfo;
176792db266f3d2f12a7a16bf37d90074f54bca1e6fArgyrios Kyrtzidis
177792db266f3d2f12a7a16bf37d90074f54bca1e6fArgyrios Kyrtzidis  ObjCPropertyDeclInfo()
178792db266f3d2f12a7a16bf37d90074f54bca1e6fArgyrios Kyrtzidis    : DeclInfo(Info_ObjCProperty,
179792db266f3d2f12a7a16bf37d90074f54bca1e6fArgyrios Kyrtzidis               /*isRedeclaration=*/false, /*isDefinition=*/false,
180792db266f3d2f12a7a16bf37d90074f54bca1e6fArgyrios Kyrtzidis               /*isContainer=*/false) { }
181792db266f3d2f12a7a16bf37d90074f54bca1e6fArgyrios Kyrtzidis
182792db266f3d2f12a7a16bf37d90074f54bca1e6fArgyrios Kyrtzidis  static bool classof(const DeclInfo *D) {
183792db266f3d2f12a7a16bf37d90074f54bca1e6fArgyrios Kyrtzidis    return D->Kind == Info_ObjCProperty;
184792db266f3d2f12a7a16bf37d90074f54bca1e6fArgyrios Kyrtzidis  }
185792db266f3d2f12a7a16bf37d90074f54bca1e6fArgyrios Kyrtzidis  static bool classof(const ObjCPropertyDeclInfo *D) { return true; }
186792db266f3d2f12a7a16bf37d90074f54bca1e6fArgyrios Kyrtzidis};
187792db266f3d2f12a7a16bf37d90074f54bca1e6fArgyrios Kyrtzidis
1882957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidisstruct CXXClassDeclInfo : public DeclInfo {
1892957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis  CXIdxCXXClassDeclInfo CXXClassInfo;
1902957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis
1912957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis  CXXClassDeclInfo(bool isRedeclaration, bool isDefinition)
1922957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis    : DeclInfo(Info_CXXClass, isRedeclaration, isDefinition, isDefinition) { }
1932957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis
1942957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis  static bool classof(const DeclInfo *D) {
1952957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis    return D->Kind == Info_CXXClass;
1962957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis  }
1972957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis  static bool classof(const CXXClassDeclInfo *D) { return true; }
1982957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis};
1992957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis
200b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidisstruct AttrInfo : public CXIdxAttrInfo {
201b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis  const Attr *A;
202b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis
203b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis  AttrInfo(CXIdxAttrKind Kind, CXCursor C, CXIdxLoc Loc, const Attr *A) {
204b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis    kind = Kind;
205b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis    cursor = C;
206b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis    loc = Loc;
207b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis    this->A = A;
208b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis  }
209b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis
210b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis  static bool classof(const AttrInfo *) { return true; }
211b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis};
212b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis
213b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidisstruct IBOutletCollectionInfo : public AttrInfo {
2142957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis  EntityInfo ClassInfo;
215b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis  CXIdxIBOutletCollectionAttrInfo IBCollInfo;
216b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis
217b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis  IBOutletCollectionInfo(CXCursor C, CXIdxLoc Loc, const Attr *A) :
218b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis    AttrInfo(CXIdxAttr_IBOutletCollection, C, Loc, A) {
219b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis    assert(C.kind == CXCursor_IBOutletCollectionAttr);
220643d3ce93c501d19353f2fa578fee3e97f1d1b4bArgyrios Kyrtzidis    IBCollInfo.objcClass = 0;
221b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis  }
222b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis
223643d3ce93c501d19353f2fa578fee3e97f1d1b4bArgyrios Kyrtzidis  IBOutletCollectionInfo(const IBOutletCollectionInfo &other);
224643d3ce93c501d19353f2fa578fee3e97f1d1b4bArgyrios Kyrtzidis
225b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis  static bool classof(const AttrInfo *A) {
226b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis    return A->kind == CXIdxAttr_IBOutletCollection;
227b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis  }
228b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis  static bool classof(const IBOutletCollectionInfo *D) { return true; }
229b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis};
230b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis
231643d3ce93c501d19353f2fa578fee3e97f1d1b4bArgyrios Kyrtzidisclass AttrListInfo {
232643d3ce93c501d19353f2fa578fee3e97f1d1b4bArgyrios Kyrtzidis  SmallVector<AttrInfo, 2> Attrs;
233643d3ce93c501d19353f2fa578fee3e97f1d1b4bArgyrios Kyrtzidis  SmallVector<IBOutletCollectionInfo, 2> IBCollAttrs;
234643d3ce93c501d19353f2fa578fee3e97f1d1b4bArgyrios Kyrtzidis  SmallVector<CXIdxAttrInfo *, 2> CXAttrs;
235643d3ce93c501d19353f2fa578fee3e97f1d1b4bArgyrios Kyrtzidis  unsigned ref_cnt;
236643d3ce93c501d19353f2fa578fee3e97f1d1b4bArgyrios Kyrtzidis
237643d3ce93c501d19353f2fa578fee3e97f1d1b4bArgyrios Kyrtzidispublic:
238643d3ce93c501d19353f2fa578fee3e97f1d1b4bArgyrios Kyrtzidis  AttrListInfo(const Decl *D,
239643d3ce93c501d19353f2fa578fee3e97f1d1b4bArgyrios Kyrtzidis               IndexingContext &IdxCtx,
240643d3ce93c501d19353f2fa578fee3e97f1d1b4bArgyrios Kyrtzidis               ScratchAlloc &SA);
241643d3ce93c501d19353f2fa578fee3e97f1d1b4bArgyrios Kyrtzidis  AttrListInfo(const AttrListInfo &other);
242643d3ce93c501d19353f2fa578fee3e97f1d1b4bArgyrios Kyrtzidis
243643d3ce93c501d19353f2fa578fee3e97f1d1b4bArgyrios Kyrtzidis  const CXIdxAttrInfo *const *getAttrs() const {
244643d3ce93c501d19353f2fa578fee3e97f1d1b4bArgyrios Kyrtzidis    if (CXAttrs.empty())
245643d3ce93c501d19353f2fa578fee3e97f1d1b4bArgyrios Kyrtzidis      return 0;
246643d3ce93c501d19353f2fa578fee3e97f1d1b4bArgyrios Kyrtzidis    return CXAttrs.data();
247643d3ce93c501d19353f2fa578fee3e97f1d1b4bArgyrios Kyrtzidis  }
248643d3ce93c501d19353f2fa578fee3e97f1d1b4bArgyrios Kyrtzidis  unsigned getNumAttrs() const { return (unsigned)CXAttrs.size(); }
249643d3ce93c501d19353f2fa578fee3e97f1d1b4bArgyrios Kyrtzidis
250643d3ce93c501d19353f2fa578fee3e97f1d1b4bArgyrios Kyrtzidis  /// \brief Retain/Release only useful when we allocate a AttrListInfo from the
251643d3ce93c501d19353f2fa578fee3e97f1d1b4bArgyrios Kyrtzidis  /// BumpPtrAllocator, and not from the stack; so that we keep a pointer
252643d3ce93c501d19353f2fa578fee3e97f1d1b4bArgyrios Kyrtzidis  // in the EntityInfo
253643d3ce93c501d19353f2fa578fee3e97f1d1b4bArgyrios Kyrtzidis  void Retain() { ++ref_cnt; }
254643d3ce93c501d19353f2fa578fee3e97f1d1b4bArgyrios Kyrtzidis  void Release() {
255643d3ce93c501d19353f2fa578fee3e97f1d1b4bArgyrios Kyrtzidis    assert (ref_cnt > 0 && "Reference count is already zero.");
256643d3ce93c501d19353f2fa578fee3e97f1d1b4bArgyrios Kyrtzidis    if (--ref_cnt == 0) {
257643d3ce93c501d19353f2fa578fee3e97f1d1b4bArgyrios Kyrtzidis      // Memory is allocated from a BumpPtrAllocator, no need to delete it.
258643d3ce93c501d19353f2fa578fee3e97f1d1b4bArgyrios Kyrtzidis      this->~AttrListInfo();
259643d3ce93c501d19353f2fa578fee3e97f1d1b4bArgyrios Kyrtzidis    }
260643d3ce93c501d19353f2fa578fee3e97f1d1b4bArgyrios Kyrtzidis  }
261643d3ce93c501d19353f2fa578fee3e97f1d1b4bArgyrios Kyrtzidis};
262643d3ce93c501d19353f2fa578fee3e97f1d1b4bArgyrios Kyrtzidis
263c6b4a5099588fd21b49c80f730a596a64b2766c6Argyrios Kyrtzidisstruct RefFileOccurence {
264c6b4a5099588fd21b49c80f730a596a64b2766c6Argyrios Kyrtzidis  const FileEntry *File;
265c6b4a5099588fd21b49c80f730a596a64b2766c6Argyrios Kyrtzidis  const Decl *Dcl;
266c6b4a5099588fd21b49c80f730a596a64b2766c6Argyrios Kyrtzidis
267c6b4a5099588fd21b49c80f730a596a64b2766c6Argyrios Kyrtzidis  RefFileOccurence(const FileEntry *File, const Decl *Dcl)
268c6b4a5099588fd21b49c80f730a596a64b2766c6Argyrios Kyrtzidis    : File(File), Dcl(Dcl) { }
269c6b4a5099588fd21b49c80f730a596a64b2766c6Argyrios Kyrtzidis};
270c6b4a5099588fd21b49c80f730a596a64b2766c6Argyrios Kyrtzidis
2714e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidisclass IndexingContext {
2724e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis  ASTContext *Ctx;
2734e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis  CXClientData ClientData;
2744e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis  IndexerCallbacks &CB;
2754e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis  unsigned IndexOptions;
2764e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis  CXTranslationUnit CXTU;
2774e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis
278dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis  typedef llvm::DenseMap<const FileEntry *, CXIdxClientFile> FileMapTy;
2792957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis  typedef llvm::DenseMap<const DeclContext *, CXIdxClientContainer>
2802957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis    ContainerMapTy;
2812957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis  typedef llvm::DenseMap<const Decl *, CXIdxClientEntity> EntityMapTy;
2822957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis
2834e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis  FileMapTy FileMap;
2844e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis  ContainerMapTy ContainerMap;
2852957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis  EntityMapTy EntityMap;
2864e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis
287c6b4a5099588fd21b49c80f730a596a64b2766c6Argyrios Kyrtzidis  llvm::DenseSet<RefFileOccurence> RefFileOccurences;
288c6b4a5099588fd21b49c80f730a596a64b2766c6Argyrios Kyrtzidis
28930a2805c2c85e6abfe3149293f83f60da018b2dfArgyrios Kyrtzidis  std::deque<DeclGroupRef> TUDeclsInObjCContainer;
2904e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis
29137f40572c4c78a8c57a7b45266f8b86db172a7c1Argyrios Kyrtzidis  llvm::BumpPtrAllocator StrScratch;
292dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis  unsigned StrAdapterCount;
293643d3ce93c501d19353f2fa578fee3e97f1d1b4bArgyrios Kyrtzidis  friend class ScratchAlloc;
2944e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis
2956ec43adc39006a7fce94188956d0239bd54c0363Argyrios Kyrtzidis  struct ObjCProtocolListInfo {
2966ec43adc39006a7fce94188956d0239bd54c0363Argyrios Kyrtzidis    SmallVector<CXIdxObjCProtocolRefInfo, 4> ProtInfos;
2972957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis    SmallVector<EntityInfo, 4> ProtEntities;
2986ec43adc39006a7fce94188956d0239bd54c0363Argyrios Kyrtzidis    SmallVector<CXIdxObjCProtocolRefInfo *, 4> Prots;
2996ec43adc39006a7fce94188956d0239bd54c0363Argyrios Kyrtzidis
300b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis    CXIdxObjCProtocolRefListInfo getListInfo() const {
301c71d55469e7d5f7b376a30620617a175a9442da9Argyrios Kyrtzidis      CXIdxObjCProtocolRefListInfo Info = { Prots.data(),
302c71d55469e7d5f7b376a30620617a175a9442da9Argyrios Kyrtzidis                                            (unsigned)Prots.size() };
303c71d55469e7d5f7b376a30620617a175a9442da9Argyrios Kyrtzidis      return Info;
304c71d55469e7d5f7b376a30620617a175a9442da9Argyrios Kyrtzidis    }
3056ec43adc39006a7fce94188956d0239bd54c0363Argyrios Kyrtzidis
3066ec43adc39006a7fce94188956d0239bd54c0363Argyrios Kyrtzidis    ObjCProtocolListInfo(const ObjCProtocolList &ProtList,
3076ec43adc39006a7fce94188956d0239bd54c0363Argyrios Kyrtzidis                         IndexingContext &IdxCtx,
308643d3ce93c501d19353f2fa578fee3e97f1d1b4bArgyrios Kyrtzidis                         ScratchAlloc &SA);
3092957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis  };
3102957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis
3112957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis  struct CXXBasesListInfo {
3122957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis    SmallVector<CXIdxBaseClassInfo, 4> BaseInfos;
3132957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis    SmallVector<EntityInfo, 4> BaseEntities;
3142957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis    SmallVector<CXIdxBaseClassInfo *, 4> CXBases;
3152957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis
3162957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis    const CXIdxBaseClassInfo *const *getBases() const {
3172957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis      return CXBases.data();
3182957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis    }
3192957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis    unsigned getNumBases() const { return (unsigned)CXBases.size(); }
3202957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis
3212957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis    CXXBasesListInfo(const CXXRecordDecl *D,
322643d3ce93c501d19353f2fa578fee3e97f1d1b4bArgyrios Kyrtzidis                     IndexingContext &IdxCtx, ScratchAlloc &SA);
323b526a871af40b84d9878eded54a181bf4003b376Argyrios Kyrtzidis
324b526a871af40b84d9878eded54a181bf4003b376Argyrios Kyrtzidis  private:
325b526a871af40b84d9878eded54a181bf4003b376Argyrios Kyrtzidis    SourceLocation getBaseLoc(const CXXBaseSpecifier &Base) const;
3262957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis  };
327b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis
328643d3ce93c501d19353f2fa578fee3e97f1d1b4bArgyrios Kyrtzidis  friend class AttrListInfo;
329643d3ce93c501d19353f2fa578fee3e97f1d1b4bArgyrios Kyrtzidis
3304e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidispublic:
3314e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis  IndexingContext(CXClientData clientData, IndexerCallbacks &indexCallbacks,
3324e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis                  unsigned indexOptions, CXTranslationUnit cxTU)
3334e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis    : Ctx(0), ClientData(clientData), CB(indexCallbacks),
33437f40572c4c78a8c57a7b45266f8b86db172a7c1Argyrios Kyrtzidis      IndexOptions(indexOptions), CXTU(cxTU),
33537f40572c4c78a8c57a7b45266f8b86db172a7c1Argyrios Kyrtzidis      StrScratch(/*size=*/1024), StrAdapterCount(0) { }
3364e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis
3374e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis  ASTContext &getASTContext() const { return *Ctx; }
3384e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis
3394e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis  void setASTContext(ASTContext &ctx);
3407fe90f3bfa6bd7f779ecfd4ba201a296a3a1c8cbArgyrios Kyrtzidis  void setPreprocessor(Preprocessor &PP);
3414e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis
34258d2dbea680a75de266c5eff77cc15c323cfd48aArgyrios Kyrtzidis  bool shouldSuppressRefs() const {
343b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis    return IndexOptions & CXIndexOpt_SuppressRedundantRefs;
344c6b4a5099588fd21b49c80f730a596a64b2766c6Argyrios Kyrtzidis  }
345c6b4a5099588fd21b49c80f730a596a64b2766c6Argyrios Kyrtzidis
34658d2dbea680a75de266c5eff77cc15c323cfd48aArgyrios Kyrtzidis  bool shouldIndexFunctionLocalSymbols() const {
34722490747c123a78feec089539f30426084d348cfArgyrios Kyrtzidis    return IndexOptions & CXIndexOpt_IndexFunctionLocalSymbols;
34822490747c123a78feec089539f30426084d348cfArgyrios Kyrtzidis  }
34922490747c123a78feec089539f30426084d348cfArgyrios Kyrtzidis
35058d2dbea680a75de266c5eff77cc15c323cfd48aArgyrios Kyrtzidis  bool shouldIndexImplicitTemplateInsts() const {
35158d2dbea680a75de266c5eff77cc15c323cfd48aArgyrios Kyrtzidis    return IndexOptions & CXIndexOpt_IndexImplicitTemplateInstantiations;
35258d2dbea680a75de266c5eff77cc15c323cfd48aArgyrios Kyrtzidis  }
35358d2dbea680a75de266c5eff77cc15c323cfd48aArgyrios Kyrtzidis
354b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis  bool shouldAbort();
355b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis
356996e6e564af7483e2d5e0b70df5fdb9f79ec4b5aArgyrios Kyrtzidis  bool hasDiagnosticCallback() const { return CB.diagnostic; }
357996e6e564af7483e2d5e0b70df5fdb9f79ec4b5aArgyrios Kyrtzidis
358dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis  void enteredMainFile(const FileEntry *File);
359dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis
3604e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis  void ppIncludedFile(SourceLocation hashLoc,
3614e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis                      StringRef filename, const FileEntry *File,
3624e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis                      bool isImport, bool isAngled);
3634e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis
3646ec43adc39006a7fce94188956d0239bd54c0363Argyrios Kyrtzidis  void startedTranslationUnit();
3654e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis
3664e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis  void indexDecl(const Decl *D);
3674e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis
3684e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis  void indexTagDecl(const TagDecl *D);
3694e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis
3704e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis  void indexTypeSourceInfo(TypeSourceInfo *TInfo, const NamedDecl *Parent,
3714e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis                           const DeclContext *DC = 0);
3724e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis
3734e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis  void indexTypeLoc(TypeLoc TL, const NamedDecl *Parent,
374e422e45a6a89d450b8eca10f671b49874e87617aArgyrios Kyrtzidis                    const DeclContext *DC = 0);
375e422e45a6a89d450b8eca10f671b49874e87617aArgyrios Kyrtzidis
376e422e45a6a89d450b8eca10f671b49874e87617aArgyrios Kyrtzidis  void indexNestedNameSpecifierLoc(NestedNameSpecifierLoc NNS,
377e422e45a6a89d450b8eca10f671b49874e87617aArgyrios Kyrtzidis                                   const NamedDecl *Parent,
378e422e45a6a89d450b8eca10f671b49874e87617aArgyrios Kyrtzidis                                   const DeclContext *DC = 0);
3794e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis
3804e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis  void indexDeclContext(const DeclContext *DC);
3814e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis
382e422e45a6a89d450b8eca10f671b49874e87617aArgyrios Kyrtzidis  void indexBody(const Stmt *S, const NamedDecl *Parent,
383e422e45a6a89d450b8eca10f671b49874e87617aArgyrios Kyrtzidis                 const DeclContext *DC = 0);
3844e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis
385b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis  void handleDiagnosticSet(CXDiagnosticSet CXDiagSet);
3864e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis
387b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis  bool handleFunction(const FunctionDecl *FD);
3884e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis
389b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis  bool handleVar(const VarDecl *D);
3904e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis
391b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis  bool handleField(const FieldDecl *D);
3924e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis
393b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis  bool handleEnumerator(const EnumConstantDecl *D);
3944e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis
395b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis  bool handleTagDecl(const TagDecl *D);
3964e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis
3972957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis  bool handleTypedefName(const TypedefNameDecl *D);
3984e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis
399b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis  bool handleObjCInterface(const ObjCInterfaceDecl *D);
400b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis  bool handleObjCImplementation(const ObjCImplementationDecl *D);
4014e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis
402b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis  bool handleObjCProtocol(const ObjCProtocolDecl *D);
403b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis
404b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis  bool handleObjCCategory(const ObjCCategoryDecl *D);
405b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis  bool handleObjCCategoryImpl(const ObjCCategoryImplDecl *D);
4064e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis
407b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis  bool handleObjCMethod(const ObjCMethodDecl *D);
4084e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis
409b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis  bool handleSynthesizedObjCProperty(const ObjCPropertyImplDecl *D);
410f911242f43ae1b0a85c323631fe817df95c9cbe9Argyrios Kyrtzidis  bool handleSynthesizedObjCMethod(const ObjCMethodDecl *D, SourceLocation Loc,
411f911242f43ae1b0a85c323631fe817df95c9cbe9Argyrios Kyrtzidis                                   const DeclContext *LexicalDC);
4124e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis
413b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis  bool handleObjCProperty(const ObjCPropertyDecl *D);
4144e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis
41568478b0cc1ff03c0d13ceca6800c5becf08791e7Argyrios Kyrtzidis  bool handleNamespace(const NamespaceDecl *D);
41668478b0cc1ff03c0d13ceca6800c5becf08791e7Argyrios Kyrtzidis
4172957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis  bool handleClassTemplate(const ClassTemplateDecl *D);
4182957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis  bool handleFunctionTemplate(const FunctionTemplateDecl *D);
4192957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis  bool handleTypeAliasTemplate(const TypeAliasTemplateDecl *D);
4202957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis
421b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis  bool handleReference(const NamedDecl *D, SourceLocation Loc, CXCursor Cursor,
422b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis                       const NamedDecl *Parent,
423b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis                       const DeclContext *DC,
424b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis                       const Expr *E = 0,
425b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis                       CXIdxEntityRefKind Kind = CXIdxEntityRef_Direct);
426b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis
427b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis  bool handleReference(const NamedDecl *D, SourceLocation Loc,
4284e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis                       const NamedDecl *Parent,
4294e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis                       const DeclContext *DC,
430aca19be8731fc31cff68702de0dc7f30ce908979Argyrios Kyrtzidis                       const Expr *E = 0,
431aca19be8731fc31cff68702de0dc7f30ce908979Argyrios Kyrtzidis                       CXIdxEntityRefKind Kind = CXIdxEntityRef_Direct);
4324e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis
4334e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis  bool isNotFromSourceFile(SourceLocation Loc) const;
4344e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis
43521ee5707e6e59d982d2f2ae28e079c7ff46dc519Argyrios Kyrtzidis  void indexTopLevelDecl(Decl *D);
4364e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis  void indexTUDeclsInObjCContainer();
4374e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis  void indexDeclGroupRef(DeclGroupRef DG);
4384e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis
4394e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis  void addTUDeclInObjCContainer(DeclGroupRef DG) {
4404e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis    TUDeclsInObjCContainer.push_back(DG);
4414e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis  }
4424e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis
443dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis  void translateLoc(SourceLocation Loc, CXIdxClientFile *indexFile, CXFile *file,
4444e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis                    unsigned *line, unsigned *column, unsigned *offset);
4454e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis
4462957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis  CXIdxClientContainer getClientContainerForDC(const DeclContext *DC) const;
4472957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis  void addContainerInMap(const DeclContext *DC, CXIdxClientContainer container);
4482957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis
4492957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis  CXIdxClientEntity getClientEntity(const Decl *D) const;
4502957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis  void setClientEntity(const Decl *D, CXIdxClientEntity client);
4512957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis
4526d968363877388f0a0268711d59367907b465ae1Argyrios Kyrtzidis  static bool isTemplateImplicitInstantiation(const Decl *D);
4536d968363877388f0a0268711d59367907b465ae1Argyrios Kyrtzidis
4544e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidisprivate:
455b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis  bool handleDecl(const NamedDecl *D,
456dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis                  SourceLocation Loc, CXCursor Cursor,
457f911242f43ae1b0a85c323631fe817df95c9cbe9Argyrios Kyrtzidis                  DeclInfo &DInfo,
458f911242f43ae1b0a85c323631fe817df95c9cbe9Argyrios Kyrtzidis                  const DeclContext *LexicalDC = 0);
459dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis
460b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis  bool handleObjCContainer(const ObjCContainerDecl *D,
461dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis                           SourceLocation Loc, CXCursor Cursor,
462dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis                           ObjCContainerDeclInfo &ContDInfo);
4634e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis
4642957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis  bool handleCXXRecordDecl(const CXXRecordDecl *RD, const NamedDecl *OrigD);
465dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis
466b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis  bool markEntityOccurrenceInFile(const NamedDecl *D, SourceLocation Loc);
467b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis
4684e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis  const NamedDecl *getEntityDecl(const NamedDecl *D) const;
4694e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis
4702957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis  const DeclContext *getEntityContainer(const Decl *D) const;
4712957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis
472dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis  CXIdxClientFile getIndexFile(const FileEntry *File);
4734e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis
4744e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis  CXIdxLoc getIndexLoc(SourceLocation Loc) const;
4754e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis
4764e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis  void getEntityInfo(const NamedDecl *D,
4772957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis                     EntityInfo &EntityInfo,
478643d3ce93c501d19353f2fa578fee3e97f1d1b4bArgyrios Kyrtzidis                     ScratchAlloc &SA);
4794e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis
4802957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis  void getContainerInfo(const DeclContext *DC, ContainerInfo &ContInfo);
4812957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis
482b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis  CXCursor getCursor(const Decl *D) {
483b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis    return cxcursor::MakeCXCursor(const_cast<Decl*>(D), CXTU);
4844e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis  }
4854e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis
4864e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis  CXCursor getRefCursor(const NamedDecl *D, SourceLocation Loc);
4872957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis
488d08900848307fdaea19d52249bdced94eefdb9bbArgyrios Kyrtzidis  static bool shouldIgnoreIfImplicit(const Decl *D);
4894e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis};
4904e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis
491643d3ce93c501d19353f2fa578fee3e97f1d1b4bArgyrios Kyrtzidisclass ScratchAlloc {
492643d3ce93c501d19353f2fa578fee3e97f1d1b4bArgyrios Kyrtzidis  IndexingContext &IdxCtx;
493643d3ce93c501d19353f2fa578fee3e97f1d1b4bArgyrios Kyrtzidis
494643d3ce93c501d19353f2fa578fee3e97f1d1b4bArgyrios Kyrtzidispublic:
495643d3ce93c501d19353f2fa578fee3e97f1d1b4bArgyrios Kyrtzidis  explicit ScratchAlloc(IndexingContext &indexCtx) : IdxCtx(indexCtx) {
496643d3ce93c501d19353f2fa578fee3e97f1d1b4bArgyrios Kyrtzidis    ++IdxCtx.StrAdapterCount;
497643d3ce93c501d19353f2fa578fee3e97f1d1b4bArgyrios Kyrtzidis  }
498643d3ce93c501d19353f2fa578fee3e97f1d1b4bArgyrios Kyrtzidis
499643d3ce93c501d19353f2fa578fee3e97f1d1b4bArgyrios Kyrtzidis  ~ScratchAlloc() {
500643d3ce93c501d19353f2fa578fee3e97f1d1b4bArgyrios Kyrtzidis    --IdxCtx.StrAdapterCount;
501643d3ce93c501d19353f2fa578fee3e97f1d1b4bArgyrios Kyrtzidis    if (IdxCtx.StrAdapterCount == 0)
502643d3ce93c501d19353f2fa578fee3e97f1d1b4bArgyrios Kyrtzidis      IdxCtx.StrScratch.Reset();
503643d3ce93c501d19353f2fa578fee3e97f1d1b4bArgyrios Kyrtzidis  }
504643d3ce93c501d19353f2fa578fee3e97f1d1b4bArgyrios Kyrtzidis
505643d3ce93c501d19353f2fa578fee3e97f1d1b4bArgyrios Kyrtzidis  const char *toCStr(StringRef Str);
506643d3ce93c501d19353f2fa578fee3e97f1d1b4bArgyrios Kyrtzidis  const char *copyCStr(StringRef Str);
507643d3ce93c501d19353f2fa578fee3e97f1d1b4bArgyrios Kyrtzidis
508643d3ce93c501d19353f2fa578fee3e97f1d1b4bArgyrios Kyrtzidis  template <typename T>
509643d3ce93c501d19353f2fa578fee3e97f1d1b4bArgyrios Kyrtzidis  T *allocate() {
510643d3ce93c501d19353f2fa578fee3e97f1d1b4bArgyrios Kyrtzidis    return IdxCtx.StrScratch.Allocate<T>();
511643d3ce93c501d19353f2fa578fee3e97f1d1b4bArgyrios Kyrtzidis  }
512643d3ce93c501d19353f2fa578fee3e97f1d1b4bArgyrios Kyrtzidis};
513643d3ce93c501d19353f2fa578fee3e97f1d1b4bArgyrios Kyrtzidis
5144e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis}} // end clang::cxindex
515c6b4a5099588fd21b49c80f730a596a64b2766c6Argyrios Kyrtzidis
516c6b4a5099588fd21b49c80f730a596a64b2766c6Argyrios Kyrtzidisnamespace llvm {
517c6b4a5099588fd21b49c80f730a596a64b2766c6Argyrios Kyrtzidis  /// Define DenseMapInfo so that FileID's can be used as keys in DenseMap and
518c6b4a5099588fd21b49c80f730a596a64b2766c6Argyrios Kyrtzidis  /// DenseSets.
519c6b4a5099588fd21b49c80f730a596a64b2766c6Argyrios Kyrtzidis  template <>
520c6b4a5099588fd21b49c80f730a596a64b2766c6Argyrios Kyrtzidis  struct DenseMapInfo<clang::cxindex::RefFileOccurence> {
521c6b4a5099588fd21b49c80f730a596a64b2766c6Argyrios Kyrtzidis    static inline clang::cxindex::RefFileOccurence getEmptyKey() {
522c6b4a5099588fd21b49c80f730a596a64b2766c6Argyrios Kyrtzidis      return clang::cxindex::RefFileOccurence(0, 0);
523c6b4a5099588fd21b49c80f730a596a64b2766c6Argyrios Kyrtzidis    }
524c6b4a5099588fd21b49c80f730a596a64b2766c6Argyrios Kyrtzidis
525c6b4a5099588fd21b49c80f730a596a64b2766c6Argyrios Kyrtzidis    static inline clang::cxindex::RefFileOccurence getTombstoneKey() {
526c6b4a5099588fd21b49c80f730a596a64b2766c6Argyrios Kyrtzidis      return clang::cxindex::RefFileOccurence((const clang::FileEntry *)~0,
527c6b4a5099588fd21b49c80f730a596a64b2766c6Argyrios Kyrtzidis                                              (const clang::Decl *)~0);
528c6b4a5099588fd21b49c80f730a596a64b2766c6Argyrios Kyrtzidis    }
529c6b4a5099588fd21b49c80f730a596a64b2766c6Argyrios Kyrtzidis
530c6b4a5099588fd21b49c80f730a596a64b2766c6Argyrios Kyrtzidis    static unsigned getHashValue(clang::cxindex::RefFileOccurence S) {
531c6b4a5099588fd21b49c80f730a596a64b2766c6Argyrios Kyrtzidis      llvm::FoldingSetNodeID ID;
532c6b4a5099588fd21b49c80f730a596a64b2766c6Argyrios Kyrtzidis      ID.AddPointer(S.File);
533c6b4a5099588fd21b49c80f730a596a64b2766c6Argyrios Kyrtzidis      ID.AddPointer(S.Dcl);
534c6b4a5099588fd21b49c80f730a596a64b2766c6Argyrios Kyrtzidis      return ID.ComputeHash();
535c6b4a5099588fd21b49c80f730a596a64b2766c6Argyrios Kyrtzidis    }
536c6b4a5099588fd21b49c80f730a596a64b2766c6Argyrios Kyrtzidis
537c6b4a5099588fd21b49c80f730a596a64b2766c6Argyrios Kyrtzidis    static bool isEqual(clang::cxindex::RefFileOccurence LHS,
538c6b4a5099588fd21b49c80f730a596a64b2766c6Argyrios Kyrtzidis                        clang::cxindex::RefFileOccurence RHS) {
539c6b4a5099588fd21b49c80f730a596a64b2766c6Argyrios Kyrtzidis      return LHS.File == RHS.File && LHS.Dcl == RHS.Dcl;
540c6b4a5099588fd21b49c80f730a596a64b2766c6Argyrios Kyrtzidis    }
541c6b4a5099588fd21b49c80f730a596a64b2766c6Argyrios Kyrtzidis  };
542c6b4a5099588fd21b49c80f730a596a64b2766c6Argyrios Kyrtzidis}
543