IndexingContext.h revision b395c63b473bf1b3783bff371a993332e8c4c5e3
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"
164e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis
174e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidisnamespace clang {
184e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis  class FileEntry;
194e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis  class ObjCPropertyDecl;
20dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis  class ObjCClassDecl;
214e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis
224e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidisnamespace cxindex {
234e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis  class IndexingContext;
244e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis
25dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidisstruct DeclInfo : public CXIdxDeclInfo {
26dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis  CXIdxEntityInfo CXEntInfo;
27c71d55469e7d5f7b376a30620617a175a9442da9Argyrios Kyrtzidis  enum DInfoKind {
28c71d55469e7d5f7b376a30620617a175a9442da9Argyrios Kyrtzidis    Info_Decl,
29c71d55469e7d5f7b376a30620617a175a9442da9Argyrios Kyrtzidis
30c71d55469e7d5f7b376a30620617a175a9442da9Argyrios Kyrtzidis    Info_ObjCContainer,
31c71d55469e7d5f7b376a30620617a175a9442da9Argyrios Kyrtzidis      Info_ObjCInterface,
32c71d55469e7d5f7b376a30620617a175a9442da9Argyrios Kyrtzidis      Info_ObjCProtocol,
33c71d55469e7d5f7b376a30620617a175a9442da9Argyrios Kyrtzidis      Info_ObjCCategory
34c71d55469e7d5f7b376a30620617a175a9442da9Argyrios Kyrtzidis  };
35c71d55469e7d5f7b376a30620617a175a9442da9Argyrios Kyrtzidis
36c71d55469e7d5f7b376a30620617a175a9442da9Argyrios Kyrtzidis  DInfoKind Kind;
37c71d55469e7d5f7b376a30620617a175a9442da9Argyrios Kyrtzidis
38c71d55469e7d5f7b376a30620617a175a9442da9Argyrios Kyrtzidis  DeclInfo(bool isRedeclaration, bool isDefinition, bool isContainer)
39c71d55469e7d5f7b376a30620617a175a9442da9Argyrios Kyrtzidis    : Kind(Info_Decl) {
40c71d55469e7d5f7b376a30620617a175a9442da9Argyrios Kyrtzidis    this->isRedeclaration = isRedeclaration;
41c71d55469e7d5f7b376a30620617a175a9442da9Argyrios Kyrtzidis    this->isDefinition = isDefinition;
42c71d55469e7d5f7b376a30620617a175a9442da9Argyrios Kyrtzidis    this->isContainer = isContainer;
43b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis    attributes = 0;
44b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis    numAttributes = 0;
45c71d55469e7d5f7b376a30620617a175a9442da9Argyrios Kyrtzidis  }
46c71d55469e7d5f7b376a30620617a175a9442da9Argyrios Kyrtzidis  DeclInfo(DInfoKind K,
47c71d55469e7d5f7b376a30620617a175a9442da9Argyrios Kyrtzidis           bool isRedeclaration, bool isDefinition, bool isContainer)
48c71d55469e7d5f7b376a30620617a175a9442da9Argyrios Kyrtzidis    : Kind(K) {
49c71d55469e7d5f7b376a30620617a175a9442da9Argyrios Kyrtzidis    this->isRedeclaration = isRedeclaration;
50c71d55469e7d5f7b376a30620617a175a9442da9Argyrios Kyrtzidis    this->isDefinition = isDefinition;
51c71d55469e7d5f7b376a30620617a175a9442da9Argyrios Kyrtzidis    this->isContainer = isContainer;
52b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis    attributes = 0;
53b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis    numAttributes = 0;
54c71d55469e7d5f7b376a30620617a175a9442da9Argyrios Kyrtzidis  }
55c71d55469e7d5f7b376a30620617a175a9442da9Argyrios Kyrtzidis
56c71d55469e7d5f7b376a30620617a175a9442da9Argyrios Kyrtzidis  static bool classof(const DeclInfo *) { return true; }
57dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis};
58dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis
59dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidisstruct ObjCContainerDeclInfo : public DeclInfo {
606ec43adc39006a7fce94188956d0239bd54c0363Argyrios Kyrtzidis  CXIdxObjCContainerDeclInfo ObjCContDeclInfo;
61dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis
62c71d55469e7d5f7b376a30620617a175a9442da9Argyrios Kyrtzidis  ObjCContainerDeclInfo(bool isForwardRef,
63c71d55469e7d5f7b376a30620617a175a9442da9Argyrios Kyrtzidis                        bool isRedeclaration,
64c71d55469e7d5f7b376a30620617a175a9442da9Argyrios Kyrtzidis                        bool isImplementation)
65c71d55469e7d5f7b376a30620617a175a9442da9Argyrios Kyrtzidis    : DeclInfo(Info_ObjCContainer, isRedeclaration,
66c71d55469e7d5f7b376a30620617a175a9442da9Argyrios Kyrtzidis               /*isDefinition=*/!isForwardRef, /*isContainer=*/!isForwardRef) {
67c71d55469e7d5f7b376a30620617a175a9442da9Argyrios Kyrtzidis    init(isForwardRef, isImplementation);
68c71d55469e7d5f7b376a30620617a175a9442da9Argyrios Kyrtzidis  }
69c71d55469e7d5f7b376a30620617a175a9442da9Argyrios Kyrtzidis  ObjCContainerDeclInfo(DInfoKind K,
70c71d55469e7d5f7b376a30620617a175a9442da9Argyrios Kyrtzidis                        bool isForwardRef,
71c71d55469e7d5f7b376a30620617a175a9442da9Argyrios Kyrtzidis                        bool isRedeclaration,
72c71d55469e7d5f7b376a30620617a175a9442da9Argyrios Kyrtzidis                        bool isImplementation)
73c71d55469e7d5f7b376a30620617a175a9442da9Argyrios Kyrtzidis    : DeclInfo(K, isRedeclaration, /*isDefinition=*/!isForwardRef,
74c71d55469e7d5f7b376a30620617a175a9442da9Argyrios Kyrtzidis               /*isContainer=*/!isForwardRef) {
75c71d55469e7d5f7b376a30620617a175a9442da9Argyrios Kyrtzidis    init(isForwardRef, isImplementation);
76c71d55469e7d5f7b376a30620617a175a9442da9Argyrios Kyrtzidis  }
77c71d55469e7d5f7b376a30620617a175a9442da9Argyrios Kyrtzidis
78c71d55469e7d5f7b376a30620617a175a9442da9Argyrios Kyrtzidis  static bool classof(const DeclInfo *D) {
79c71d55469e7d5f7b376a30620617a175a9442da9Argyrios Kyrtzidis    return Info_ObjCContainer <= D->Kind && D->Kind <= Info_ObjCCategory;
80c71d55469e7d5f7b376a30620617a175a9442da9Argyrios Kyrtzidis  }
81c71d55469e7d5f7b376a30620617a175a9442da9Argyrios Kyrtzidis  static bool classof(const ObjCContainerDeclInfo *D) { return true; }
82c71d55469e7d5f7b376a30620617a175a9442da9Argyrios Kyrtzidis
83c71d55469e7d5f7b376a30620617a175a9442da9Argyrios Kyrtzidisprivate:
84c71d55469e7d5f7b376a30620617a175a9442da9Argyrios Kyrtzidis  void init(bool isForwardRef, bool isImplementation) {
85c71d55469e7d5f7b376a30620617a175a9442da9Argyrios Kyrtzidis    if (isForwardRef)
86c71d55469e7d5f7b376a30620617a175a9442da9Argyrios Kyrtzidis      ObjCContDeclInfo.kind = CXIdxObjCContainer_ForwardRef;
87c71d55469e7d5f7b376a30620617a175a9442da9Argyrios Kyrtzidis    else if (isImplementation)
88c71d55469e7d5f7b376a30620617a175a9442da9Argyrios Kyrtzidis      ObjCContDeclInfo.kind = CXIdxObjCContainer_Implementation;
89c71d55469e7d5f7b376a30620617a175a9442da9Argyrios Kyrtzidis    else
90c71d55469e7d5f7b376a30620617a175a9442da9Argyrios Kyrtzidis      ObjCContDeclInfo.kind = CXIdxObjCContainer_Interface;
91c71d55469e7d5f7b376a30620617a175a9442da9Argyrios Kyrtzidis  }
926ec43adc39006a7fce94188956d0239bd54c0363Argyrios Kyrtzidis};
936ec43adc39006a7fce94188956d0239bd54c0363Argyrios Kyrtzidis
94c71d55469e7d5f7b376a30620617a175a9442da9Argyrios Kyrtzidisstruct ObjCInterfaceDeclInfo : public ObjCContainerDeclInfo {
956ec43adc39006a7fce94188956d0239bd54c0363Argyrios Kyrtzidis  CXIdxObjCInterfaceDeclInfo ObjCInterDeclInfo;
96c71d55469e7d5f7b376a30620617a175a9442da9Argyrios Kyrtzidis  CXIdxObjCProtocolRefListInfo ObjCProtoListInfo;
97c71d55469e7d5f7b376a30620617a175a9442da9Argyrios Kyrtzidis
98c71d55469e7d5f7b376a30620617a175a9442da9Argyrios Kyrtzidis  ObjCInterfaceDeclInfo(const ObjCInterfaceDecl *D)
99c71d55469e7d5f7b376a30620617a175a9442da9Argyrios Kyrtzidis    : ObjCContainerDeclInfo(Info_ObjCInterface,
100c71d55469e7d5f7b376a30620617a175a9442da9Argyrios Kyrtzidis                            /*isForwardRef=*/false,
101c71d55469e7d5f7b376a30620617a175a9442da9Argyrios Kyrtzidis                            /*isRedeclaration=*/D->isInitiallyForwardDecl(),
102c71d55469e7d5f7b376a30620617a175a9442da9Argyrios Kyrtzidis                            /*isImplementation=*/false) { }
103c71d55469e7d5f7b376a30620617a175a9442da9Argyrios Kyrtzidis
104c71d55469e7d5f7b376a30620617a175a9442da9Argyrios Kyrtzidis  static bool classof(const DeclInfo *D) {
105c71d55469e7d5f7b376a30620617a175a9442da9Argyrios Kyrtzidis    return D->Kind == Info_ObjCInterface;
106c71d55469e7d5f7b376a30620617a175a9442da9Argyrios Kyrtzidis  }
107c71d55469e7d5f7b376a30620617a175a9442da9Argyrios Kyrtzidis  static bool classof(const ObjCInterfaceDeclInfo *D) { return true; }
1086ec43adc39006a7fce94188956d0239bd54c0363Argyrios Kyrtzidis};
1096ec43adc39006a7fce94188956d0239bd54c0363Argyrios Kyrtzidis
110c71d55469e7d5f7b376a30620617a175a9442da9Argyrios Kyrtzidisstruct ObjCProtocolDeclInfo : public ObjCContainerDeclInfo {
111c71d55469e7d5f7b376a30620617a175a9442da9Argyrios Kyrtzidis  CXIdxObjCProtocolRefListInfo ObjCProtoRefListInfo;
112c71d55469e7d5f7b376a30620617a175a9442da9Argyrios Kyrtzidis
113c71d55469e7d5f7b376a30620617a175a9442da9Argyrios Kyrtzidis  ObjCProtocolDeclInfo(const ObjCProtocolDecl *D)
114c71d55469e7d5f7b376a30620617a175a9442da9Argyrios Kyrtzidis    : ObjCContainerDeclInfo(Info_ObjCProtocol,
115c71d55469e7d5f7b376a30620617a175a9442da9Argyrios Kyrtzidis                            /*isForwardRef=*/false,
116c71d55469e7d5f7b376a30620617a175a9442da9Argyrios Kyrtzidis                            /*isRedeclaration=*/D->isInitiallyForwardDecl(),
117c71d55469e7d5f7b376a30620617a175a9442da9Argyrios Kyrtzidis                            /*isImplementation=*/false) { }
118c71d55469e7d5f7b376a30620617a175a9442da9Argyrios Kyrtzidis
119c71d55469e7d5f7b376a30620617a175a9442da9Argyrios Kyrtzidis  static bool classof(const DeclInfo *D) {
120c71d55469e7d5f7b376a30620617a175a9442da9Argyrios Kyrtzidis    return D->Kind == Info_ObjCProtocol;
121c71d55469e7d5f7b376a30620617a175a9442da9Argyrios Kyrtzidis  }
122c71d55469e7d5f7b376a30620617a175a9442da9Argyrios Kyrtzidis  static bool classof(const ObjCProtocolDeclInfo *D) { return true; }
123c71d55469e7d5f7b376a30620617a175a9442da9Argyrios Kyrtzidis};
124c71d55469e7d5f7b376a30620617a175a9442da9Argyrios Kyrtzidis
125c71d55469e7d5f7b376a30620617a175a9442da9Argyrios Kyrtzidisstruct ObjCCategoryDeclInfo : public ObjCContainerDeclInfo {
126c71d55469e7d5f7b376a30620617a175a9442da9Argyrios Kyrtzidis  CXIdxObjCCategoryDeclInfo ObjCCatDeclInfo;
127c71d55469e7d5f7b376a30620617a175a9442da9Argyrios Kyrtzidis
128c71d55469e7d5f7b376a30620617a175a9442da9Argyrios Kyrtzidis  explicit ObjCCategoryDeclInfo(bool isImplementation)
129c71d55469e7d5f7b376a30620617a175a9442da9Argyrios Kyrtzidis    : ObjCContainerDeclInfo(Info_ObjCCategory,
130c71d55469e7d5f7b376a30620617a175a9442da9Argyrios Kyrtzidis                            /*isForwardRef=*/false,
131c71d55469e7d5f7b376a30620617a175a9442da9Argyrios Kyrtzidis                            /*isRedeclaration=*/isImplementation,
132c71d55469e7d5f7b376a30620617a175a9442da9Argyrios Kyrtzidis                            /*isImplementation=*/isImplementation) { }
133c71d55469e7d5f7b376a30620617a175a9442da9Argyrios Kyrtzidis
134c71d55469e7d5f7b376a30620617a175a9442da9Argyrios Kyrtzidis  static bool classof(const DeclInfo *D) {
135c71d55469e7d5f7b376a30620617a175a9442da9Argyrios Kyrtzidis    return D->Kind == Info_ObjCCategory;
136c71d55469e7d5f7b376a30620617a175a9442da9Argyrios Kyrtzidis  }
137c71d55469e7d5f7b376a30620617a175a9442da9Argyrios Kyrtzidis  static bool classof(const ObjCCategoryDeclInfo *D) { return true; }
138dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis};
139dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis
140b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidisstruct AttrInfo : public CXIdxAttrInfo {
141b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis  const Attr *A;
142b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis
143b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis  AttrInfo(CXIdxAttrKind Kind, CXCursor C, CXIdxLoc Loc, const Attr *A) {
144b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis    kind = Kind;
145b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis    cursor = C;
146b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis    loc = Loc;
147b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis    this->A = A;
148b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis  }
149b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis
150b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis  static bool classof(const AttrInfo *) { return true; }
151b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis};
152b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis
153b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidisstruct IBOutletCollectionInfo : public AttrInfo {
154b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis  CXIdxEntityInfo CXClassInfo;
155b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis  CXIdxIBOutletCollectionAttrInfo IBCollInfo;
156b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis
157b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis  IBOutletCollectionInfo(CXCursor C, CXIdxLoc Loc, const Attr *A) :
158b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis    AttrInfo(CXIdxAttr_IBOutletCollection, C, Loc, A) {
159b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis    assert(C.kind == CXCursor_IBOutletCollectionAttr);
160b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis  }
161b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis
162b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis  static bool classof(const AttrInfo *A) {
163b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis    return A->kind == CXIdxAttr_IBOutletCollection;
164b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis  }
165b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis  static bool classof(const IBOutletCollectionInfo *D) { return true; }
166b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis};
167b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis
168c6b4a5099588fd21b49c80f730a596a64b2766c6Argyrios Kyrtzidisstruct RefFileOccurence {
169c6b4a5099588fd21b49c80f730a596a64b2766c6Argyrios Kyrtzidis  const FileEntry *File;
170c6b4a5099588fd21b49c80f730a596a64b2766c6Argyrios Kyrtzidis  const Decl *Dcl;
171c6b4a5099588fd21b49c80f730a596a64b2766c6Argyrios Kyrtzidis
172c6b4a5099588fd21b49c80f730a596a64b2766c6Argyrios Kyrtzidis  RefFileOccurence(const FileEntry *File, const Decl *Dcl)
173c6b4a5099588fd21b49c80f730a596a64b2766c6Argyrios Kyrtzidis    : File(File), Dcl(Dcl) { }
174c6b4a5099588fd21b49c80f730a596a64b2766c6Argyrios Kyrtzidis};
175c6b4a5099588fd21b49c80f730a596a64b2766c6Argyrios Kyrtzidis
1764e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidisclass IndexingContext {
1774e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis  ASTContext *Ctx;
1784e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis  CXClientData ClientData;
1794e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis  IndexerCallbacks &CB;
1804e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis  unsigned IndexOptions;
1814e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis  CXTranslationUnit CXTU;
1824e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis
183dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis  typedef llvm::DenseMap<const FileEntry *, CXIdxClientFile> FileMapTy;
184dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis  typedef llvm::DenseMap<const DeclContext *, CXIdxClientContainer> ContainerMapTy;
1854e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis  FileMapTy FileMap;
1864e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis  ContainerMapTy ContainerMap;
1874e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis
188c6b4a5099588fd21b49c80f730a596a64b2766c6Argyrios Kyrtzidis  llvm::DenseSet<RefFileOccurence> RefFileOccurences;
189c6b4a5099588fd21b49c80f730a596a64b2766c6Argyrios Kyrtzidis
1904e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis  SmallVector<DeclGroupRef, 8> TUDeclsInObjCContainer;
1914e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis
1924e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis  llvm::SmallString<256> StrScratch;
193dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis  unsigned StrAdapterCount;
1944e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis
1954e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis  class StrAdapter {
1964e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis    llvm::SmallString<256> &Scratch;
197dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis    IndexingContext &IdxCtx;
1984e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis
1994e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis  public:
200dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis    StrAdapter(IndexingContext &indexCtx)
201dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis      : Scratch(indexCtx.StrScratch), IdxCtx(indexCtx) {
202dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis      ++IdxCtx.StrAdapterCount;
203dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis    }
204dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis
205dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis    ~StrAdapter() {
206dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis      --IdxCtx.StrAdapterCount;
207dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis      if (IdxCtx.StrAdapterCount == 0)
208dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis        Scratch.clear();
209dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis    }
2104e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis
2114e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis    const char *toCStr(StringRef Str);
2124e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis
2134e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis    unsigned getCurSize() const { return Scratch.size(); }
2144e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis
2154e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis    const char *getCStr(unsigned CharIndex) {
2164e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis      Scratch.push_back('\0');
2174e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis      return Scratch.data() + CharIndex;
2184e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis    }
2194e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis
2204e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis    SmallVectorImpl<char> &getBuffer() { return Scratch; }
2214e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis  };
2224e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis
2236ec43adc39006a7fce94188956d0239bd54c0363Argyrios Kyrtzidis  struct ObjCProtocolListInfo {
2246ec43adc39006a7fce94188956d0239bd54c0363Argyrios Kyrtzidis    SmallVector<CXIdxObjCProtocolRefInfo, 4> ProtInfos;
2256ec43adc39006a7fce94188956d0239bd54c0363Argyrios Kyrtzidis    SmallVector<CXIdxEntityInfo, 4> ProtEntities;
2266ec43adc39006a7fce94188956d0239bd54c0363Argyrios Kyrtzidis    SmallVector<CXIdxObjCProtocolRefInfo *, 4> Prots;
2276ec43adc39006a7fce94188956d0239bd54c0363Argyrios Kyrtzidis
228b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis    CXIdxObjCProtocolRefListInfo getListInfo() const {
229c71d55469e7d5f7b376a30620617a175a9442da9Argyrios Kyrtzidis      CXIdxObjCProtocolRefListInfo Info = { Prots.data(),
230c71d55469e7d5f7b376a30620617a175a9442da9Argyrios Kyrtzidis                                            (unsigned)Prots.size() };
231c71d55469e7d5f7b376a30620617a175a9442da9Argyrios Kyrtzidis      return Info;
232c71d55469e7d5f7b376a30620617a175a9442da9Argyrios Kyrtzidis    }
2336ec43adc39006a7fce94188956d0239bd54c0363Argyrios Kyrtzidis
2346ec43adc39006a7fce94188956d0239bd54c0363Argyrios Kyrtzidis    ObjCProtocolListInfo(const ObjCProtocolList &ProtList,
2356ec43adc39006a7fce94188956d0239bd54c0363Argyrios Kyrtzidis                         IndexingContext &IdxCtx,
2366ec43adc39006a7fce94188956d0239bd54c0363Argyrios Kyrtzidis                         IndexingContext::StrAdapter &SA);
2376ec43adc39006a7fce94188956d0239bd54c0363Argyrios Kyrtzidis  };
2386ec43adc39006a7fce94188956d0239bd54c0363Argyrios Kyrtzidis
239b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis  struct AttrListInfo {
240b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis    SmallVector<AttrInfo, 2> Attrs;
241b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis    SmallVector<IBOutletCollectionInfo, 2> IBCollAttrs;
242b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis    SmallVector<CXIdxAttrInfo *, 2> CXAttrs;
243b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis
244b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis    const CXIdxAttrInfo *const *getAttrs() const {
245b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis      return CXAttrs.data();
246b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis    }
247b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis    unsigned getNumAttrs() const { return (unsigned)CXAttrs.size(); }
248b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis
249b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis    AttrListInfo(const Decl *D,
250b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis                 IndexingContext &IdxCtx,
251b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis                 IndexingContext::StrAdapter &SA);
252b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis};
253b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis
2544e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidispublic:
2554e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis  IndexingContext(CXClientData clientData, IndexerCallbacks &indexCallbacks,
2564e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis                  unsigned indexOptions, CXTranslationUnit cxTU)
2574e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis    : Ctx(0), ClientData(clientData), CB(indexCallbacks),
258dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis      IndexOptions(indexOptions), CXTU(cxTU), StrAdapterCount(0) { }
2594e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis
2604e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis  ASTContext &getASTContext() const { return *Ctx; }
2614e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis
2624e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis  void setASTContext(ASTContext &ctx);
2634e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis
264b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis  bool suppressRefs() const {
265b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis    return IndexOptions & CXIndexOpt_SuppressRedundantRefs;
266c6b4a5099588fd21b49c80f730a596a64b2766c6Argyrios Kyrtzidis  }
267c6b4a5099588fd21b49c80f730a596a64b2766c6Argyrios Kyrtzidis
268b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis  bool shouldAbort();
269b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis
270dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis  void enteredMainFile(const FileEntry *File);
271dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis
2724e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis  void ppIncludedFile(SourceLocation hashLoc,
2734e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis                      StringRef filename, const FileEntry *File,
2744e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis                      bool isImport, bool isAngled);
2754e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis
2766ec43adc39006a7fce94188956d0239bd54c0363Argyrios Kyrtzidis  void startedTranslationUnit();
2774e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis
2784e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis  void indexDecl(const Decl *D);
2794e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis
2804e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis  void indexTagDecl(const TagDecl *D);
2814e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis
2824e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis  void indexTypeSourceInfo(TypeSourceInfo *TInfo, const NamedDecl *Parent,
2834e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis                           const DeclContext *DC = 0);
2844e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis
2854e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis  void indexTypeLoc(TypeLoc TL, const NamedDecl *Parent,
2864e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis                           const DeclContext *DC);
2874e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis
2884e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis  void indexDeclContext(const DeclContext *DC);
2894e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis
2904e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis  void indexBody(const Stmt *S, const DeclContext *DC);
2914e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis
292b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis  void handleDiagnosticSet(CXDiagnosticSet CXDiagSet);
2934e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis
294b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis  bool handleFunction(const FunctionDecl *FD);
2954e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis
296b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis  bool handleVar(const VarDecl *D);
2974e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis
298b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis  bool handleField(const FieldDecl *D);
2994e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis
300b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis  bool handleEnumerator(const EnumConstantDecl *D);
3014e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis
302b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis  bool handleTagDecl(const TagDecl *D);
3034e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis
304b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis  bool handleTypedef(const TypedefDecl *D);
3054e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis
306b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis  bool handleObjCClass(const ObjCClassDecl *D);
307b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis  bool handleObjCInterface(const ObjCInterfaceDecl *D);
308b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis  bool handleObjCImplementation(const ObjCImplementationDecl *D);
3094e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis
310b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis  bool handleObjCForwardProtocol(const ObjCProtocolDecl *D,
311dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis                                 SourceLocation Loc,
312dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis                                 bool isRedeclaration);
313dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis
314b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis  bool handleObjCProtocol(const ObjCProtocolDecl *D);
315b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis
316b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis  bool handleObjCCategory(const ObjCCategoryDecl *D);
317b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis  bool handleObjCCategoryImpl(const ObjCCategoryImplDecl *D);
3184e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis
319b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis  bool handleObjCMethod(const ObjCMethodDecl *D);
3204e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis
321b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis  bool handleSynthesizedObjCProperty(const ObjCPropertyImplDecl *D);
322b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis  bool handleSynthesizedObjCMethod(const ObjCMethodDecl *D, SourceLocation Loc);
3234e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis
324b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis  bool handleObjCProperty(const ObjCPropertyDecl *D);
3254e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis
326b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis  bool handleReference(const NamedDecl *D, SourceLocation Loc, CXCursor Cursor,
327b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis                       const NamedDecl *Parent,
328b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis                       const DeclContext *DC,
329b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis                       const Expr *E = 0,
330b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis                       CXIdxEntityRefKind Kind = CXIdxEntityRef_Direct);
331b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis
332b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis  bool handleReference(const NamedDecl *D, SourceLocation Loc,
3334e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis                       const NamedDecl *Parent,
3344e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis                       const DeclContext *DC,
335aca19be8731fc31cff68702de0dc7f30ce908979Argyrios Kyrtzidis                       const Expr *E = 0,
336aca19be8731fc31cff68702de0dc7f30ce908979Argyrios Kyrtzidis                       CXIdxEntityRefKind Kind = CXIdxEntityRef_Direct);
3374e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis
3384e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis  bool isNotFromSourceFile(SourceLocation Loc) const;
3394e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis
34021ee5707e6e59d982d2f2ae28e079c7ff46dc519Argyrios Kyrtzidis  void indexTopLevelDecl(Decl *D);
3414e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis  void indexTUDeclsInObjCContainer();
3424e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis  void indexDeclGroupRef(DeclGroupRef DG);
3434e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis
3444e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis  void addTUDeclInObjCContainer(DeclGroupRef DG) {
3454e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis    TUDeclsInObjCContainer.push_back(DG);
3464e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis  }
3474e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis
348dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis  void translateLoc(SourceLocation Loc, CXIdxClientFile *indexFile, CXFile *file,
3494e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis                    unsigned *line, unsigned *column, unsigned *offset);
3504e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis
3514e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidisprivate:
352b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis  bool handleDecl(const NamedDecl *D,
353dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis                  SourceLocation Loc, CXCursor Cursor,
354dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis                  DeclInfo &DInfo);
355dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis
356b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis  bool handleObjCContainer(const ObjCContainerDecl *D,
357dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis                           SourceLocation Loc, CXCursor Cursor,
358dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis                           ObjCContainerDeclInfo &ContDInfo);
3594e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis
360dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis  void addContainerInMap(const DeclContext *DC, CXIdxClientContainer container);
361dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis
362b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis  bool markEntityOccurrenceInFile(const NamedDecl *D, SourceLocation Loc);
363b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis
3644e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis  const NamedDecl *getEntityDecl(const NamedDecl *D) const;
3654e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis
366dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis  CXIdxClientContainer getIndexContainer(const NamedDecl *D) const {
3674e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis    return getIndexContainerForDC(D->getDeclContext());
3684e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis  }
3694e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis
3704e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis  const DeclContext *getScopedContext(const DeclContext *DC) const;
371dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis  CXIdxClientContainer getIndexContainerForDC(const DeclContext *DC) const;
3724e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis
373dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis  CXIdxClientFile getIndexFile(const FileEntry *File);
3744e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis
3754e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis  CXIdxLoc getIndexLoc(SourceLocation Loc) const;
3764e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis
3774e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis  void getEntityInfo(const NamedDecl *D,
3784e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis                     CXIdxEntityInfo &EntityInfo,
3794e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis                     StrAdapter &SA);
3804e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis
381b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis  CXCursor getCursor(const Decl *D) {
382b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis    return cxcursor::MakeCXCursor(const_cast<Decl*>(D), CXTU);
3834e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis  }
3844e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis
3854e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis  CXCursor getRefCursor(const NamedDecl *D, SourceLocation Loc);
3864e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis};
3874e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis
3884e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis}} // end clang::cxindex
389c6b4a5099588fd21b49c80f730a596a64b2766c6Argyrios Kyrtzidis
390c6b4a5099588fd21b49c80f730a596a64b2766c6Argyrios Kyrtzidisnamespace llvm {
391c6b4a5099588fd21b49c80f730a596a64b2766c6Argyrios Kyrtzidis  /// Define DenseMapInfo so that FileID's can be used as keys in DenseMap and
392c6b4a5099588fd21b49c80f730a596a64b2766c6Argyrios Kyrtzidis  /// DenseSets.
393c6b4a5099588fd21b49c80f730a596a64b2766c6Argyrios Kyrtzidis  template <>
394c6b4a5099588fd21b49c80f730a596a64b2766c6Argyrios Kyrtzidis  struct DenseMapInfo<clang::cxindex::RefFileOccurence> {
395c6b4a5099588fd21b49c80f730a596a64b2766c6Argyrios Kyrtzidis    static inline clang::cxindex::RefFileOccurence getEmptyKey() {
396c6b4a5099588fd21b49c80f730a596a64b2766c6Argyrios Kyrtzidis      return clang::cxindex::RefFileOccurence(0, 0);
397c6b4a5099588fd21b49c80f730a596a64b2766c6Argyrios Kyrtzidis    }
398c6b4a5099588fd21b49c80f730a596a64b2766c6Argyrios Kyrtzidis
399c6b4a5099588fd21b49c80f730a596a64b2766c6Argyrios Kyrtzidis    static inline clang::cxindex::RefFileOccurence getTombstoneKey() {
400c6b4a5099588fd21b49c80f730a596a64b2766c6Argyrios Kyrtzidis      return clang::cxindex::RefFileOccurence((const clang::FileEntry *)~0,
401c6b4a5099588fd21b49c80f730a596a64b2766c6Argyrios Kyrtzidis                                              (const clang::Decl *)~0);
402c6b4a5099588fd21b49c80f730a596a64b2766c6Argyrios Kyrtzidis    }
403c6b4a5099588fd21b49c80f730a596a64b2766c6Argyrios Kyrtzidis
404c6b4a5099588fd21b49c80f730a596a64b2766c6Argyrios Kyrtzidis    static unsigned getHashValue(clang::cxindex::RefFileOccurence S) {
405c6b4a5099588fd21b49c80f730a596a64b2766c6Argyrios Kyrtzidis      llvm::FoldingSetNodeID ID;
406c6b4a5099588fd21b49c80f730a596a64b2766c6Argyrios Kyrtzidis      ID.AddPointer(S.File);
407c6b4a5099588fd21b49c80f730a596a64b2766c6Argyrios Kyrtzidis      ID.AddPointer(S.Dcl);
408c6b4a5099588fd21b49c80f730a596a64b2766c6Argyrios Kyrtzidis      return ID.ComputeHash();
409c6b4a5099588fd21b49c80f730a596a64b2766c6Argyrios Kyrtzidis    }
410c6b4a5099588fd21b49c80f730a596a64b2766c6Argyrios Kyrtzidis
411c6b4a5099588fd21b49c80f730a596a64b2766c6Argyrios Kyrtzidis    static bool isEqual(clang::cxindex::RefFileOccurence LHS,
412c6b4a5099588fd21b49c80f730a596a64b2766c6Argyrios Kyrtzidis                        clang::cxindex::RefFileOccurence RHS) {
413c6b4a5099588fd21b49c80f730a596a64b2766c6Argyrios Kyrtzidis      return LHS.File == RHS.File && LHS.Dcl == RHS.Dcl;
414c6b4a5099588fd21b49c80f730a596a64b2766c6Argyrios Kyrtzidis    }
415c6b4a5099588fd21b49c80f730a596a64b2766c6Argyrios Kyrtzidis  };
416c6b4a5099588fd21b49c80f730a596a64b2766c6Argyrios Kyrtzidis}
417