IndexingContext.h revision 21ee5707e6e59d982d2f2ae28e079c7ff46dc519
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"
154e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis#include "llvm/ADT/DenseMap.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;
43c71d55469e7d5f7b376a30620617a175a9442da9Argyrios Kyrtzidis  }
44c71d55469e7d5f7b376a30620617a175a9442da9Argyrios Kyrtzidis  DeclInfo(DInfoKind K,
45c71d55469e7d5f7b376a30620617a175a9442da9Argyrios Kyrtzidis           bool isRedeclaration, bool isDefinition, bool isContainer)
46c71d55469e7d5f7b376a30620617a175a9442da9Argyrios Kyrtzidis    : Kind(K) {
47c71d55469e7d5f7b376a30620617a175a9442da9Argyrios Kyrtzidis    this->isRedeclaration = isRedeclaration;
48c71d55469e7d5f7b376a30620617a175a9442da9Argyrios Kyrtzidis    this->isDefinition = isDefinition;
49c71d55469e7d5f7b376a30620617a175a9442da9Argyrios Kyrtzidis    this->isContainer = isContainer;
50c71d55469e7d5f7b376a30620617a175a9442da9Argyrios Kyrtzidis  }
51c71d55469e7d5f7b376a30620617a175a9442da9Argyrios Kyrtzidis
52c71d55469e7d5f7b376a30620617a175a9442da9Argyrios Kyrtzidis  static bool classof(const DeclInfo *) { return true; }
53dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis};
54dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis
55dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidisstruct ObjCContainerDeclInfo : public DeclInfo {
566ec43adc39006a7fce94188956d0239bd54c0363Argyrios Kyrtzidis  CXIdxObjCContainerDeclInfo ObjCContDeclInfo;
57dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis
58c71d55469e7d5f7b376a30620617a175a9442da9Argyrios Kyrtzidis  ObjCContainerDeclInfo(bool isForwardRef,
59c71d55469e7d5f7b376a30620617a175a9442da9Argyrios Kyrtzidis                        bool isRedeclaration,
60c71d55469e7d5f7b376a30620617a175a9442da9Argyrios Kyrtzidis                        bool isImplementation)
61c71d55469e7d5f7b376a30620617a175a9442da9Argyrios Kyrtzidis    : DeclInfo(Info_ObjCContainer, isRedeclaration,
62c71d55469e7d5f7b376a30620617a175a9442da9Argyrios Kyrtzidis               /*isDefinition=*/!isForwardRef, /*isContainer=*/!isForwardRef) {
63c71d55469e7d5f7b376a30620617a175a9442da9Argyrios Kyrtzidis    init(isForwardRef, isImplementation);
64c71d55469e7d5f7b376a30620617a175a9442da9Argyrios Kyrtzidis  }
65c71d55469e7d5f7b376a30620617a175a9442da9Argyrios Kyrtzidis  ObjCContainerDeclInfo(DInfoKind K,
66c71d55469e7d5f7b376a30620617a175a9442da9Argyrios Kyrtzidis                        bool isForwardRef,
67c71d55469e7d5f7b376a30620617a175a9442da9Argyrios Kyrtzidis                        bool isRedeclaration,
68c71d55469e7d5f7b376a30620617a175a9442da9Argyrios Kyrtzidis                        bool isImplementation)
69c71d55469e7d5f7b376a30620617a175a9442da9Argyrios Kyrtzidis    : DeclInfo(K, isRedeclaration, /*isDefinition=*/!isForwardRef,
70c71d55469e7d5f7b376a30620617a175a9442da9Argyrios Kyrtzidis               /*isContainer=*/!isForwardRef) {
71c71d55469e7d5f7b376a30620617a175a9442da9Argyrios Kyrtzidis    init(isForwardRef, isImplementation);
72c71d55469e7d5f7b376a30620617a175a9442da9Argyrios Kyrtzidis  }
73c71d55469e7d5f7b376a30620617a175a9442da9Argyrios Kyrtzidis
74c71d55469e7d5f7b376a30620617a175a9442da9Argyrios Kyrtzidis  static bool classof(const DeclInfo *D) {
75c71d55469e7d5f7b376a30620617a175a9442da9Argyrios Kyrtzidis    return Info_ObjCContainer <= D->Kind && D->Kind <= Info_ObjCCategory;
76c71d55469e7d5f7b376a30620617a175a9442da9Argyrios Kyrtzidis  }
77c71d55469e7d5f7b376a30620617a175a9442da9Argyrios Kyrtzidis  static bool classof(const ObjCContainerDeclInfo *D) { return true; }
78c71d55469e7d5f7b376a30620617a175a9442da9Argyrios Kyrtzidis
79c71d55469e7d5f7b376a30620617a175a9442da9Argyrios Kyrtzidisprivate:
80c71d55469e7d5f7b376a30620617a175a9442da9Argyrios Kyrtzidis  void init(bool isForwardRef, bool isImplementation) {
81c71d55469e7d5f7b376a30620617a175a9442da9Argyrios Kyrtzidis    if (isForwardRef)
82c71d55469e7d5f7b376a30620617a175a9442da9Argyrios Kyrtzidis      ObjCContDeclInfo.kind = CXIdxObjCContainer_ForwardRef;
83c71d55469e7d5f7b376a30620617a175a9442da9Argyrios Kyrtzidis    else if (isImplementation)
84c71d55469e7d5f7b376a30620617a175a9442da9Argyrios Kyrtzidis      ObjCContDeclInfo.kind = CXIdxObjCContainer_Implementation;
85c71d55469e7d5f7b376a30620617a175a9442da9Argyrios Kyrtzidis    else
86c71d55469e7d5f7b376a30620617a175a9442da9Argyrios Kyrtzidis      ObjCContDeclInfo.kind = CXIdxObjCContainer_Interface;
87c71d55469e7d5f7b376a30620617a175a9442da9Argyrios Kyrtzidis  }
886ec43adc39006a7fce94188956d0239bd54c0363Argyrios Kyrtzidis};
896ec43adc39006a7fce94188956d0239bd54c0363Argyrios Kyrtzidis
90c71d55469e7d5f7b376a30620617a175a9442da9Argyrios Kyrtzidisstruct ObjCInterfaceDeclInfo : public ObjCContainerDeclInfo {
916ec43adc39006a7fce94188956d0239bd54c0363Argyrios Kyrtzidis  CXIdxObjCInterfaceDeclInfo ObjCInterDeclInfo;
92c71d55469e7d5f7b376a30620617a175a9442da9Argyrios Kyrtzidis  CXIdxObjCProtocolRefListInfo ObjCProtoListInfo;
93c71d55469e7d5f7b376a30620617a175a9442da9Argyrios Kyrtzidis
94c71d55469e7d5f7b376a30620617a175a9442da9Argyrios Kyrtzidis  ObjCInterfaceDeclInfo(const ObjCInterfaceDecl *D)
95c71d55469e7d5f7b376a30620617a175a9442da9Argyrios Kyrtzidis    : ObjCContainerDeclInfo(Info_ObjCInterface,
96c71d55469e7d5f7b376a30620617a175a9442da9Argyrios Kyrtzidis                            /*isForwardRef=*/false,
97c71d55469e7d5f7b376a30620617a175a9442da9Argyrios Kyrtzidis                            /*isRedeclaration=*/D->isInitiallyForwardDecl(),
98c71d55469e7d5f7b376a30620617a175a9442da9Argyrios Kyrtzidis                            /*isImplementation=*/false) { }
99c71d55469e7d5f7b376a30620617a175a9442da9Argyrios Kyrtzidis
100c71d55469e7d5f7b376a30620617a175a9442da9Argyrios Kyrtzidis  static bool classof(const DeclInfo *D) {
101c71d55469e7d5f7b376a30620617a175a9442da9Argyrios Kyrtzidis    return D->Kind == Info_ObjCInterface;
102c71d55469e7d5f7b376a30620617a175a9442da9Argyrios Kyrtzidis  }
103c71d55469e7d5f7b376a30620617a175a9442da9Argyrios Kyrtzidis  static bool classof(const ObjCInterfaceDeclInfo *D) { return true; }
1046ec43adc39006a7fce94188956d0239bd54c0363Argyrios Kyrtzidis};
1056ec43adc39006a7fce94188956d0239bd54c0363Argyrios Kyrtzidis
106c71d55469e7d5f7b376a30620617a175a9442da9Argyrios Kyrtzidisstruct ObjCProtocolDeclInfo : public ObjCContainerDeclInfo {
107c71d55469e7d5f7b376a30620617a175a9442da9Argyrios Kyrtzidis  CXIdxObjCProtocolRefListInfo ObjCProtoRefListInfo;
108c71d55469e7d5f7b376a30620617a175a9442da9Argyrios Kyrtzidis
109c71d55469e7d5f7b376a30620617a175a9442da9Argyrios Kyrtzidis  ObjCProtocolDeclInfo(const ObjCProtocolDecl *D)
110c71d55469e7d5f7b376a30620617a175a9442da9Argyrios Kyrtzidis    : ObjCContainerDeclInfo(Info_ObjCProtocol,
111c71d55469e7d5f7b376a30620617a175a9442da9Argyrios Kyrtzidis                            /*isForwardRef=*/false,
112c71d55469e7d5f7b376a30620617a175a9442da9Argyrios Kyrtzidis                            /*isRedeclaration=*/D->isInitiallyForwardDecl(),
113c71d55469e7d5f7b376a30620617a175a9442da9Argyrios Kyrtzidis                            /*isImplementation=*/false) { }
114c71d55469e7d5f7b376a30620617a175a9442da9Argyrios Kyrtzidis
115c71d55469e7d5f7b376a30620617a175a9442da9Argyrios Kyrtzidis  static bool classof(const DeclInfo *D) {
116c71d55469e7d5f7b376a30620617a175a9442da9Argyrios Kyrtzidis    return D->Kind == Info_ObjCProtocol;
117c71d55469e7d5f7b376a30620617a175a9442da9Argyrios Kyrtzidis  }
118c71d55469e7d5f7b376a30620617a175a9442da9Argyrios Kyrtzidis  static bool classof(const ObjCProtocolDeclInfo *D) { return true; }
119c71d55469e7d5f7b376a30620617a175a9442da9Argyrios Kyrtzidis};
120c71d55469e7d5f7b376a30620617a175a9442da9Argyrios Kyrtzidis
121c71d55469e7d5f7b376a30620617a175a9442da9Argyrios Kyrtzidisstruct ObjCCategoryDeclInfo : public ObjCContainerDeclInfo {
122c71d55469e7d5f7b376a30620617a175a9442da9Argyrios Kyrtzidis  CXIdxObjCCategoryDeclInfo ObjCCatDeclInfo;
123c71d55469e7d5f7b376a30620617a175a9442da9Argyrios Kyrtzidis
124c71d55469e7d5f7b376a30620617a175a9442da9Argyrios Kyrtzidis  explicit ObjCCategoryDeclInfo(bool isImplementation)
125c71d55469e7d5f7b376a30620617a175a9442da9Argyrios Kyrtzidis    : ObjCContainerDeclInfo(Info_ObjCCategory,
126c71d55469e7d5f7b376a30620617a175a9442da9Argyrios Kyrtzidis                            /*isForwardRef=*/false,
127c71d55469e7d5f7b376a30620617a175a9442da9Argyrios Kyrtzidis                            /*isRedeclaration=*/isImplementation,
128c71d55469e7d5f7b376a30620617a175a9442da9Argyrios Kyrtzidis                            /*isImplementation=*/isImplementation) { }
129c71d55469e7d5f7b376a30620617a175a9442da9Argyrios Kyrtzidis
130c71d55469e7d5f7b376a30620617a175a9442da9Argyrios Kyrtzidis  static bool classof(const DeclInfo *D) {
131c71d55469e7d5f7b376a30620617a175a9442da9Argyrios Kyrtzidis    return D->Kind == Info_ObjCCategory;
132c71d55469e7d5f7b376a30620617a175a9442da9Argyrios Kyrtzidis  }
133c71d55469e7d5f7b376a30620617a175a9442da9Argyrios Kyrtzidis  static bool classof(const ObjCCategoryDeclInfo *D) { return true; }
134dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis};
135dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis
1364e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidisclass IndexingContext {
1374e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis  ASTContext *Ctx;
1384e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis  CXClientData ClientData;
1394e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis  IndexerCallbacks &CB;
1404e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis  unsigned IndexOptions;
1414e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis  CXTranslationUnit CXTU;
1424e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis
143dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis  typedef llvm::DenseMap<const FileEntry *, CXIdxClientFile> FileMapTy;
144dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis  typedef llvm::DenseMap<const DeclContext *, CXIdxClientContainer> ContainerMapTy;
1454e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis  FileMapTy FileMap;
1464e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis  ContainerMapTy ContainerMap;
1474e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis
1484e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis  SmallVector<DeclGroupRef, 8> TUDeclsInObjCContainer;
1494e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis
1504e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis  llvm::SmallString<256> StrScratch;
151dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis  unsigned StrAdapterCount;
1524e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis
1534e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis  class StrAdapter {
1544e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis    llvm::SmallString<256> &Scratch;
155dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis    IndexingContext &IdxCtx;
1564e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis
1574e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis  public:
158dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis    StrAdapter(IndexingContext &indexCtx)
159dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis      : Scratch(indexCtx.StrScratch), IdxCtx(indexCtx) {
160dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis      ++IdxCtx.StrAdapterCount;
161dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis    }
162dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis
163dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis    ~StrAdapter() {
164dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis      --IdxCtx.StrAdapterCount;
165dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis      if (IdxCtx.StrAdapterCount == 0)
166dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis        Scratch.clear();
167dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis    }
1684e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis
1694e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis    const char *toCStr(StringRef Str);
1704e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis
1714e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis    unsigned getCurSize() const { return Scratch.size(); }
1724e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis
1734e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis    const char *getCStr(unsigned CharIndex) {
1744e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis      Scratch.push_back('\0');
1754e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis      return Scratch.data() + CharIndex;
1764e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis    }
1774e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis
1784e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis    SmallVectorImpl<char> &getBuffer() { return Scratch; }
1794e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis  };
1804e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis
1816ec43adc39006a7fce94188956d0239bd54c0363Argyrios Kyrtzidis  struct ObjCProtocolListInfo {
1826ec43adc39006a7fce94188956d0239bd54c0363Argyrios Kyrtzidis    SmallVector<CXIdxObjCProtocolRefInfo, 4> ProtInfos;
1836ec43adc39006a7fce94188956d0239bd54c0363Argyrios Kyrtzidis    SmallVector<CXIdxEntityInfo, 4> ProtEntities;
1846ec43adc39006a7fce94188956d0239bd54c0363Argyrios Kyrtzidis    SmallVector<CXIdxObjCProtocolRefInfo *, 4> Prots;
1856ec43adc39006a7fce94188956d0239bd54c0363Argyrios Kyrtzidis
186c71d55469e7d5f7b376a30620617a175a9442da9Argyrios Kyrtzidis    CXIdxObjCProtocolRefListInfo getListInfo() {
187c71d55469e7d5f7b376a30620617a175a9442da9Argyrios Kyrtzidis      CXIdxObjCProtocolRefListInfo Info = { Prots.data(),
188c71d55469e7d5f7b376a30620617a175a9442da9Argyrios Kyrtzidis                                            (unsigned)Prots.size() };
189c71d55469e7d5f7b376a30620617a175a9442da9Argyrios Kyrtzidis      return Info;
190c71d55469e7d5f7b376a30620617a175a9442da9Argyrios Kyrtzidis    }
1916ec43adc39006a7fce94188956d0239bd54c0363Argyrios Kyrtzidis
1926ec43adc39006a7fce94188956d0239bd54c0363Argyrios Kyrtzidis    ObjCProtocolListInfo(const ObjCProtocolList &ProtList,
1936ec43adc39006a7fce94188956d0239bd54c0363Argyrios Kyrtzidis                         IndexingContext &IdxCtx,
1946ec43adc39006a7fce94188956d0239bd54c0363Argyrios Kyrtzidis                         IndexingContext::StrAdapter &SA);
1956ec43adc39006a7fce94188956d0239bd54c0363Argyrios Kyrtzidis  };
1966ec43adc39006a7fce94188956d0239bd54c0363Argyrios Kyrtzidis
1974e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidispublic:
1984e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis  IndexingContext(CXClientData clientData, IndexerCallbacks &indexCallbacks,
1994e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis                  unsigned indexOptions, CXTranslationUnit cxTU)
2004e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis    : Ctx(0), ClientData(clientData), CB(indexCallbacks),
201dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis      IndexOptions(indexOptions), CXTU(cxTU), StrAdapterCount(0) { }
2024e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis
2034e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis  ASTContext &getASTContext() const { return *Ctx; }
2044e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis
2054e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis  void setASTContext(ASTContext &ctx);
2064e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis
207dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis  void enteredMainFile(const FileEntry *File);
208dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis
2094e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis  void ppIncludedFile(SourceLocation hashLoc,
2104e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis                      StringRef filename, const FileEntry *File,
2114e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis                      bool isImport, bool isAngled);
2124e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis
2136ec43adc39006a7fce94188956d0239bd54c0363Argyrios Kyrtzidis  void startedTranslationUnit();
2144e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis
2154e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis  void indexDecl(const Decl *D);
2164e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis
2174e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis  void indexTagDecl(const TagDecl *D);
2184e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis
2194e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis  void indexTypeSourceInfo(TypeSourceInfo *TInfo, const NamedDecl *Parent,
2204e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis                           const DeclContext *DC = 0);
2214e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis
2224e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis  void indexTypeLoc(TypeLoc TL, const NamedDecl *Parent,
2234e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis                           const DeclContext *DC);
2244e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis
2254e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis  void indexDeclContext(const DeclContext *DC);
2264e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis
2274e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis  void indexBody(const Stmt *S, const DeclContext *DC);
2284e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis
2294e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis  void handleDiagnostic(const StoredDiagnostic &StoredDiag);
23021ee5707e6e59d982d2f2ae28e079c7ff46dc519Argyrios Kyrtzidis  void handleDiagnostic(CXDiagnostic CXDiag);
2314e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis
2324e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis  void handleFunction(const FunctionDecl *FD);
2334e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis
2344e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis  void handleVar(const VarDecl *D);
2354e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis
2364e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis  void handleField(const FieldDecl *D);
2374e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis
2384e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis  void handleEnumerator(const EnumConstantDecl *D);
2394e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis
2404e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis  void handleTagDecl(const TagDecl *D);
2414e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis
2424e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis  void handleTypedef(const TypedefDecl *D);
2434e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis
244dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis  void handleObjCClass(const ObjCClassDecl *D);
2454e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis  void handleObjCInterface(const ObjCInterfaceDecl *D);
246dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis  void handleObjCImplementation(const ObjCImplementationDecl *D);
2474e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis
248dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis  void handleObjCForwardProtocol(const ObjCProtocolDecl *D,
249dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis                                 SourceLocation Loc,
250dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis                                 bool isRedeclaration);
251dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis
2524e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis  void handleObjCProtocol(const ObjCProtocolDecl *D);
2534e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis
2544e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis  void handleObjCCategory(const ObjCCategoryDecl *D);
255dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis  void handleObjCCategoryImpl(const ObjCCategoryImplDecl *D);
2564e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis
2574e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis  void handleObjCMethod(const ObjCMethodDecl *D);
2584e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis
2594e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis  void handleObjCProperty(const ObjCPropertyDecl *D);
2604e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis
2614e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis  void handleReference(const NamedDecl *D, SourceLocation Loc,
2624e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis                       const NamedDecl *Parent,
2634e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis                       const DeclContext *DC,
264aca19be8731fc31cff68702de0dc7f30ce908979Argyrios Kyrtzidis                       const Expr *E = 0,
265aca19be8731fc31cff68702de0dc7f30ce908979Argyrios Kyrtzidis                       CXIdxEntityRefKind Kind = CXIdxEntityRef_Direct);
2664e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis
2674e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis  bool isNotFromSourceFile(SourceLocation Loc) const;
2684e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis
26921ee5707e6e59d982d2f2ae28e079c7ff46dc519Argyrios Kyrtzidis  void indexTopLevelDecl(Decl *D);
2704e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis  void indexTUDeclsInObjCContainer();
2714e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis  void indexDeclGroupRef(DeclGroupRef DG);
2724e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis
2734e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis  void addTUDeclInObjCContainer(DeclGroupRef DG) {
2744e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis    TUDeclsInObjCContainer.push_back(DG);
2754e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis  }
2764e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis
277dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis  void translateLoc(SourceLocation Loc, CXIdxClientFile *indexFile, CXFile *file,
2784e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis                    unsigned *line, unsigned *column, unsigned *offset);
2794e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis
2804e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidisprivate:
281dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis  void handleDecl(const NamedDecl *D,
282dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis                  SourceLocation Loc, CXCursor Cursor,
283dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis                  DeclInfo &DInfo);
284dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis
285dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis  void handleObjCContainer(const ObjCContainerDecl *D,
286dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis                           SourceLocation Loc, CXCursor Cursor,
287dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis                           ObjCContainerDeclInfo &ContDInfo);
2884e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis
289dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis  void addContainerInMap(const DeclContext *DC, CXIdxClientContainer container);
290dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis
2914e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis  const NamedDecl *getEntityDecl(const NamedDecl *D) const;
2924e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis
293dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis  CXIdxClientContainer getIndexContainer(const NamedDecl *D) const {
2944e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis    return getIndexContainerForDC(D->getDeclContext());
2954e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis  }
2964e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis
2974e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis  const DeclContext *getScopedContext(const DeclContext *DC) const;
298dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis  CXIdxClientContainer getIndexContainerForDC(const DeclContext *DC) const;
2994e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis
300dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis  CXIdxClientFile getIndexFile(const FileEntry *File);
3014e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis
3024e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis  CXIdxLoc getIndexLoc(SourceLocation Loc) const;
3034e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis
3044e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis  void getEntityInfo(const NamedDecl *D,
3054e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis                     CXIdxEntityInfo &EntityInfo,
3064e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis                     StrAdapter &SA);
3074e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis
3084e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis  CXCursor getCursor(const NamedDecl *D) {
3094e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis    return cxcursor::MakeCXCursor(const_cast<NamedDecl*>(D), CXTU);
3104e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis  }
3114e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis
3124e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis  CXCursor getRefCursor(const NamedDecl *D, SourceLocation Loc);
3134e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis};
3144e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis
3154e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis}} // end clang::cxindex
316