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