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