IndexingContext.h revision d08900848307fdaea19d52249bdced94eefdb9bb
14e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis//===- IndexingContext.h - Higher level API functions ------------------------===// 24e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis// 34e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis// The LLVM Compiler Infrastructure 44e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis// 54e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis// This file is distributed under the University of Illinois Open Source 64e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis// License. See LICENSE.TXT for details. 74e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis// 84e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis//===----------------------------------------------------------------------===// 94e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis 104e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis#include "Index_Internal.h" 114e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis#include "CXCursor.h" 124e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis 136ec43adc39006a7fce94188956d0239bd54c0363Argyrios Kyrtzidis#include "clang/AST/DeclObjC.h" 144e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis#include "clang/AST/DeclGroup.h" 15c6b4a5099588fd21b49c80f730a596a64b2766c6Argyrios Kyrtzidis#include "llvm/ADT/DenseSet.h" 164e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis 174e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidisnamespace clang { 184e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis class FileEntry; 194e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis class ObjCPropertyDecl; 202957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis class ClassTemplateDecl; 212957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis class FunctionTemplateDecl; 222957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis class TypeAliasTemplateDecl; 234e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis 244e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidisnamespace cxindex { 254e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis class IndexingContext; 26643d3ce93c501d19353f2fa578fee3e97f1d1b4bArgyrios Kyrtzidis class ScratchAlloc; 27643d3ce93c501d19353f2fa578fee3e97f1d1b4bArgyrios Kyrtzidis class AttrListInfo; 284e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis 292957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidisstruct EntityInfo : public CXIdxEntityInfo { 302957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis const NamedDecl *Dcl; 312957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis IndexingContext *IndexCtx; 32643d3ce93c501d19353f2fa578fee3e97f1d1b4bArgyrios Kyrtzidis llvm::IntrusiveRefCntPtr<AttrListInfo> AttrList; 3337f40572c4c78a8c57a7b45266f8b86db172a7c1Argyrios Kyrtzidis 3437f40572c4c78a8c57a7b45266f8b86db172a7c1Argyrios Kyrtzidis EntityInfo() { 3537f40572c4c78a8c57a7b45266f8b86db172a7c1Argyrios Kyrtzidis name = USR = 0; 36643d3ce93c501d19353f2fa578fee3e97f1d1b4bArgyrios Kyrtzidis attributes = 0; 37643d3ce93c501d19353f2fa578fee3e97f1d1b4bArgyrios Kyrtzidis numAttributes = 0; 3837f40572c4c78a8c57a7b45266f8b86db172a7c1Argyrios Kyrtzidis } 392957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis}; 402957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis 412957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidisstruct ContainerInfo : public CXIdxContainerInfo { 422957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis const DeclContext *DC; 432957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis IndexingContext *IndexCtx; 442957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis}; 452957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis 46dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidisstruct DeclInfo : public CXIdxDeclInfo { 47c71d55469e7d5f7b376a30620617a175a9442da9Argyrios Kyrtzidis enum DInfoKind { 48c71d55469e7d5f7b376a30620617a175a9442da9Argyrios Kyrtzidis Info_Decl, 49c71d55469e7d5f7b376a30620617a175a9442da9Argyrios Kyrtzidis 50c71d55469e7d5f7b376a30620617a175a9442da9Argyrios Kyrtzidis Info_ObjCContainer, 51c71d55469e7d5f7b376a30620617a175a9442da9Argyrios Kyrtzidis Info_ObjCInterface, 52c71d55469e7d5f7b376a30620617a175a9442da9Argyrios Kyrtzidis Info_ObjCProtocol, 532957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis Info_ObjCCategory, 542957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis 552957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis Info_CXXClass 56c71d55469e7d5f7b376a30620617a175a9442da9Argyrios Kyrtzidis }; 57c71d55469e7d5f7b376a30620617a175a9442da9Argyrios Kyrtzidis 58c71d55469e7d5f7b376a30620617a175a9442da9Argyrios Kyrtzidis DInfoKind Kind; 59c71d55469e7d5f7b376a30620617a175a9442da9Argyrios Kyrtzidis 602957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis EntityInfo EntInfo; 61b1febb646bf7a2f319ad894c9833968c52d21711Argyrios Kyrtzidis ContainerInfo SemanticContainer; 62b1febb646bf7a2f319ad894c9833968c52d21711Argyrios Kyrtzidis ContainerInfo LexicalContainer; 632957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis ContainerInfo DeclAsContainer; 642957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis 65c71d55469e7d5f7b376a30620617a175a9442da9Argyrios Kyrtzidis DeclInfo(bool isRedeclaration, bool isDefinition, bool isContainer) 66c71d55469e7d5f7b376a30620617a175a9442da9Argyrios Kyrtzidis : Kind(Info_Decl) { 67c71d55469e7d5f7b376a30620617a175a9442da9Argyrios Kyrtzidis this->isRedeclaration = isRedeclaration; 68c71d55469e7d5f7b376a30620617a175a9442da9Argyrios Kyrtzidis this->isDefinition = isDefinition; 69c71d55469e7d5f7b376a30620617a175a9442da9Argyrios Kyrtzidis this->isContainer = isContainer; 70b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis attributes = 0; 71b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis numAttributes = 0; 72b1febb646bf7a2f319ad894c9833968c52d21711Argyrios Kyrtzidis declAsContainer = semanticContainer = lexicalContainer = 0; 73c71d55469e7d5f7b376a30620617a175a9442da9Argyrios Kyrtzidis } 74c71d55469e7d5f7b376a30620617a175a9442da9Argyrios Kyrtzidis DeclInfo(DInfoKind K, 75c71d55469e7d5f7b376a30620617a175a9442da9Argyrios Kyrtzidis bool isRedeclaration, bool isDefinition, bool isContainer) 76c71d55469e7d5f7b376a30620617a175a9442da9Argyrios Kyrtzidis : Kind(K) { 77c71d55469e7d5f7b376a30620617a175a9442da9Argyrios Kyrtzidis this->isRedeclaration = isRedeclaration; 78c71d55469e7d5f7b376a30620617a175a9442da9Argyrios Kyrtzidis this->isDefinition = isDefinition; 79c71d55469e7d5f7b376a30620617a175a9442da9Argyrios Kyrtzidis this->isContainer = isContainer; 80b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis attributes = 0; 81b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis numAttributes = 0; 82b1febb646bf7a2f319ad894c9833968c52d21711Argyrios Kyrtzidis declAsContainer = semanticContainer = lexicalContainer = 0; 83c71d55469e7d5f7b376a30620617a175a9442da9Argyrios Kyrtzidis } 84c71d55469e7d5f7b376a30620617a175a9442da9Argyrios Kyrtzidis 85c71d55469e7d5f7b376a30620617a175a9442da9Argyrios Kyrtzidis static bool classof(const DeclInfo *) { return true; } 86dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis}; 87dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis 88dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidisstruct ObjCContainerDeclInfo : public DeclInfo { 896ec43adc39006a7fce94188956d0239bd54c0363Argyrios Kyrtzidis CXIdxObjCContainerDeclInfo ObjCContDeclInfo; 90dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis 91c71d55469e7d5f7b376a30620617a175a9442da9Argyrios Kyrtzidis ObjCContainerDeclInfo(bool isForwardRef, 92c71d55469e7d5f7b376a30620617a175a9442da9Argyrios Kyrtzidis bool isRedeclaration, 93c71d55469e7d5f7b376a30620617a175a9442da9Argyrios Kyrtzidis bool isImplementation) 94c71d55469e7d5f7b376a30620617a175a9442da9Argyrios Kyrtzidis : DeclInfo(Info_ObjCContainer, isRedeclaration, 95c71d55469e7d5f7b376a30620617a175a9442da9Argyrios Kyrtzidis /*isDefinition=*/!isForwardRef, /*isContainer=*/!isForwardRef) { 96c71d55469e7d5f7b376a30620617a175a9442da9Argyrios Kyrtzidis init(isForwardRef, isImplementation); 97c71d55469e7d5f7b376a30620617a175a9442da9Argyrios Kyrtzidis } 98c71d55469e7d5f7b376a30620617a175a9442da9Argyrios Kyrtzidis ObjCContainerDeclInfo(DInfoKind K, 99c71d55469e7d5f7b376a30620617a175a9442da9Argyrios Kyrtzidis bool isForwardRef, 100c71d55469e7d5f7b376a30620617a175a9442da9Argyrios Kyrtzidis bool isRedeclaration, 101c71d55469e7d5f7b376a30620617a175a9442da9Argyrios Kyrtzidis bool isImplementation) 102c71d55469e7d5f7b376a30620617a175a9442da9Argyrios Kyrtzidis : DeclInfo(K, isRedeclaration, /*isDefinition=*/!isForwardRef, 103c71d55469e7d5f7b376a30620617a175a9442da9Argyrios Kyrtzidis /*isContainer=*/!isForwardRef) { 104c71d55469e7d5f7b376a30620617a175a9442da9Argyrios Kyrtzidis init(isForwardRef, isImplementation); 105c71d55469e7d5f7b376a30620617a175a9442da9Argyrios Kyrtzidis } 106c71d55469e7d5f7b376a30620617a175a9442da9Argyrios Kyrtzidis 107c71d55469e7d5f7b376a30620617a175a9442da9Argyrios Kyrtzidis static bool classof(const DeclInfo *D) { 108c71d55469e7d5f7b376a30620617a175a9442da9Argyrios Kyrtzidis return Info_ObjCContainer <= D->Kind && D->Kind <= Info_ObjCCategory; 109c71d55469e7d5f7b376a30620617a175a9442da9Argyrios Kyrtzidis } 110c71d55469e7d5f7b376a30620617a175a9442da9Argyrios Kyrtzidis static bool classof(const ObjCContainerDeclInfo *D) { return true; } 111c71d55469e7d5f7b376a30620617a175a9442da9Argyrios Kyrtzidis 112c71d55469e7d5f7b376a30620617a175a9442da9Argyrios Kyrtzidisprivate: 113c71d55469e7d5f7b376a30620617a175a9442da9Argyrios Kyrtzidis void init(bool isForwardRef, bool isImplementation) { 114c71d55469e7d5f7b376a30620617a175a9442da9Argyrios Kyrtzidis if (isForwardRef) 115c71d55469e7d5f7b376a30620617a175a9442da9Argyrios Kyrtzidis ObjCContDeclInfo.kind = CXIdxObjCContainer_ForwardRef; 116c71d55469e7d5f7b376a30620617a175a9442da9Argyrios Kyrtzidis else if (isImplementation) 117c71d55469e7d5f7b376a30620617a175a9442da9Argyrios Kyrtzidis ObjCContDeclInfo.kind = CXIdxObjCContainer_Implementation; 118c71d55469e7d5f7b376a30620617a175a9442da9Argyrios Kyrtzidis else 119c71d55469e7d5f7b376a30620617a175a9442da9Argyrios Kyrtzidis ObjCContDeclInfo.kind = CXIdxObjCContainer_Interface; 120c71d55469e7d5f7b376a30620617a175a9442da9Argyrios Kyrtzidis } 1216ec43adc39006a7fce94188956d0239bd54c0363Argyrios Kyrtzidis}; 1226ec43adc39006a7fce94188956d0239bd54c0363Argyrios Kyrtzidis 123c71d55469e7d5f7b376a30620617a175a9442da9Argyrios Kyrtzidisstruct ObjCInterfaceDeclInfo : public ObjCContainerDeclInfo { 1246ec43adc39006a7fce94188956d0239bd54c0363Argyrios Kyrtzidis CXIdxObjCInterfaceDeclInfo ObjCInterDeclInfo; 125c71d55469e7d5f7b376a30620617a175a9442da9Argyrios Kyrtzidis CXIdxObjCProtocolRefListInfo ObjCProtoListInfo; 126c71d55469e7d5f7b376a30620617a175a9442da9Argyrios Kyrtzidis 127c71d55469e7d5f7b376a30620617a175a9442da9Argyrios Kyrtzidis ObjCInterfaceDeclInfo(const ObjCInterfaceDecl *D) 128c71d55469e7d5f7b376a30620617a175a9442da9Argyrios Kyrtzidis : ObjCContainerDeclInfo(Info_ObjCInterface, 129c71d55469e7d5f7b376a30620617a175a9442da9Argyrios Kyrtzidis /*isForwardRef=*/false, 130ef96ee0be5f100789f451641542a69cd719144d2Douglas Gregor /*isRedeclaration=*/D->getPreviousDecl() != 0, 131c71d55469e7d5f7b376a30620617a175a9442da9Argyrios Kyrtzidis /*isImplementation=*/false) { } 132c71d55469e7d5f7b376a30620617a175a9442da9Argyrios Kyrtzidis 133c71d55469e7d5f7b376a30620617a175a9442da9Argyrios Kyrtzidis static bool classof(const DeclInfo *D) { 134c71d55469e7d5f7b376a30620617a175a9442da9Argyrios Kyrtzidis return D->Kind == Info_ObjCInterface; 135c71d55469e7d5f7b376a30620617a175a9442da9Argyrios Kyrtzidis } 136c71d55469e7d5f7b376a30620617a175a9442da9Argyrios Kyrtzidis static bool classof(const ObjCInterfaceDeclInfo *D) { return true; } 1376ec43adc39006a7fce94188956d0239bd54c0363Argyrios Kyrtzidis}; 1386ec43adc39006a7fce94188956d0239bd54c0363Argyrios Kyrtzidis 139c71d55469e7d5f7b376a30620617a175a9442da9Argyrios Kyrtzidisstruct ObjCProtocolDeclInfo : public ObjCContainerDeclInfo { 140c71d55469e7d5f7b376a30620617a175a9442da9Argyrios Kyrtzidis CXIdxObjCProtocolRefListInfo ObjCProtoRefListInfo; 141c71d55469e7d5f7b376a30620617a175a9442da9Argyrios Kyrtzidis 142c71d55469e7d5f7b376a30620617a175a9442da9Argyrios Kyrtzidis ObjCProtocolDeclInfo(const ObjCProtocolDecl *D) 143c71d55469e7d5f7b376a30620617a175a9442da9Argyrios Kyrtzidis : ObjCContainerDeclInfo(Info_ObjCProtocol, 144c71d55469e7d5f7b376a30620617a175a9442da9Argyrios Kyrtzidis /*isForwardRef=*/false, 145ef96ee0be5f100789f451641542a69cd719144d2Douglas Gregor /*isRedeclaration=*/D->getPreviousDecl(), 146c71d55469e7d5f7b376a30620617a175a9442da9Argyrios Kyrtzidis /*isImplementation=*/false) { } 147c71d55469e7d5f7b376a30620617a175a9442da9Argyrios Kyrtzidis 148c71d55469e7d5f7b376a30620617a175a9442da9Argyrios Kyrtzidis static bool classof(const DeclInfo *D) { 149c71d55469e7d5f7b376a30620617a175a9442da9Argyrios Kyrtzidis return D->Kind == Info_ObjCProtocol; 150c71d55469e7d5f7b376a30620617a175a9442da9Argyrios Kyrtzidis } 151c71d55469e7d5f7b376a30620617a175a9442da9Argyrios Kyrtzidis static bool classof(const ObjCProtocolDeclInfo *D) { return true; } 152c71d55469e7d5f7b376a30620617a175a9442da9Argyrios Kyrtzidis}; 153c71d55469e7d5f7b376a30620617a175a9442da9Argyrios Kyrtzidis 154c71d55469e7d5f7b376a30620617a175a9442da9Argyrios Kyrtzidisstruct ObjCCategoryDeclInfo : public ObjCContainerDeclInfo { 155c71d55469e7d5f7b376a30620617a175a9442da9Argyrios Kyrtzidis CXIdxObjCCategoryDeclInfo ObjCCatDeclInfo; 156c10a4c8baff3164bee9b7fc293679a5a5a90eb74Argyrios Kyrtzidis CXIdxObjCProtocolRefListInfo ObjCProtoListInfo; 157c71d55469e7d5f7b376a30620617a175a9442da9Argyrios Kyrtzidis 158c71d55469e7d5f7b376a30620617a175a9442da9Argyrios Kyrtzidis explicit ObjCCategoryDeclInfo(bool isImplementation) 159c71d55469e7d5f7b376a30620617a175a9442da9Argyrios Kyrtzidis : ObjCContainerDeclInfo(Info_ObjCCategory, 160c71d55469e7d5f7b376a30620617a175a9442da9Argyrios Kyrtzidis /*isForwardRef=*/false, 161c71d55469e7d5f7b376a30620617a175a9442da9Argyrios Kyrtzidis /*isRedeclaration=*/isImplementation, 162c71d55469e7d5f7b376a30620617a175a9442da9Argyrios Kyrtzidis /*isImplementation=*/isImplementation) { } 163c71d55469e7d5f7b376a30620617a175a9442da9Argyrios Kyrtzidis 164c71d55469e7d5f7b376a30620617a175a9442da9Argyrios Kyrtzidis static bool classof(const DeclInfo *D) { 165c71d55469e7d5f7b376a30620617a175a9442da9Argyrios Kyrtzidis return D->Kind == Info_ObjCCategory; 166c71d55469e7d5f7b376a30620617a175a9442da9Argyrios Kyrtzidis } 167c71d55469e7d5f7b376a30620617a175a9442da9Argyrios Kyrtzidis static bool classof(const ObjCCategoryDeclInfo *D) { return true; } 168dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis}; 169dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis 1702957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidisstruct CXXClassDeclInfo : public DeclInfo { 1712957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis CXIdxCXXClassDeclInfo CXXClassInfo; 1722957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis 1732957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis CXXClassDeclInfo(bool isRedeclaration, bool isDefinition) 1742957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis : DeclInfo(Info_CXXClass, isRedeclaration, isDefinition, isDefinition) { } 1752957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis 1762957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis static bool classof(const DeclInfo *D) { 1772957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis return D->Kind == Info_CXXClass; 1782957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis } 1792957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis static bool classof(const CXXClassDeclInfo *D) { return true; } 1802957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis}; 1812957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis 182b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidisstruct AttrInfo : public CXIdxAttrInfo { 183b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis const Attr *A; 184b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis 185b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis AttrInfo(CXIdxAttrKind Kind, CXCursor C, CXIdxLoc Loc, const Attr *A) { 186b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis kind = Kind; 187b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis cursor = C; 188b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis loc = Loc; 189b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis this->A = A; 190b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis } 191b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis 192b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis static bool classof(const AttrInfo *) { return true; } 193b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis}; 194b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis 195b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidisstruct IBOutletCollectionInfo : public AttrInfo { 1962957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis EntityInfo ClassInfo; 197b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis CXIdxIBOutletCollectionAttrInfo IBCollInfo; 198b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis 199b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis IBOutletCollectionInfo(CXCursor C, CXIdxLoc Loc, const Attr *A) : 200b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis AttrInfo(CXIdxAttr_IBOutletCollection, C, Loc, A) { 201b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis assert(C.kind == CXCursor_IBOutletCollectionAttr); 202643d3ce93c501d19353f2fa578fee3e97f1d1b4bArgyrios Kyrtzidis IBCollInfo.objcClass = 0; 203b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis } 204b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis 205643d3ce93c501d19353f2fa578fee3e97f1d1b4bArgyrios Kyrtzidis IBOutletCollectionInfo(const IBOutletCollectionInfo &other); 206643d3ce93c501d19353f2fa578fee3e97f1d1b4bArgyrios Kyrtzidis 207b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis static bool classof(const AttrInfo *A) { 208b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis return A->kind == CXIdxAttr_IBOutletCollection; 209b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis } 210b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis static bool classof(const IBOutletCollectionInfo *D) { return true; } 211b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis}; 212b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis 213643d3ce93c501d19353f2fa578fee3e97f1d1b4bArgyrios Kyrtzidisclass AttrListInfo { 214643d3ce93c501d19353f2fa578fee3e97f1d1b4bArgyrios Kyrtzidis SmallVector<AttrInfo, 2> Attrs; 215643d3ce93c501d19353f2fa578fee3e97f1d1b4bArgyrios Kyrtzidis SmallVector<IBOutletCollectionInfo, 2> IBCollAttrs; 216643d3ce93c501d19353f2fa578fee3e97f1d1b4bArgyrios Kyrtzidis SmallVector<CXIdxAttrInfo *, 2> CXAttrs; 217643d3ce93c501d19353f2fa578fee3e97f1d1b4bArgyrios Kyrtzidis unsigned ref_cnt; 218643d3ce93c501d19353f2fa578fee3e97f1d1b4bArgyrios Kyrtzidis 219643d3ce93c501d19353f2fa578fee3e97f1d1b4bArgyrios Kyrtzidispublic: 220643d3ce93c501d19353f2fa578fee3e97f1d1b4bArgyrios Kyrtzidis AttrListInfo(const Decl *D, 221643d3ce93c501d19353f2fa578fee3e97f1d1b4bArgyrios Kyrtzidis IndexingContext &IdxCtx, 222643d3ce93c501d19353f2fa578fee3e97f1d1b4bArgyrios Kyrtzidis ScratchAlloc &SA); 223643d3ce93c501d19353f2fa578fee3e97f1d1b4bArgyrios Kyrtzidis AttrListInfo(const AttrListInfo &other); 224643d3ce93c501d19353f2fa578fee3e97f1d1b4bArgyrios Kyrtzidis 225643d3ce93c501d19353f2fa578fee3e97f1d1b4bArgyrios Kyrtzidis const CXIdxAttrInfo *const *getAttrs() const { 226643d3ce93c501d19353f2fa578fee3e97f1d1b4bArgyrios Kyrtzidis if (CXAttrs.empty()) 227643d3ce93c501d19353f2fa578fee3e97f1d1b4bArgyrios Kyrtzidis return 0; 228643d3ce93c501d19353f2fa578fee3e97f1d1b4bArgyrios Kyrtzidis return CXAttrs.data(); 229643d3ce93c501d19353f2fa578fee3e97f1d1b4bArgyrios Kyrtzidis } 230643d3ce93c501d19353f2fa578fee3e97f1d1b4bArgyrios Kyrtzidis unsigned getNumAttrs() const { return (unsigned)CXAttrs.size(); } 231643d3ce93c501d19353f2fa578fee3e97f1d1b4bArgyrios Kyrtzidis 232643d3ce93c501d19353f2fa578fee3e97f1d1b4bArgyrios Kyrtzidis /// \brief Retain/Release only useful when we allocate a AttrListInfo from the 233643d3ce93c501d19353f2fa578fee3e97f1d1b4bArgyrios Kyrtzidis /// BumpPtrAllocator, and not from the stack; so that we keep a pointer 234643d3ce93c501d19353f2fa578fee3e97f1d1b4bArgyrios Kyrtzidis // in the EntityInfo 235643d3ce93c501d19353f2fa578fee3e97f1d1b4bArgyrios Kyrtzidis void Retain() { ++ref_cnt; } 236643d3ce93c501d19353f2fa578fee3e97f1d1b4bArgyrios Kyrtzidis void Release() { 237643d3ce93c501d19353f2fa578fee3e97f1d1b4bArgyrios Kyrtzidis assert (ref_cnt > 0 && "Reference count is already zero."); 238643d3ce93c501d19353f2fa578fee3e97f1d1b4bArgyrios Kyrtzidis if (--ref_cnt == 0) { 239643d3ce93c501d19353f2fa578fee3e97f1d1b4bArgyrios Kyrtzidis // Memory is allocated from a BumpPtrAllocator, no need to delete it. 240643d3ce93c501d19353f2fa578fee3e97f1d1b4bArgyrios Kyrtzidis this->~AttrListInfo(); 241643d3ce93c501d19353f2fa578fee3e97f1d1b4bArgyrios Kyrtzidis } 242643d3ce93c501d19353f2fa578fee3e97f1d1b4bArgyrios Kyrtzidis } 243643d3ce93c501d19353f2fa578fee3e97f1d1b4bArgyrios Kyrtzidis}; 244643d3ce93c501d19353f2fa578fee3e97f1d1b4bArgyrios Kyrtzidis 245c6b4a5099588fd21b49c80f730a596a64b2766c6Argyrios Kyrtzidisstruct RefFileOccurence { 246c6b4a5099588fd21b49c80f730a596a64b2766c6Argyrios Kyrtzidis const FileEntry *File; 247c6b4a5099588fd21b49c80f730a596a64b2766c6Argyrios Kyrtzidis const Decl *Dcl; 248c6b4a5099588fd21b49c80f730a596a64b2766c6Argyrios Kyrtzidis 249c6b4a5099588fd21b49c80f730a596a64b2766c6Argyrios Kyrtzidis RefFileOccurence(const FileEntry *File, const Decl *Dcl) 250c6b4a5099588fd21b49c80f730a596a64b2766c6Argyrios Kyrtzidis : File(File), Dcl(Dcl) { } 251c6b4a5099588fd21b49c80f730a596a64b2766c6Argyrios Kyrtzidis}; 252c6b4a5099588fd21b49c80f730a596a64b2766c6Argyrios Kyrtzidis 2534e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidisclass IndexingContext { 2544e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis ASTContext *Ctx; 2554e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis CXClientData ClientData; 2564e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis IndexerCallbacks &CB; 2574e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis unsigned IndexOptions; 2584e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis CXTranslationUnit CXTU; 2594e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis 260dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis typedef llvm::DenseMap<const FileEntry *, CXIdxClientFile> FileMapTy; 2612957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis typedef llvm::DenseMap<const DeclContext *, CXIdxClientContainer> 2622957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis ContainerMapTy; 2632957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis typedef llvm::DenseMap<const Decl *, CXIdxClientEntity> EntityMapTy; 2642957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis 2654e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis FileMapTy FileMap; 2664e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis ContainerMapTy ContainerMap; 2672957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis EntityMapTy EntityMap; 2684e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis 269c6b4a5099588fd21b49c80f730a596a64b2766c6Argyrios Kyrtzidis llvm::DenseSet<RefFileOccurence> RefFileOccurences; 270c6b4a5099588fd21b49c80f730a596a64b2766c6Argyrios Kyrtzidis 2714e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis SmallVector<DeclGroupRef, 8> TUDeclsInObjCContainer; 2724e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis 27337f40572c4c78a8c57a7b45266f8b86db172a7c1Argyrios Kyrtzidis llvm::BumpPtrAllocator StrScratch; 274dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis unsigned StrAdapterCount; 275643d3ce93c501d19353f2fa578fee3e97f1d1b4bArgyrios Kyrtzidis friend class ScratchAlloc; 2764e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis 2776ec43adc39006a7fce94188956d0239bd54c0363Argyrios Kyrtzidis struct ObjCProtocolListInfo { 2786ec43adc39006a7fce94188956d0239bd54c0363Argyrios Kyrtzidis SmallVector<CXIdxObjCProtocolRefInfo, 4> ProtInfos; 2792957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis SmallVector<EntityInfo, 4> ProtEntities; 2806ec43adc39006a7fce94188956d0239bd54c0363Argyrios Kyrtzidis SmallVector<CXIdxObjCProtocolRefInfo *, 4> Prots; 2816ec43adc39006a7fce94188956d0239bd54c0363Argyrios Kyrtzidis 282b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis CXIdxObjCProtocolRefListInfo getListInfo() const { 283c71d55469e7d5f7b376a30620617a175a9442da9Argyrios Kyrtzidis CXIdxObjCProtocolRefListInfo Info = { Prots.data(), 284c71d55469e7d5f7b376a30620617a175a9442da9Argyrios Kyrtzidis (unsigned)Prots.size() }; 285c71d55469e7d5f7b376a30620617a175a9442da9Argyrios Kyrtzidis return Info; 286c71d55469e7d5f7b376a30620617a175a9442da9Argyrios Kyrtzidis } 2876ec43adc39006a7fce94188956d0239bd54c0363Argyrios Kyrtzidis 2886ec43adc39006a7fce94188956d0239bd54c0363Argyrios Kyrtzidis ObjCProtocolListInfo(const ObjCProtocolList &ProtList, 2896ec43adc39006a7fce94188956d0239bd54c0363Argyrios Kyrtzidis IndexingContext &IdxCtx, 290643d3ce93c501d19353f2fa578fee3e97f1d1b4bArgyrios Kyrtzidis ScratchAlloc &SA); 2912957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis }; 2922957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis 2932957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis struct CXXBasesListInfo { 2942957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis SmallVector<CXIdxBaseClassInfo, 4> BaseInfos; 2952957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis SmallVector<EntityInfo, 4> BaseEntities; 2962957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis SmallVector<CXIdxBaseClassInfo *, 4> CXBases; 2972957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis 2982957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis const CXIdxBaseClassInfo *const *getBases() const { 2992957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis return CXBases.data(); 3002957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis } 3012957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis unsigned getNumBases() const { return (unsigned)CXBases.size(); } 3022957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis 3032957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis CXXBasesListInfo(const CXXRecordDecl *D, 304643d3ce93c501d19353f2fa578fee3e97f1d1b4bArgyrios Kyrtzidis IndexingContext &IdxCtx, ScratchAlloc &SA); 305b526a871af40b84d9878eded54a181bf4003b376Argyrios Kyrtzidis 306b526a871af40b84d9878eded54a181bf4003b376Argyrios Kyrtzidis private: 307b526a871af40b84d9878eded54a181bf4003b376Argyrios Kyrtzidis SourceLocation getBaseLoc(const CXXBaseSpecifier &Base) const; 3082957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis }; 309b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis 310643d3ce93c501d19353f2fa578fee3e97f1d1b4bArgyrios Kyrtzidis friend class AttrListInfo; 311643d3ce93c501d19353f2fa578fee3e97f1d1b4bArgyrios Kyrtzidis 3124e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidispublic: 3134e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis IndexingContext(CXClientData clientData, IndexerCallbacks &indexCallbacks, 3144e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis unsigned indexOptions, CXTranslationUnit cxTU) 3154e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis : Ctx(0), ClientData(clientData), CB(indexCallbacks), 31637f40572c4c78a8c57a7b45266f8b86db172a7c1Argyrios Kyrtzidis IndexOptions(indexOptions), CXTU(cxTU), 31737f40572c4c78a8c57a7b45266f8b86db172a7c1Argyrios Kyrtzidis StrScratch(/*size=*/1024), StrAdapterCount(0) { } 3184e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis 3194e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis ASTContext &getASTContext() const { return *Ctx; } 3204e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis 3214e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis void setASTContext(ASTContext &ctx); 3227fe90f3bfa6bd7f779ecfd4ba201a296a3a1c8cbArgyrios Kyrtzidis void setPreprocessor(Preprocessor &PP); 3234e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis 324b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis bool suppressRefs() const { 325b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis return IndexOptions & CXIndexOpt_SuppressRedundantRefs; 326c6b4a5099588fd21b49c80f730a596a64b2766c6Argyrios Kyrtzidis } 327c6b4a5099588fd21b49c80f730a596a64b2766c6Argyrios Kyrtzidis 32822490747c123a78feec089539f30426084d348cfArgyrios Kyrtzidis bool indexFunctionLocalSymbols() const { 32922490747c123a78feec089539f30426084d348cfArgyrios Kyrtzidis return IndexOptions & CXIndexOpt_IndexFunctionLocalSymbols; 33022490747c123a78feec089539f30426084d348cfArgyrios Kyrtzidis } 33122490747c123a78feec089539f30426084d348cfArgyrios Kyrtzidis 332b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis bool shouldAbort(); 333b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis 334996e6e564af7483e2d5e0b70df5fdb9f79ec4b5aArgyrios Kyrtzidis bool hasDiagnosticCallback() const { return CB.diagnostic; } 335996e6e564af7483e2d5e0b70df5fdb9f79ec4b5aArgyrios Kyrtzidis 336dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis void enteredMainFile(const FileEntry *File); 337dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis 3384e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis void ppIncludedFile(SourceLocation hashLoc, 3394e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis StringRef filename, const FileEntry *File, 3404e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis bool isImport, bool isAngled); 3414e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis 3426ec43adc39006a7fce94188956d0239bd54c0363Argyrios Kyrtzidis void startedTranslationUnit(); 3434e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis 3444e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis void indexDecl(const Decl *D); 3454e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis 3464e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis void indexTagDecl(const TagDecl *D); 3474e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis 3484e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis void indexTypeSourceInfo(TypeSourceInfo *TInfo, const NamedDecl *Parent, 3494e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis const DeclContext *DC = 0); 3504e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis 3514e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis void indexTypeLoc(TypeLoc TL, const NamedDecl *Parent, 352e422e45a6a89d450b8eca10f671b49874e87617aArgyrios Kyrtzidis const DeclContext *DC = 0); 353e422e45a6a89d450b8eca10f671b49874e87617aArgyrios Kyrtzidis 354e422e45a6a89d450b8eca10f671b49874e87617aArgyrios Kyrtzidis void indexNestedNameSpecifierLoc(NestedNameSpecifierLoc NNS, 355e422e45a6a89d450b8eca10f671b49874e87617aArgyrios Kyrtzidis const NamedDecl *Parent, 356e422e45a6a89d450b8eca10f671b49874e87617aArgyrios Kyrtzidis const DeclContext *DC = 0); 3574e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis 3584e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis void indexDeclContext(const DeclContext *DC); 3594e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis 360e422e45a6a89d450b8eca10f671b49874e87617aArgyrios Kyrtzidis void indexBody(const Stmt *S, const NamedDecl *Parent, 361e422e45a6a89d450b8eca10f671b49874e87617aArgyrios Kyrtzidis const DeclContext *DC = 0); 3624e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis 363b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis void handleDiagnosticSet(CXDiagnosticSet CXDiagSet); 3644e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis 365b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis bool handleFunction(const FunctionDecl *FD); 3664e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis 367b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis bool handleVar(const VarDecl *D); 3684e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis 369b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis bool handleField(const FieldDecl *D); 3704e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis 371b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis bool handleEnumerator(const EnumConstantDecl *D); 3724e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis 373b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis bool handleTagDecl(const TagDecl *D); 3744e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis 3752957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis bool handleTypedefName(const TypedefNameDecl *D); 3764e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis 377b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis bool handleObjCInterface(const ObjCInterfaceDecl *D); 378b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis bool handleObjCImplementation(const ObjCImplementationDecl *D); 3794e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis 380b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis bool handleObjCProtocol(const ObjCProtocolDecl *D); 381b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis 382b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis bool handleObjCCategory(const ObjCCategoryDecl *D); 383b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis bool handleObjCCategoryImpl(const ObjCCategoryImplDecl *D); 3844e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis 385b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis bool handleObjCMethod(const ObjCMethodDecl *D); 3864e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis 387b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis bool handleSynthesizedObjCProperty(const ObjCPropertyImplDecl *D); 388b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis bool handleSynthesizedObjCMethod(const ObjCMethodDecl *D, SourceLocation Loc); 3894e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis 390b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis bool handleObjCProperty(const ObjCPropertyDecl *D); 3914e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis 39268478b0cc1ff03c0d13ceca6800c5becf08791e7Argyrios Kyrtzidis bool handleNamespace(const NamespaceDecl *D); 39368478b0cc1ff03c0d13ceca6800c5becf08791e7Argyrios Kyrtzidis 3942957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis bool handleClassTemplate(const ClassTemplateDecl *D); 3952957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis bool handleFunctionTemplate(const FunctionTemplateDecl *D); 3962957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis bool handleTypeAliasTemplate(const TypeAliasTemplateDecl *D); 3972957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis 398b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis bool handleReference(const NamedDecl *D, SourceLocation Loc, CXCursor Cursor, 399b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis const NamedDecl *Parent, 400b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis const DeclContext *DC, 401b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis const Expr *E = 0, 402b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis CXIdxEntityRefKind Kind = CXIdxEntityRef_Direct); 403b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis 404b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis bool handleReference(const NamedDecl *D, SourceLocation Loc, 4054e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis const NamedDecl *Parent, 4064e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis const DeclContext *DC, 407aca19be8731fc31cff68702de0dc7f30ce908979Argyrios Kyrtzidis const Expr *E = 0, 408aca19be8731fc31cff68702de0dc7f30ce908979Argyrios Kyrtzidis CXIdxEntityRefKind Kind = CXIdxEntityRef_Direct); 4094e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis 4104e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis bool isNotFromSourceFile(SourceLocation Loc) const; 4114e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis 41221ee5707e6e59d982d2f2ae28e079c7ff46dc519Argyrios Kyrtzidis void indexTopLevelDecl(Decl *D); 4134e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis void indexTUDeclsInObjCContainer(); 4144e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis void indexDeclGroupRef(DeclGroupRef DG); 4154e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis 4164e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis void addTUDeclInObjCContainer(DeclGroupRef DG) { 4174e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis TUDeclsInObjCContainer.push_back(DG); 4184e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis } 4194e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis 420dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis void translateLoc(SourceLocation Loc, CXIdxClientFile *indexFile, CXFile *file, 4214e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis unsigned *line, unsigned *column, unsigned *offset); 4224e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis 4232957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis CXIdxClientContainer getClientContainerForDC(const DeclContext *DC) const; 4242957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis void addContainerInMap(const DeclContext *DC, CXIdxClientContainer container); 4252957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis 4262957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis CXIdxClientEntity getClientEntity(const Decl *D) const; 4272957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis void setClientEntity(const Decl *D, CXIdxClientEntity client); 4282957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis 4294e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidisprivate: 430b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis bool handleDecl(const NamedDecl *D, 431dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis SourceLocation Loc, CXCursor Cursor, 432dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis DeclInfo &DInfo); 433dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis 434b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis bool handleObjCContainer(const ObjCContainerDecl *D, 435dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis SourceLocation Loc, CXCursor Cursor, 436dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis ObjCContainerDeclInfo &ContDInfo); 4374e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis 4382957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis bool handleCXXRecordDecl(const CXXRecordDecl *RD, const NamedDecl *OrigD); 439dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis 440b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis bool markEntityOccurrenceInFile(const NamedDecl *D, SourceLocation Loc); 441b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis 4424e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis const NamedDecl *getEntityDecl(const NamedDecl *D) const; 4434e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis 4442957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis const DeclContext *getEntityContainer(const Decl *D) const; 4452957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis 446dd93c596cd95e1b96031ff47efe0a5095ff3d7f1Argyrios Kyrtzidis CXIdxClientFile getIndexFile(const FileEntry *File); 4474e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis 4484e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis CXIdxLoc getIndexLoc(SourceLocation Loc) const; 4494e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis 4504e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis void getEntityInfo(const NamedDecl *D, 4512957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis EntityInfo &EntityInfo, 452643d3ce93c501d19353f2fa578fee3e97f1d1b4bArgyrios Kyrtzidis ScratchAlloc &SA); 4534e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis 4542957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis void getContainerInfo(const DeclContext *DC, ContainerInfo &ContInfo); 4552957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis 456b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis CXCursor getCursor(const Decl *D) { 457b395c63b473bf1b3783bff371a993332e8c4c5e3Argyrios Kyrtzidis return cxcursor::MakeCXCursor(const_cast<Decl*>(D), CXTU); 4584e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis } 4594e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis 4604e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis CXCursor getRefCursor(const NamedDecl *D, SourceLocation Loc); 4612957e6f8c4c2e58a4b9cb639949fea801970fe36Argyrios Kyrtzidis 462d08900848307fdaea19d52249bdced94eefdb9bbArgyrios Kyrtzidis static bool shouldIgnoreIfImplicit(const Decl *D); 4634e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis}; 4644e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis 465643d3ce93c501d19353f2fa578fee3e97f1d1b4bArgyrios Kyrtzidisclass ScratchAlloc { 466643d3ce93c501d19353f2fa578fee3e97f1d1b4bArgyrios Kyrtzidis IndexingContext &IdxCtx; 467643d3ce93c501d19353f2fa578fee3e97f1d1b4bArgyrios Kyrtzidis 468643d3ce93c501d19353f2fa578fee3e97f1d1b4bArgyrios Kyrtzidispublic: 469643d3ce93c501d19353f2fa578fee3e97f1d1b4bArgyrios Kyrtzidis explicit ScratchAlloc(IndexingContext &indexCtx) : IdxCtx(indexCtx) { 470643d3ce93c501d19353f2fa578fee3e97f1d1b4bArgyrios Kyrtzidis ++IdxCtx.StrAdapterCount; 471643d3ce93c501d19353f2fa578fee3e97f1d1b4bArgyrios Kyrtzidis } 472643d3ce93c501d19353f2fa578fee3e97f1d1b4bArgyrios Kyrtzidis 473643d3ce93c501d19353f2fa578fee3e97f1d1b4bArgyrios Kyrtzidis ~ScratchAlloc() { 474643d3ce93c501d19353f2fa578fee3e97f1d1b4bArgyrios Kyrtzidis --IdxCtx.StrAdapterCount; 475643d3ce93c501d19353f2fa578fee3e97f1d1b4bArgyrios Kyrtzidis if (IdxCtx.StrAdapterCount == 0) 476643d3ce93c501d19353f2fa578fee3e97f1d1b4bArgyrios Kyrtzidis IdxCtx.StrScratch.Reset(); 477643d3ce93c501d19353f2fa578fee3e97f1d1b4bArgyrios Kyrtzidis } 478643d3ce93c501d19353f2fa578fee3e97f1d1b4bArgyrios Kyrtzidis 479643d3ce93c501d19353f2fa578fee3e97f1d1b4bArgyrios Kyrtzidis const char *toCStr(StringRef Str); 480643d3ce93c501d19353f2fa578fee3e97f1d1b4bArgyrios Kyrtzidis const char *copyCStr(StringRef Str); 481643d3ce93c501d19353f2fa578fee3e97f1d1b4bArgyrios Kyrtzidis 482643d3ce93c501d19353f2fa578fee3e97f1d1b4bArgyrios Kyrtzidis template <typename T> 483643d3ce93c501d19353f2fa578fee3e97f1d1b4bArgyrios Kyrtzidis T *allocate() { 484643d3ce93c501d19353f2fa578fee3e97f1d1b4bArgyrios Kyrtzidis return IdxCtx.StrScratch.Allocate<T>(); 485643d3ce93c501d19353f2fa578fee3e97f1d1b4bArgyrios Kyrtzidis } 486643d3ce93c501d19353f2fa578fee3e97f1d1b4bArgyrios Kyrtzidis}; 487643d3ce93c501d19353f2fa578fee3e97f1d1b4bArgyrios Kyrtzidis 4884e7064fa7e344e8f87a5b8457e96dfdd252c4a9eArgyrios Kyrtzidis}} // end clang::cxindex 489c6b4a5099588fd21b49c80f730a596a64b2766c6Argyrios Kyrtzidis 490c6b4a5099588fd21b49c80f730a596a64b2766c6Argyrios Kyrtzidisnamespace llvm { 491c6b4a5099588fd21b49c80f730a596a64b2766c6Argyrios Kyrtzidis /// Define DenseMapInfo so that FileID's can be used as keys in DenseMap and 492c6b4a5099588fd21b49c80f730a596a64b2766c6Argyrios Kyrtzidis /// DenseSets. 493c6b4a5099588fd21b49c80f730a596a64b2766c6Argyrios Kyrtzidis template <> 494c6b4a5099588fd21b49c80f730a596a64b2766c6Argyrios Kyrtzidis struct DenseMapInfo<clang::cxindex::RefFileOccurence> { 495c6b4a5099588fd21b49c80f730a596a64b2766c6Argyrios Kyrtzidis static inline clang::cxindex::RefFileOccurence getEmptyKey() { 496c6b4a5099588fd21b49c80f730a596a64b2766c6Argyrios Kyrtzidis return clang::cxindex::RefFileOccurence(0, 0); 497c6b4a5099588fd21b49c80f730a596a64b2766c6Argyrios Kyrtzidis } 498c6b4a5099588fd21b49c80f730a596a64b2766c6Argyrios Kyrtzidis 499c6b4a5099588fd21b49c80f730a596a64b2766c6Argyrios Kyrtzidis static inline clang::cxindex::RefFileOccurence getTombstoneKey() { 500c6b4a5099588fd21b49c80f730a596a64b2766c6Argyrios Kyrtzidis return clang::cxindex::RefFileOccurence((const clang::FileEntry *)~0, 501c6b4a5099588fd21b49c80f730a596a64b2766c6Argyrios Kyrtzidis (const clang::Decl *)~0); 502c6b4a5099588fd21b49c80f730a596a64b2766c6Argyrios Kyrtzidis } 503c6b4a5099588fd21b49c80f730a596a64b2766c6Argyrios Kyrtzidis 504c6b4a5099588fd21b49c80f730a596a64b2766c6Argyrios Kyrtzidis static unsigned getHashValue(clang::cxindex::RefFileOccurence S) { 505c6b4a5099588fd21b49c80f730a596a64b2766c6Argyrios Kyrtzidis llvm::FoldingSetNodeID ID; 506c6b4a5099588fd21b49c80f730a596a64b2766c6Argyrios Kyrtzidis ID.AddPointer(S.File); 507c6b4a5099588fd21b49c80f730a596a64b2766c6Argyrios Kyrtzidis ID.AddPointer(S.Dcl); 508c6b4a5099588fd21b49c80f730a596a64b2766c6Argyrios Kyrtzidis return ID.ComputeHash(); 509c6b4a5099588fd21b49c80f730a596a64b2766c6Argyrios Kyrtzidis } 510c6b4a5099588fd21b49c80f730a596a64b2766c6Argyrios Kyrtzidis 511c6b4a5099588fd21b49c80f730a596a64b2766c6Argyrios Kyrtzidis static bool isEqual(clang::cxindex::RefFileOccurence LHS, 512c6b4a5099588fd21b49c80f730a596a64b2766c6Argyrios Kyrtzidis clang::cxindex::RefFileOccurence RHS) { 513c6b4a5099588fd21b49c80f730a596a64b2766c6Argyrios Kyrtzidis return LHS.File == RHS.File && LHS.Dcl == RHS.Dcl; 514c6b4a5099588fd21b49c80f730a596a64b2766c6Argyrios Kyrtzidis } 515c6b4a5099588fd21b49c80f730a596a64b2766c6Argyrios Kyrtzidis }; 516c6b4a5099588fd21b49c80f730a596a64b2766c6Argyrios Kyrtzidis} 517