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 AttrListInfo;
294e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis
30d786f1a6331246e7d0eedde277f126ab92089eebArgyrios Kyrtzidisclass ScratchAlloc {
31d786f1a6331246e7d0eedde277f126ab92089eebArgyrios Kyrtzidis  IndexingContext &IdxCtx;
32d786f1a6331246e7d0eedde277f126ab92089eebArgyrios Kyrtzidis
33d786f1a6331246e7d0eedde277f126ab92089eebArgyrios Kyrtzidispublic:
34d786f1a6331246e7d0eedde277f126ab92089eebArgyrios Kyrtzidis  explicit ScratchAlloc(IndexingContext &indexCtx);
35d786f1a6331246e7d0eedde277f126ab92089eebArgyrios Kyrtzidis  ScratchAlloc(const ScratchAlloc &SA);
36d786f1a6331246e7d0eedde277f126ab92089eebArgyrios Kyrtzidis
37d786f1a6331246e7d0eedde277f126ab92089eebArgyrios Kyrtzidis  ~ScratchAlloc();
38d786f1a6331246e7d0eedde277f126ab92089eebArgyrios Kyrtzidis
39d786f1a6331246e7d0eedde277f126ab92089eebArgyrios Kyrtzidis  const char *toCStr(StringRef Str);
40d786f1a6331246e7d0eedde277f126ab92089eebArgyrios Kyrtzidis  const char *copyCStr(StringRef Str);
41d786f1a6331246e7d0eedde277f126ab92089eebArgyrios Kyrtzidis
42d786f1a6331246e7d0eedde277f126ab92089eebArgyrios Kyrtzidis  template <typename T>
43d786f1a6331246e7d0eedde277f126ab92089eebArgyrios Kyrtzidis  T *allocate();
44d786f1a6331246e7d0eedde277f126ab92089eebArgyrios Kyrtzidis};
45d786f1a6331246e7d0eedde277f126ab92089eebArgyrios Kyrtzidis
462957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidisstruct EntityInfo : public CXIdxEntityInfo {
472957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis  const NamedDecl *Dcl;
482957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis  IndexingContext *IndexCtx;
49c93dc7889644293e318e19d82830ea2acc45b678Dylan Noblesmith  IntrusiveRefCntPtr<AttrListInfo> AttrList;
5037f40572c4c78a8c57a7b45266f8b86db172a7c1Argyrios Kyrtzidis
5137f40572c4c78a8c57a7b45266f8b86db172a7c1Argyrios Kyrtzidis  EntityInfo() {
5237f40572c4c78a8c57a7b45266f8b86db172a7c1Argyrios Kyrtzidis    name = USR = 0;
53643d3ce93c501d19353f2fa578fee3e97f1d1b4bArgyrios Kyrtzidis    attributes = 0;
54643d3ce93c501d19353f2fa578fee3e97f1d1b4bArgyrios Kyrtzidis    numAttributes = 0;
5537f40572c4c78a8c57a7b45266f8b86db172a7c1Argyrios Kyrtzidis  }
562957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis};
572957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis
582957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidisstruct ContainerInfo : public CXIdxContainerInfo {
592957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis  const DeclContext *DC;
602957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis  IndexingContext *IndexCtx;
612957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis};
622957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis
63dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidisstruct DeclInfo : public CXIdxDeclInfo {
64c71d55469e7d5f7b376a30620617a175a9442da9Argyrios Kyrtzidis  enum DInfoKind {
65c71d55469e7d5f7b376a30620617a175a9442da9Argyrios Kyrtzidis    Info_Decl,
66c71d55469e7d5f7b376a30620617a175a9442da9Argyrios Kyrtzidis
67c71d55469e7d5f7b376a30620617a175a9442da9Argyrios Kyrtzidis    Info_ObjCContainer,
68c71d55469e7d5f7b376a30620617a175a9442da9Argyrios Kyrtzidis      Info_ObjCInterface,
69c71d55469e7d5f7b376a30620617a175a9442da9Argyrios Kyrtzidis      Info_ObjCProtocol,
702957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis      Info_ObjCCategory,
712957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis
72792db266f3d2f12a7a16bf37d90074f54bca1e6fArgyrios Kyrtzidis    Info_ObjCProperty,
73792db266f3d2f12a7a16bf37d90074f54bca1e6fArgyrios Kyrtzidis
742957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis    Info_CXXClass
75c71d55469e7d5f7b376a30620617a175a9442da9Argyrios Kyrtzidis  };
76c71d55469e7d5f7b376a30620617a175a9442da9Argyrios Kyrtzidis
77c71d55469e7d5f7b376a30620617a175a9442da9Argyrios Kyrtzidis  DInfoKind Kind;
78c71d55469e7d5f7b376a30620617a175a9442da9Argyrios Kyrtzidis
792957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis  EntityInfo EntInfo;
80b1febb646bf7a2f319ad894c9833968c52d21711Argyrios Kyrtzidis  ContainerInfo SemanticContainer;
81b1febb646bf7a2f319ad894c9833968c52d21711Argyrios Kyrtzidis  ContainerInfo LexicalContainer;
822957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis  ContainerInfo DeclAsContainer;
832957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis
84c71d55469e7d5f7b376a30620617a175a9442da9Argyrios Kyrtzidis  DeclInfo(bool isRedeclaration, bool isDefinition, bool isContainer)
85c71d55469e7d5f7b376a30620617a175a9442da9Argyrios Kyrtzidis    : Kind(Info_Decl) {
86c71d55469e7d5f7b376a30620617a175a9442da9Argyrios Kyrtzidis    this->isRedeclaration = isRedeclaration;
87c71d55469e7d5f7b376a30620617a175a9442da9Argyrios Kyrtzidis    this->isDefinition = isDefinition;
88c71d55469e7d5f7b376a30620617a175a9442da9Argyrios Kyrtzidis    this->isContainer = isContainer;
89b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis    attributes = 0;
90b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis    numAttributes = 0;
91b1febb646bf7a2f319ad894c9833968c52d21711Argyrios Kyrtzidis    declAsContainer = semanticContainer = lexicalContainer = 0;
92c71d55469e7d5f7b376a30620617a175a9442da9Argyrios Kyrtzidis  }
93c71d55469e7d5f7b376a30620617a175a9442da9Argyrios Kyrtzidis  DeclInfo(DInfoKind K,
94c71d55469e7d5f7b376a30620617a175a9442da9Argyrios Kyrtzidis           bool isRedeclaration, bool isDefinition, bool isContainer)
95c71d55469e7d5f7b376a30620617a175a9442da9Argyrios Kyrtzidis    : Kind(K) {
96c71d55469e7d5f7b376a30620617a175a9442da9Argyrios Kyrtzidis    this->isRedeclaration = isRedeclaration;
97c71d55469e7d5f7b376a30620617a175a9442da9Argyrios Kyrtzidis    this->isDefinition = isDefinition;
98c71d55469e7d5f7b376a30620617a175a9442da9Argyrios Kyrtzidis    this->isContainer = isContainer;
99b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis    attributes = 0;
100b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis    numAttributes = 0;
101b1febb646bf7a2f319ad894c9833968c52d21711Argyrios Kyrtzidis    declAsContainer = semanticContainer = lexicalContainer = 0;
102c71d55469e7d5f7b376a30620617a175a9442da9Argyrios Kyrtzidis  }
103c71d55469e7d5f7b376a30620617a175a9442da9Argyrios Kyrtzidis
104c71d55469e7d5f7b376a30620617a175a9442da9Argyrios Kyrtzidis  static bool classof(const DeclInfo *) { return true; }
105dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis};
106dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis
107dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidisstruct ObjCContainerDeclInfo : public DeclInfo {
1086ec43adc39006a7fce94188956d0239bd54c0363Argyrios Kyrtzidis  CXIdxObjCContainerDeclInfo ObjCContDeclInfo;
109dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis
110c71d55469e7d5f7b376a30620617a175a9442da9Argyrios Kyrtzidis  ObjCContainerDeclInfo(bool isForwardRef,
111c71d55469e7d5f7b376a30620617a175a9442da9Argyrios Kyrtzidis                        bool isRedeclaration,
112c71d55469e7d5f7b376a30620617a175a9442da9Argyrios Kyrtzidis                        bool isImplementation)
113c71d55469e7d5f7b376a30620617a175a9442da9Argyrios Kyrtzidis    : DeclInfo(Info_ObjCContainer, isRedeclaration,
114c71d55469e7d5f7b376a30620617a175a9442da9Argyrios Kyrtzidis               /*isDefinition=*/!isForwardRef, /*isContainer=*/!isForwardRef) {
115c71d55469e7d5f7b376a30620617a175a9442da9Argyrios Kyrtzidis    init(isForwardRef, isImplementation);
116c71d55469e7d5f7b376a30620617a175a9442da9Argyrios Kyrtzidis  }
117c71d55469e7d5f7b376a30620617a175a9442da9Argyrios Kyrtzidis  ObjCContainerDeclInfo(DInfoKind K,
118c71d55469e7d5f7b376a30620617a175a9442da9Argyrios Kyrtzidis                        bool isForwardRef,
119c71d55469e7d5f7b376a30620617a175a9442da9Argyrios Kyrtzidis                        bool isRedeclaration,
120c71d55469e7d5f7b376a30620617a175a9442da9Argyrios Kyrtzidis                        bool isImplementation)
121c71d55469e7d5f7b376a30620617a175a9442da9Argyrios Kyrtzidis    : DeclInfo(K, isRedeclaration, /*isDefinition=*/!isForwardRef,
122c71d55469e7d5f7b376a30620617a175a9442da9Argyrios Kyrtzidis               /*isContainer=*/!isForwardRef) {
123c71d55469e7d5f7b376a30620617a175a9442da9Argyrios Kyrtzidis    init(isForwardRef, isImplementation);
124c71d55469e7d5f7b376a30620617a175a9442da9Argyrios Kyrtzidis  }
125c71d55469e7d5f7b376a30620617a175a9442da9Argyrios Kyrtzidis
126c71d55469e7d5f7b376a30620617a175a9442da9Argyrios Kyrtzidis  static bool classof(const DeclInfo *D) {
127c71d55469e7d5f7b376a30620617a175a9442da9Argyrios Kyrtzidis    return Info_ObjCContainer <= D->Kind && D->Kind <= Info_ObjCCategory;
128c71d55469e7d5f7b376a30620617a175a9442da9Argyrios Kyrtzidis  }
129c71d55469e7d5f7b376a30620617a175a9442da9Argyrios Kyrtzidis  static bool classof(const ObjCContainerDeclInfo *D) { return true; }
130c71d55469e7d5f7b376a30620617a175a9442da9Argyrios Kyrtzidis
131c71d55469e7d5f7b376a30620617a175a9442da9Argyrios Kyrtzidisprivate:
132c71d55469e7d5f7b376a30620617a175a9442da9Argyrios Kyrtzidis  void init(bool isForwardRef, bool isImplementation) {
133c71d55469e7d5f7b376a30620617a175a9442da9Argyrios Kyrtzidis    if (isForwardRef)
134c71d55469e7d5f7b376a30620617a175a9442da9Argyrios Kyrtzidis      ObjCContDeclInfo.kind = CXIdxObjCContainer_ForwardRef;
135c71d55469e7d5f7b376a30620617a175a9442da9Argyrios Kyrtzidis    else if (isImplementation)
136c71d55469e7d5f7b376a30620617a175a9442da9Argyrios Kyrtzidis      ObjCContDeclInfo.kind = CXIdxObjCContainer_Implementation;
137c71d55469e7d5f7b376a30620617a175a9442da9Argyrios Kyrtzidis    else
138c71d55469e7d5f7b376a30620617a175a9442da9Argyrios Kyrtzidis      ObjCContDeclInfo.kind = CXIdxObjCContainer_Interface;
139c71d55469e7d5f7b376a30620617a175a9442da9Argyrios Kyrtzidis  }
1406ec43adc39006a7fce94188956d0239bd54c0363Argyrios Kyrtzidis};
1416ec43adc39006a7fce94188956d0239bd54c0363Argyrios Kyrtzidis
142c71d55469e7d5f7b376a30620617a175a9442da9Argyrios Kyrtzidisstruct ObjCInterfaceDeclInfo : public ObjCContainerDeclInfo {
1436ec43adc39006a7fce94188956d0239bd54c0363Argyrios Kyrtzidis  CXIdxObjCInterfaceDeclInfo ObjCInterDeclInfo;
144c71d55469e7d5f7b376a30620617a175a9442da9Argyrios Kyrtzidis  CXIdxObjCProtocolRefListInfo ObjCProtoListInfo;
145c71d55469e7d5f7b376a30620617a175a9442da9Argyrios Kyrtzidis
146c71d55469e7d5f7b376a30620617a175a9442da9Argyrios Kyrtzidis  ObjCInterfaceDeclInfo(const ObjCInterfaceDecl *D)
147c71d55469e7d5f7b376a30620617a175a9442da9Argyrios Kyrtzidis    : ObjCContainerDeclInfo(Info_ObjCInterface,
148c71d55469e7d5f7b376a30620617a175a9442da9Argyrios Kyrtzidis                            /*isForwardRef=*/false,
149ef96ee0be5f100789f451641542a69cd719144d2Douglas Gregor                          /*isRedeclaration=*/D->getPreviousDecl() != 0,
150c71d55469e7d5f7b376a30620617a175a9442da9Argyrios Kyrtzidis                            /*isImplementation=*/false) { }
151c71d55469e7d5f7b376a30620617a175a9442da9Argyrios Kyrtzidis
152c71d55469e7d5f7b376a30620617a175a9442da9Argyrios Kyrtzidis  static bool classof(const DeclInfo *D) {
153c71d55469e7d5f7b376a30620617a175a9442da9Argyrios Kyrtzidis    return D->Kind == Info_ObjCInterface;
154c71d55469e7d5f7b376a30620617a175a9442da9Argyrios Kyrtzidis  }
155c71d55469e7d5f7b376a30620617a175a9442da9Argyrios Kyrtzidis  static bool classof(const ObjCInterfaceDeclInfo *D) { return true; }
1566ec43adc39006a7fce94188956d0239bd54c0363Argyrios Kyrtzidis};
1576ec43adc39006a7fce94188956d0239bd54c0363Argyrios Kyrtzidis
158c71d55469e7d5f7b376a30620617a175a9442da9Argyrios Kyrtzidisstruct ObjCProtocolDeclInfo : public ObjCContainerDeclInfo {
159c71d55469e7d5f7b376a30620617a175a9442da9Argyrios Kyrtzidis  CXIdxObjCProtocolRefListInfo ObjCProtoRefListInfo;
160c71d55469e7d5f7b376a30620617a175a9442da9Argyrios Kyrtzidis
161c71d55469e7d5f7b376a30620617a175a9442da9Argyrios Kyrtzidis  ObjCProtocolDeclInfo(const ObjCProtocolDecl *D)
162c71d55469e7d5f7b376a30620617a175a9442da9Argyrios Kyrtzidis    : ObjCContainerDeclInfo(Info_ObjCProtocol,
163c71d55469e7d5f7b376a30620617a175a9442da9Argyrios Kyrtzidis                            /*isForwardRef=*/false,
164ef96ee0be5f100789f451641542a69cd719144d2Douglas Gregor                            /*isRedeclaration=*/D->getPreviousDecl(),
165c71d55469e7d5f7b376a30620617a175a9442da9Argyrios Kyrtzidis                            /*isImplementation=*/false) { }
166c71d55469e7d5f7b376a30620617a175a9442da9Argyrios Kyrtzidis
167c71d55469e7d5f7b376a30620617a175a9442da9Argyrios Kyrtzidis  static bool classof(const DeclInfo *D) {
168c71d55469e7d5f7b376a30620617a175a9442da9Argyrios Kyrtzidis    return D->Kind == Info_ObjCProtocol;
169c71d55469e7d5f7b376a30620617a175a9442da9Argyrios Kyrtzidis  }
170c71d55469e7d5f7b376a30620617a175a9442da9Argyrios Kyrtzidis  static bool classof(const ObjCProtocolDeclInfo *D) { return true; }
171c71d55469e7d5f7b376a30620617a175a9442da9Argyrios Kyrtzidis};
172c71d55469e7d5f7b376a30620617a175a9442da9Argyrios Kyrtzidis
173c71d55469e7d5f7b376a30620617a175a9442da9Argyrios Kyrtzidisstruct ObjCCategoryDeclInfo : public ObjCContainerDeclInfo {
174c71d55469e7d5f7b376a30620617a175a9442da9Argyrios Kyrtzidis  CXIdxObjCCategoryDeclInfo ObjCCatDeclInfo;
175c10a4c8baff3164bee9b7fc293679a5a5a90eb74Argyrios Kyrtzidis  CXIdxObjCProtocolRefListInfo ObjCProtoListInfo;
176c71d55469e7d5f7b376a30620617a175a9442da9Argyrios Kyrtzidis
177c71d55469e7d5f7b376a30620617a175a9442da9Argyrios Kyrtzidis  explicit ObjCCategoryDeclInfo(bool isImplementation)
178c71d55469e7d5f7b376a30620617a175a9442da9Argyrios Kyrtzidis    : ObjCContainerDeclInfo(Info_ObjCCategory,
179c71d55469e7d5f7b376a30620617a175a9442da9Argyrios Kyrtzidis                            /*isForwardRef=*/false,
180c71d55469e7d5f7b376a30620617a175a9442da9Argyrios Kyrtzidis                            /*isRedeclaration=*/isImplementation,
181c71d55469e7d5f7b376a30620617a175a9442da9Argyrios Kyrtzidis                            /*isImplementation=*/isImplementation) { }
182c71d55469e7d5f7b376a30620617a175a9442da9Argyrios Kyrtzidis
183c71d55469e7d5f7b376a30620617a175a9442da9Argyrios Kyrtzidis  static bool classof(const DeclInfo *D) {
184c71d55469e7d5f7b376a30620617a175a9442da9Argyrios Kyrtzidis    return D->Kind == Info_ObjCCategory;
185c71d55469e7d5f7b376a30620617a175a9442da9Argyrios Kyrtzidis  }
186c71d55469e7d5f7b376a30620617a175a9442da9Argyrios Kyrtzidis  static bool classof(const ObjCCategoryDeclInfo *D) { return true; }
187dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis};
188dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis
189792db266f3d2f12a7a16bf37d90074f54bca1e6fArgyrios Kyrtzidisstruct ObjCPropertyDeclInfo : public DeclInfo {
190792db266f3d2f12a7a16bf37d90074f54bca1e6fArgyrios Kyrtzidis  CXIdxObjCPropertyDeclInfo ObjCPropDeclInfo;
191792db266f3d2f12a7a16bf37d90074f54bca1e6fArgyrios Kyrtzidis
192792db266f3d2f12a7a16bf37d90074f54bca1e6fArgyrios Kyrtzidis  ObjCPropertyDeclInfo()
193792db266f3d2f12a7a16bf37d90074f54bca1e6fArgyrios Kyrtzidis    : DeclInfo(Info_ObjCProperty,
194792db266f3d2f12a7a16bf37d90074f54bca1e6fArgyrios Kyrtzidis               /*isRedeclaration=*/false, /*isDefinition=*/false,
195792db266f3d2f12a7a16bf37d90074f54bca1e6fArgyrios Kyrtzidis               /*isContainer=*/false) { }
196792db266f3d2f12a7a16bf37d90074f54bca1e6fArgyrios Kyrtzidis
197792db266f3d2f12a7a16bf37d90074f54bca1e6fArgyrios Kyrtzidis  static bool classof(const DeclInfo *D) {
198792db266f3d2f12a7a16bf37d90074f54bca1e6fArgyrios Kyrtzidis    return D->Kind == Info_ObjCProperty;
199792db266f3d2f12a7a16bf37d90074f54bca1e6fArgyrios Kyrtzidis  }
200792db266f3d2f12a7a16bf37d90074f54bca1e6fArgyrios Kyrtzidis  static bool classof(const ObjCPropertyDeclInfo *D) { return true; }
201792db266f3d2f12a7a16bf37d90074f54bca1e6fArgyrios Kyrtzidis};
202792db266f3d2f12a7a16bf37d90074f54bca1e6fArgyrios Kyrtzidis
2032957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidisstruct CXXClassDeclInfo : public DeclInfo {
2042957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis  CXIdxCXXClassDeclInfo CXXClassInfo;
2052957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis
2062957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis  CXXClassDeclInfo(bool isRedeclaration, bool isDefinition)
2072957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis    : DeclInfo(Info_CXXClass, isRedeclaration, isDefinition, isDefinition) { }
2082957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis
2092957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis  static bool classof(const DeclInfo *D) {
2102957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis    return D->Kind == Info_CXXClass;
2112957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis  }
2122957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis  static bool classof(const CXXClassDeclInfo *D) { return true; }
2132957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis};
2142957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis
215b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidisstruct AttrInfo : public CXIdxAttrInfo {
216b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis  const Attr *A;
217b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis
218b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis  AttrInfo(CXIdxAttrKind Kind, CXCursor C, CXIdxLoc Loc, const Attr *A) {
219b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis    kind = Kind;
220b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis    cursor = C;
221b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis    loc = Loc;
222b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis    this->A = A;
223b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis  }
224b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis
225b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis  static bool classof(const AttrInfo *) { return true; }
226b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis};
227b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis
228b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidisstruct IBOutletCollectionInfo : public AttrInfo {
2292957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis  EntityInfo ClassInfo;
230b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis  CXIdxIBOutletCollectionAttrInfo IBCollInfo;
231b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis
232b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis  IBOutletCollectionInfo(CXCursor C, CXIdxLoc Loc, const Attr *A) :
233b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis    AttrInfo(CXIdxAttr_IBOutletCollection, C, Loc, A) {
234b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis    assert(C.kind == CXCursor_IBOutletCollectionAttr);
235643d3ce93c501d19353f2fa578fee3e97f1d1b4bArgyrios Kyrtzidis    IBCollInfo.objcClass = 0;
236b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis  }
237b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis
238643d3ce93c501d19353f2fa578fee3e97f1d1b4bArgyrios Kyrtzidis  IBOutletCollectionInfo(const IBOutletCollectionInfo &other);
239643d3ce93c501d19353f2fa578fee3e97f1d1b4bArgyrios Kyrtzidis
240b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis  static bool classof(const AttrInfo *A) {
241b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis    return A->kind == CXIdxAttr_IBOutletCollection;
242b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis  }
243b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis  static bool classof(const IBOutletCollectionInfo *D) { return true; }
244b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis};
245b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis
246643d3ce93c501d19353f2fa578fee3e97f1d1b4bArgyrios Kyrtzidisclass AttrListInfo {
247d786f1a6331246e7d0eedde277f126ab92089eebArgyrios Kyrtzidis  ScratchAlloc SA;
248d786f1a6331246e7d0eedde277f126ab92089eebArgyrios Kyrtzidis
249643d3ce93c501d19353f2fa578fee3e97f1d1b4bArgyrios Kyrtzidis  SmallVector<AttrInfo, 2> Attrs;
250643d3ce93c501d19353f2fa578fee3e97f1d1b4bArgyrios Kyrtzidis  SmallVector<IBOutletCollectionInfo, 2> IBCollAttrs;
251643d3ce93c501d19353f2fa578fee3e97f1d1b4bArgyrios Kyrtzidis  SmallVector<CXIdxAttrInfo *, 2> CXAttrs;
252643d3ce93c501d19353f2fa578fee3e97f1d1b4bArgyrios Kyrtzidis  unsigned ref_cnt;
253643d3ce93c501d19353f2fa578fee3e97f1d1b4bArgyrios Kyrtzidis
254d786f1a6331246e7d0eedde277f126ab92089eebArgyrios Kyrtzidis  AttrListInfo(const AttrListInfo&); // DO NOT IMPLEMENT
255d786f1a6331246e7d0eedde277f126ab92089eebArgyrios Kyrtzidis  void operator=(const AttrListInfo&); // DO NOT IMPLEMENT
256643d3ce93c501d19353f2fa578fee3e97f1d1b4bArgyrios Kyrtzidispublic:
257d786f1a6331246e7d0eedde277f126ab92089eebArgyrios Kyrtzidis  AttrListInfo(const Decl *D, IndexingContext &IdxCtx);
258d786f1a6331246e7d0eedde277f126ab92089eebArgyrios Kyrtzidis
259d786f1a6331246e7d0eedde277f126ab92089eebArgyrios Kyrtzidis  static IntrusiveRefCntPtr<AttrListInfo> create(const Decl *D,
260d786f1a6331246e7d0eedde277f126ab92089eebArgyrios Kyrtzidis                                                 IndexingContext &IdxCtx);
261643d3ce93c501d19353f2fa578fee3e97f1d1b4bArgyrios Kyrtzidis
262643d3ce93c501d19353f2fa578fee3e97f1d1b4bArgyrios Kyrtzidis  const CXIdxAttrInfo *const *getAttrs() const {
263643d3ce93c501d19353f2fa578fee3e97f1d1b4bArgyrios Kyrtzidis    if (CXAttrs.empty())
264643d3ce93c501d19353f2fa578fee3e97f1d1b4bArgyrios Kyrtzidis      return 0;
265643d3ce93c501d19353f2fa578fee3e97f1d1b4bArgyrios Kyrtzidis    return CXAttrs.data();
266643d3ce93c501d19353f2fa578fee3e97f1d1b4bArgyrios Kyrtzidis  }
267643d3ce93c501d19353f2fa578fee3e97f1d1b4bArgyrios Kyrtzidis  unsigned getNumAttrs() const { return (unsigned)CXAttrs.size(); }
268643d3ce93c501d19353f2fa578fee3e97f1d1b4bArgyrios Kyrtzidis
269643d3ce93c501d19353f2fa578fee3e97f1d1b4bArgyrios Kyrtzidis  /// \brief Retain/Release only useful when we allocate a AttrListInfo from the
270643d3ce93c501d19353f2fa578fee3e97f1d1b4bArgyrios Kyrtzidis  /// BumpPtrAllocator, and not from the stack; so that we keep a pointer
271643d3ce93c501d19353f2fa578fee3e97f1d1b4bArgyrios Kyrtzidis  // in the EntityInfo
272643d3ce93c501d19353f2fa578fee3e97f1d1b4bArgyrios Kyrtzidis  void Retain() { ++ref_cnt; }
273643d3ce93c501d19353f2fa578fee3e97f1d1b4bArgyrios Kyrtzidis  void Release() {
274643d3ce93c501d19353f2fa578fee3e97f1d1b4bArgyrios Kyrtzidis    assert (ref_cnt > 0 && "Reference count is already zero.");
275643d3ce93c501d19353f2fa578fee3e97f1d1b4bArgyrios Kyrtzidis    if (--ref_cnt == 0) {
276643d3ce93c501d19353f2fa578fee3e97f1d1b4bArgyrios Kyrtzidis      // Memory is allocated from a BumpPtrAllocator, no need to delete it.
277643d3ce93c501d19353f2fa578fee3e97f1d1b4bArgyrios Kyrtzidis      this->~AttrListInfo();
278643d3ce93c501d19353f2fa578fee3e97f1d1b4bArgyrios Kyrtzidis    }
279643d3ce93c501d19353f2fa578fee3e97f1d1b4bArgyrios Kyrtzidis  }
280643d3ce93c501d19353f2fa578fee3e97f1d1b4bArgyrios Kyrtzidis};
281643d3ce93c501d19353f2fa578fee3e97f1d1b4bArgyrios Kyrtzidis
282c6b4a5099588fd21b49c80f730a596a64b2766c6Argyrios Kyrtzidisstruct RefFileOccurence {
283c6b4a5099588fd21b49c80f730a596a64b2766c6Argyrios Kyrtzidis  const FileEntry *File;
284c6b4a5099588fd21b49c80f730a596a64b2766c6Argyrios Kyrtzidis  const Decl *Dcl;
285c6b4a5099588fd21b49c80f730a596a64b2766c6Argyrios Kyrtzidis
286c6b4a5099588fd21b49c80f730a596a64b2766c6Argyrios Kyrtzidis  RefFileOccurence(const FileEntry *File, const Decl *Dcl)
287c6b4a5099588fd21b49c80f730a596a64b2766c6Argyrios Kyrtzidis    : File(File), Dcl(Dcl) { }
288c6b4a5099588fd21b49c80f730a596a64b2766c6Argyrios Kyrtzidis};
289c6b4a5099588fd21b49c80f730a596a64b2766c6Argyrios Kyrtzidis
2904e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidisclass IndexingContext {
2914e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis  ASTContext *Ctx;
2924e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis  CXClientData ClientData;
2934e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis  IndexerCallbacks &CB;
2944e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis  unsigned IndexOptions;
2954e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis  CXTranslationUnit CXTU;
2964e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis
297dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis  typedef llvm::DenseMap<const FileEntry *, CXIdxClientFile> FileMapTy;
2982957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis  typedef llvm::DenseMap<const DeclContext *, CXIdxClientContainer>
2992957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis    ContainerMapTy;
3002957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis  typedef llvm::DenseMap<const Decl *, CXIdxClientEntity> EntityMapTy;
3012957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis
3024e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis  FileMapTy FileMap;
3034e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis  ContainerMapTy ContainerMap;
3042957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis  EntityMapTy EntityMap;
3054e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis
306c6b4a5099588fd21b49c80f730a596a64b2766c6Argyrios Kyrtzidis  llvm::DenseSet<RefFileOccurence> RefFileOccurences;
307c6b4a5099588fd21b49c80f730a596a64b2766c6Argyrios Kyrtzidis
30830a2805c2c85e6abfe3149293f83f60da018b2dfArgyrios Kyrtzidis  std::deque<DeclGroupRef> TUDeclsInObjCContainer;
3094e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis
31037f40572c4c78a8c57a7b45266f8b86db172a7c1Argyrios Kyrtzidis  llvm::BumpPtrAllocator StrScratch;
311dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis  unsigned StrAdapterCount;
312643d3ce93c501d19353f2fa578fee3e97f1d1b4bArgyrios Kyrtzidis  friend class ScratchAlloc;
3134e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis
3146ec43adc39006a7fce94188956d0239bd54c0363Argyrios Kyrtzidis  struct ObjCProtocolListInfo {
3156ec43adc39006a7fce94188956d0239bd54c0363Argyrios Kyrtzidis    SmallVector<CXIdxObjCProtocolRefInfo, 4> ProtInfos;
3162957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis    SmallVector<EntityInfo, 4> ProtEntities;
3176ec43adc39006a7fce94188956d0239bd54c0363Argyrios Kyrtzidis    SmallVector<CXIdxObjCProtocolRefInfo *, 4> Prots;
3186ec43adc39006a7fce94188956d0239bd54c0363Argyrios Kyrtzidis
319b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis    CXIdxObjCProtocolRefListInfo getListInfo() const {
320c71d55469e7d5f7b376a30620617a175a9442da9Argyrios Kyrtzidis      CXIdxObjCProtocolRefListInfo Info = { Prots.data(),
321c71d55469e7d5f7b376a30620617a175a9442da9Argyrios Kyrtzidis                                            (unsigned)Prots.size() };
322c71d55469e7d5f7b376a30620617a175a9442da9Argyrios Kyrtzidis      return Info;
323c71d55469e7d5f7b376a30620617a175a9442da9Argyrios Kyrtzidis    }
3246ec43adc39006a7fce94188956d0239bd54c0363Argyrios Kyrtzidis
3256ec43adc39006a7fce94188956d0239bd54c0363Argyrios Kyrtzidis    ObjCProtocolListInfo(const ObjCProtocolList &ProtList,
3266ec43adc39006a7fce94188956d0239bd54c0363Argyrios Kyrtzidis                         IndexingContext &IdxCtx,
327643d3ce93c501d19353f2fa578fee3e97f1d1b4bArgyrios Kyrtzidis                         ScratchAlloc &SA);
3282957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis  };
3292957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis
3302957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis  struct CXXBasesListInfo {
3312957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis    SmallVector<CXIdxBaseClassInfo, 4> BaseInfos;
3322957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis    SmallVector<EntityInfo, 4> BaseEntities;
3332957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis    SmallVector<CXIdxBaseClassInfo *, 4> CXBases;
3342957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis
3352957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis    const CXIdxBaseClassInfo *const *getBases() const {
3362957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis      return CXBases.data();
3372957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis    }
3382957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis    unsigned getNumBases() const { return (unsigned)CXBases.size(); }
3392957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis
3402957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis    CXXBasesListInfo(const CXXRecordDecl *D,
341643d3ce93c501d19353f2fa578fee3e97f1d1b4bArgyrios Kyrtzidis                     IndexingContext &IdxCtx, ScratchAlloc &SA);
342b526a871af40b84d9878eded54a181bf4003b376Argyrios Kyrtzidis
343b526a871af40b84d9878eded54a181bf4003b376Argyrios Kyrtzidis  private:
344b526a871af40b84d9878eded54a181bf4003b376Argyrios Kyrtzidis    SourceLocation getBaseLoc(const CXXBaseSpecifier &Base) const;
3452957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis  };
346b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis
347643d3ce93c501d19353f2fa578fee3e97f1d1b4bArgyrios Kyrtzidis  friend class AttrListInfo;
348643d3ce93c501d19353f2fa578fee3e97f1d1b4bArgyrios Kyrtzidis
3494e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidispublic:
3504e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis  IndexingContext(CXClientData clientData, IndexerCallbacks &indexCallbacks,
3514e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis                  unsigned indexOptions, CXTranslationUnit cxTU)
3524e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis    : Ctx(0), ClientData(clientData), CB(indexCallbacks),
35337f40572c4c78a8c57a7b45266f8b86db172a7c1Argyrios Kyrtzidis      IndexOptions(indexOptions), CXTU(cxTU),
35437f40572c4c78a8c57a7b45266f8b86db172a7c1Argyrios Kyrtzidis      StrScratch(/*size=*/1024), StrAdapterCount(0) { }
3554e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis
3564e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis  ASTContext &getASTContext() const { return *Ctx; }
3574e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis
3584e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis  void setASTContext(ASTContext &ctx);
3597fe90f3bfa6bd7f779ecfd4ba201a296a3a1c8cbArgyrios Kyrtzidis  void setPreprocessor(Preprocessor &PP);
3604e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis
36158d2dbea680a75de266c5eff77cc15c323cfd48aArgyrios Kyrtzidis  bool shouldSuppressRefs() const {
362b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis    return IndexOptions & CXIndexOpt_SuppressRedundantRefs;
363c6b4a5099588fd21b49c80f730a596a64b2766c6Argyrios Kyrtzidis  }
364c6b4a5099588fd21b49c80f730a596a64b2766c6Argyrios Kyrtzidis
36558d2dbea680a75de266c5eff77cc15c323cfd48aArgyrios Kyrtzidis  bool shouldIndexFunctionLocalSymbols() const {
36622490747c123a78feec089539f30426084d348cfArgyrios Kyrtzidis    return IndexOptions & CXIndexOpt_IndexFunctionLocalSymbols;
36722490747c123a78feec089539f30426084d348cfArgyrios Kyrtzidis  }
36822490747c123a78feec089539f30426084d348cfArgyrios Kyrtzidis
36958d2dbea680a75de266c5eff77cc15c323cfd48aArgyrios Kyrtzidis  bool shouldIndexImplicitTemplateInsts() const {
37058d2dbea680a75de266c5eff77cc15c323cfd48aArgyrios Kyrtzidis    return IndexOptions & CXIndexOpt_IndexImplicitTemplateInstantiations;
37158d2dbea680a75de266c5eff77cc15c323cfd48aArgyrios Kyrtzidis  }
37258d2dbea680a75de266c5eff77cc15c323cfd48aArgyrios Kyrtzidis
373b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis  bool shouldAbort();
374b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis
375996e6e564af7483e2d5e0b70df5fdb9f79ec4b5aArgyrios Kyrtzidis  bool hasDiagnosticCallback() const { return CB.diagnostic; }
376996e6e564af7483e2d5e0b70df5fdb9f79ec4b5aArgyrios Kyrtzidis
377dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis  void enteredMainFile(const FileEntry *File);
378dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis
3794e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis  void ppIncludedFile(SourceLocation hashLoc,
3804e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis                      StringRef filename, const FileEntry *File,
3814e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis                      bool isImport, bool isAngled);
3824e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis
3836ec43adc39006a7fce94188956d0239bd54c0363Argyrios Kyrtzidis  void startedTranslationUnit();
3844e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis
3854e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis  void indexDecl(const Decl *D);
3864e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis
3874e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis  void indexTagDecl(const TagDecl *D);
3884e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis
3894e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis  void indexTypeSourceInfo(TypeSourceInfo *TInfo, const NamedDecl *Parent,
3904e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis                           const DeclContext *DC = 0);
3914e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis
3924e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis  void indexTypeLoc(TypeLoc TL, const NamedDecl *Parent,
393e422e45a6a89d450b8eca10f671b49874e87617aArgyrios Kyrtzidis                    const DeclContext *DC = 0);
394e422e45a6a89d450b8eca10f671b49874e87617aArgyrios Kyrtzidis
395e422e45a6a89d450b8eca10f671b49874e87617aArgyrios Kyrtzidis  void indexNestedNameSpecifierLoc(NestedNameSpecifierLoc NNS,
396e422e45a6a89d450b8eca10f671b49874e87617aArgyrios Kyrtzidis                                   const NamedDecl *Parent,
397e422e45a6a89d450b8eca10f671b49874e87617aArgyrios Kyrtzidis                                   const DeclContext *DC = 0);
3984e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis
3994e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis  void indexDeclContext(const DeclContext *DC);
4004e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis
401e422e45a6a89d450b8eca10f671b49874e87617aArgyrios Kyrtzidis  void indexBody(const Stmt *S, const NamedDecl *Parent,
402e422e45a6a89d450b8eca10f671b49874e87617aArgyrios Kyrtzidis                 const DeclContext *DC = 0);
4034e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis
404b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis  void handleDiagnosticSet(CXDiagnosticSet CXDiagSet);
4054e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis
406b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis  bool handleFunction(const FunctionDecl *FD);
4074e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis
408b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis  bool handleVar(const VarDecl *D);
4094e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis
410b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis  bool handleField(const FieldDecl *D);
4114e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis
412b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis  bool handleEnumerator(const EnumConstantDecl *D);
4134e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis
414b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis  bool handleTagDecl(const TagDecl *D);
4154e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis
4162957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis  bool handleTypedefName(const TypedefNameDecl *D);
4174e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis
418b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis  bool handleObjCInterface(const ObjCInterfaceDecl *D);
419b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis  bool handleObjCImplementation(const ObjCImplementationDecl *D);
4204e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis
421b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis  bool handleObjCProtocol(const ObjCProtocolDecl *D);
422b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis
423b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis  bool handleObjCCategory(const ObjCCategoryDecl *D);
424b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis  bool handleObjCCategoryImpl(const ObjCCategoryImplDecl *D);
4254e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis
426b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis  bool handleObjCMethod(const ObjCMethodDecl *D);
4274e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis
428b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis  bool handleSynthesizedObjCProperty(const ObjCPropertyImplDecl *D);
429f911242f43ae1b0a85c323631fe817df95c9cbe9Argyrios Kyrtzidis  bool handleSynthesizedObjCMethod(const ObjCMethodDecl *D, SourceLocation Loc,
430f911242f43ae1b0a85c323631fe817df95c9cbe9Argyrios Kyrtzidis                                   const DeclContext *LexicalDC);
4314e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis
432b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis  bool handleObjCProperty(const ObjCPropertyDecl *D);
4334e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis
43468478b0cc1ff03c0d13ceca6800c5becf08791e7Argyrios Kyrtzidis  bool handleNamespace(const NamespaceDecl *D);
43568478b0cc1ff03c0d13ceca6800c5becf08791e7Argyrios Kyrtzidis
4362957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis  bool handleClassTemplate(const ClassTemplateDecl *D);
4372957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis  bool handleFunctionTemplate(const FunctionTemplateDecl *D);
4382957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis  bool handleTypeAliasTemplate(const TypeAliasTemplateDecl *D);
4392957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis
440b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis  bool handleReference(const NamedDecl *D, SourceLocation Loc, CXCursor Cursor,
441b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis                       const NamedDecl *Parent,
442b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis                       const DeclContext *DC,
443b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis                       const Expr *E = 0,
444b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis                       CXIdxEntityRefKind Kind = CXIdxEntityRef_Direct);
445b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis
446b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis  bool handleReference(const NamedDecl *D, SourceLocation Loc,
4474e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis                       const NamedDecl *Parent,
4484e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis                       const DeclContext *DC,
449aca19be8731fc31cff68702de0dc7f30ce908979Argyrios Kyrtzidis                       const Expr *E = 0,
450aca19be8731fc31cff68702de0dc7f30ce908979Argyrios Kyrtzidis                       CXIdxEntityRefKind Kind = CXIdxEntityRef_Direct);
4514e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis
4524e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis  bool isNotFromSourceFile(SourceLocation Loc) const;
4534e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis
45421ee5707e6e59d982d2f2ae28e079c7ff46dc519Argyrios Kyrtzidis  void indexTopLevelDecl(Decl *D);
4554e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis  void indexTUDeclsInObjCContainer();
4564e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis  void indexDeclGroupRef(DeclGroupRef DG);
4574e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis
4584e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis  void addTUDeclInObjCContainer(DeclGroupRef DG) {
4594e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis    TUDeclsInObjCContainer.push_back(DG);
4604e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis  }
4614e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis
462dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis  void translateLoc(SourceLocation Loc, CXIdxClientFile *indexFile, CXFile *file,
4634e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis                    unsigned *line, unsigned *column, unsigned *offset);
4644e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis
4652957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis  CXIdxClientContainer getClientContainerForDC(const DeclContext *DC) const;
4662957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis  void addContainerInMap(const DeclContext *DC, CXIdxClientContainer container);
4672957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis
4682957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis  CXIdxClientEntity getClientEntity(const Decl *D) const;
4692957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis  void setClientEntity(const Decl *D, CXIdxClientEntity client);
4702957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis
4716d968363877388f0a0268711d59367907b465ae1Argyrios Kyrtzidis  static bool isTemplateImplicitInstantiation(const Decl *D);
4726d968363877388f0a0268711d59367907b465ae1Argyrios Kyrtzidis
4734e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidisprivate:
474b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis  bool handleDecl(const NamedDecl *D,
475dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis                  SourceLocation Loc, CXCursor Cursor,
476f911242f43ae1b0a85c323631fe817df95c9cbe9Argyrios Kyrtzidis                  DeclInfo &DInfo,
477f911242f43ae1b0a85c323631fe817df95c9cbe9Argyrios Kyrtzidis                  const DeclContext *LexicalDC = 0);
478dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis
479b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis  bool handleObjCContainer(const ObjCContainerDecl *D,
480dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis                           SourceLocation Loc, CXCursor Cursor,
481dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis                           ObjCContainerDeclInfo &ContDInfo);
4824e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis
4832957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis  bool handleCXXRecordDecl(const CXXRecordDecl *RD, const NamedDecl *OrigD);
484dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis
485b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis  bool markEntityOccurrenceInFile(const NamedDecl *D, SourceLocation Loc);
486b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis
4874e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis  const NamedDecl *getEntityDecl(const NamedDecl *D) const;
4884e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis
4892957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis  const DeclContext *getEntityContainer(const Decl *D) const;
4902957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis
491dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis  CXIdxClientFile getIndexFile(const FileEntry *File);
4924e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis
4934e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis  CXIdxLoc getIndexLoc(SourceLocation Loc) const;
4944e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis
4954e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis  void getEntityInfo(const NamedDecl *D,
4962957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis                     EntityInfo &EntityInfo,
497643d3ce93c501d19353f2fa578fee3e97f1d1b4bArgyrios Kyrtzidis                     ScratchAlloc &SA);
4984e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis
4992957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis  void getContainerInfo(const DeclContext *DC, ContainerInfo &ContInfo);
5002957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis
501b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis  CXCursor getCursor(const Decl *D) {
502b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis    return cxcursor::MakeCXCursor(const_cast<Decl*>(D), CXTU);
5034e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis  }
5044e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis
5054e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis  CXCursor getRefCursor(const NamedDecl *D, SourceLocation Loc);
5062957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis
507d08900848307fdaea19d52249bdced94eefdb9bbArgyrios Kyrtzidis  static bool shouldIgnoreIfImplicit(const Decl *D);
5084e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis};
5094e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis
510d786f1a6331246e7d0eedde277f126ab92089eebArgyrios Kyrtzidisinline ScratchAlloc::ScratchAlloc(IndexingContext &idxCtx) : IdxCtx(idxCtx) {
511d786f1a6331246e7d0eedde277f126ab92089eebArgyrios Kyrtzidis  ++IdxCtx.StrAdapterCount;
512d786f1a6331246e7d0eedde277f126ab92089eebArgyrios Kyrtzidis}
513d786f1a6331246e7d0eedde277f126ab92089eebArgyrios Kyrtzidisinline ScratchAlloc::ScratchAlloc(const ScratchAlloc &SA) : IdxCtx(SA.IdxCtx) {
514d786f1a6331246e7d0eedde277f126ab92089eebArgyrios Kyrtzidis  ++IdxCtx.StrAdapterCount;
515d786f1a6331246e7d0eedde277f126ab92089eebArgyrios Kyrtzidis}
516643d3ce93c501d19353f2fa578fee3e97f1d1b4bArgyrios Kyrtzidis
517d786f1a6331246e7d0eedde277f126ab92089eebArgyrios Kyrtzidisinline ScratchAlloc::~ScratchAlloc() {
518d786f1a6331246e7d0eedde277f126ab92089eebArgyrios Kyrtzidis  --IdxCtx.StrAdapterCount;
519d786f1a6331246e7d0eedde277f126ab92089eebArgyrios Kyrtzidis  if (IdxCtx.StrAdapterCount == 0)
520d786f1a6331246e7d0eedde277f126ab92089eebArgyrios Kyrtzidis    IdxCtx.StrScratch.Reset();
521d786f1a6331246e7d0eedde277f126ab92089eebArgyrios Kyrtzidis}
522643d3ce93c501d19353f2fa578fee3e97f1d1b4bArgyrios Kyrtzidis
523d786f1a6331246e7d0eedde277f126ab92089eebArgyrios Kyrtzidistemplate <typename T>
524d786f1a6331246e7d0eedde277f126ab92089eebArgyrios Kyrtzidisinline T *ScratchAlloc::allocate() {
525d786f1a6331246e7d0eedde277f126ab92089eebArgyrios Kyrtzidis  return IdxCtx.StrScratch.Allocate<T>();
526d786f1a6331246e7d0eedde277f126ab92089eebArgyrios Kyrtzidis}
527643d3ce93c501d19353f2fa578fee3e97f1d1b4bArgyrios Kyrtzidis
5284e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis}} // end clang::cxindex
529c6b4a5099588fd21b49c80f730a596a64b2766c6Argyrios Kyrtzidis
530c6b4a5099588fd21b49c80f730a596a64b2766c6Argyrios Kyrtzidisnamespace llvm {
531c6b4a5099588fd21b49c80f730a596a64b2766c6Argyrios Kyrtzidis  /// Define DenseMapInfo so that FileID's can be used as keys in DenseMap and
532c6b4a5099588fd21b49c80f730a596a64b2766c6Argyrios Kyrtzidis  /// DenseSets.
533c6b4a5099588fd21b49c80f730a596a64b2766c6Argyrios Kyrtzidis  template <>
534c6b4a5099588fd21b49c80f730a596a64b2766c6Argyrios Kyrtzidis  struct DenseMapInfo<clang::cxindex::RefFileOccurence> {
535c6b4a5099588fd21b49c80f730a596a64b2766c6Argyrios Kyrtzidis    static inline clang::cxindex::RefFileOccurence getEmptyKey() {
536c6b4a5099588fd21b49c80f730a596a64b2766c6Argyrios Kyrtzidis      return clang::cxindex::RefFileOccurence(0, 0);
537c6b4a5099588fd21b49c80f730a596a64b2766c6Argyrios Kyrtzidis    }
538c6b4a5099588fd21b49c80f730a596a64b2766c6Argyrios Kyrtzidis
539c6b4a5099588fd21b49c80f730a596a64b2766c6Argyrios Kyrtzidis    static inline clang::cxindex::RefFileOccurence getTombstoneKey() {
540c6b4a5099588fd21b49c80f730a596a64b2766c6Argyrios Kyrtzidis      return clang::cxindex::RefFileOccurence((const clang::FileEntry *)~0,
541c6b4a5099588fd21b49c80f730a596a64b2766c6Argyrios Kyrtzidis                                              (const clang::Decl *)~0);
542c6b4a5099588fd21b49c80f730a596a64b2766c6Argyrios Kyrtzidis    }
543c6b4a5099588fd21b49c80f730a596a64b2766c6Argyrios Kyrtzidis
544c6b4a5099588fd21b49c80f730a596a64b2766c6Argyrios Kyrtzidis    static unsigned getHashValue(clang::cxindex::RefFileOccurence S) {
54528b230723d5daf3c48c2e134f4b5626bd69392c8Benjamin Kramer      typedef std::pair<const clang::FileEntry *, const clang::Decl *> PairTy;
54628b230723d5daf3c48c2e134f4b5626bd69392c8Benjamin Kramer      return DenseMapInfo<PairTy>::getHashValue(PairTy(S.File, S.Dcl));
547c6b4a5099588fd21b49c80f730a596a64b2766c6Argyrios Kyrtzidis    }
548c6b4a5099588fd21b49c80f730a596a64b2766c6Argyrios Kyrtzidis
549c6b4a5099588fd21b49c80f730a596a64b2766c6Argyrios Kyrtzidis    static bool isEqual(clang::cxindex::RefFileOccurence LHS,
550c6b4a5099588fd21b49c80f730a596a64b2766c6Argyrios Kyrtzidis                        clang::cxindex::RefFileOccurence RHS) {
551c6b4a5099588fd21b49c80f730a596a64b2766c6Argyrios Kyrtzidis      return LHS.File == RHS.File && LHS.Dcl == RHS.Dcl;
552c6b4a5099588fd21b49c80f730a596a64b2766c6Argyrios Kyrtzidis    }
553c6b4a5099588fd21b49c80f730a596a64b2766c6Argyrios Kyrtzidis  };
554c6b4a5099588fd21b49c80f730a596a64b2766c6Argyrios Kyrtzidis}
555