1*67e74705SXin Li //===- IndexingContext.h - Indexing context data ----------------*- C++ -*-===// 2*67e74705SXin Li // 3*67e74705SXin Li // The LLVM Compiler Infrastructure 4*67e74705SXin Li // 5*67e74705SXin Li // This file is distributed under the University of Illinois Open Source 6*67e74705SXin Li // License. See LICENSE.TXT for details. 7*67e74705SXin Li // 8*67e74705SXin Li //===----------------------------------------------------------------------===// 9*67e74705SXin Li 10*67e74705SXin Li #ifndef LLVM_CLANG_LIB_INDEX_INDEXINGCONTEXT_H 11*67e74705SXin Li #define LLVM_CLANG_LIB_INDEX_INDEXINGCONTEXT_H 12*67e74705SXin Li 13*67e74705SXin Li #include "clang/Basic/LLVM.h" 14*67e74705SXin Li #include "clang/Index/IndexSymbol.h" 15*67e74705SXin Li #include "clang/Index/IndexingAction.h" 16*67e74705SXin Li #include "llvm/ADT/ArrayRef.h" 17*67e74705SXin Li 18*67e74705SXin Li namespace clang { 19*67e74705SXin Li class ASTContext; 20*67e74705SXin Li class Decl; 21*67e74705SXin Li class DeclGroupRef; 22*67e74705SXin Li class ImportDecl; 23*67e74705SXin Li class TagDecl; 24*67e74705SXin Li class TypeSourceInfo; 25*67e74705SXin Li class NamedDecl; 26*67e74705SXin Li class ObjCMethodDecl; 27*67e74705SXin Li class DeclContext; 28*67e74705SXin Li class NestedNameSpecifierLoc; 29*67e74705SXin Li class Stmt; 30*67e74705SXin Li class Expr; 31*67e74705SXin Li class TypeLoc; 32*67e74705SXin Li class SourceLocation; 33*67e74705SXin Li 34*67e74705SXin Li namespace index { 35*67e74705SXin Li class IndexDataConsumer; 36*67e74705SXin Li 37*67e74705SXin Li class IndexingContext { 38*67e74705SXin Li IndexingOptions IndexOpts; 39*67e74705SXin Li IndexDataConsumer &DataConsumer; 40*67e74705SXin Li ASTContext *Ctx = nullptr; 41*67e74705SXin Li 42*67e74705SXin Li public: IndexingContext(IndexingOptions IndexOpts,IndexDataConsumer & DataConsumer)43*67e74705SXin Li IndexingContext(IndexingOptions IndexOpts, IndexDataConsumer &DataConsumer) 44*67e74705SXin Li : IndexOpts(IndexOpts), DataConsumer(DataConsumer) {} 45*67e74705SXin Li getIndexOpts()46*67e74705SXin Li const IndexingOptions &getIndexOpts() const { return IndexOpts; } getDataConsumer()47*67e74705SXin Li IndexDataConsumer &getDataConsumer() { return DataConsumer; } 48*67e74705SXin Li setASTContext(ASTContext & ctx)49*67e74705SXin Li void setASTContext(ASTContext &ctx) { Ctx = &ctx; } 50*67e74705SXin Li shouldSuppressRefs()51*67e74705SXin Li bool shouldSuppressRefs() const { 52*67e74705SXin Li return false; 53*67e74705SXin Li } 54*67e74705SXin Li 55*67e74705SXin Li bool shouldIndexFunctionLocalSymbols() const; 56*67e74705SXin Li shouldIndexImplicitTemplateInsts()57*67e74705SXin Li bool shouldIndexImplicitTemplateInsts() const { 58*67e74705SXin Li return false; 59*67e74705SXin Li } 60*67e74705SXin Li 61*67e74705SXin Li static bool isFunctionLocalDecl(const Decl *D); 62*67e74705SXin Li static bool isTemplateImplicitInstantiation(const Decl *D); 63*67e74705SXin Li 64*67e74705SXin Li bool handleDecl(const Decl *D, SymbolRoleSet Roles = SymbolRoleSet(), 65*67e74705SXin Li ArrayRef<SymbolRelation> Relations = None); 66*67e74705SXin Li 67*67e74705SXin Li bool handleDecl(const Decl *D, SourceLocation Loc, 68*67e74705SXin Li SymbolRoleSet Roles = SymbolRoleSet(), 69*67e74705SXin Li ArrayRef<SymbolRelation> Relations = None, 70*67e74705SXin Li const DeclContext *DC = nullptr); 71*67e74705SXin Li 72*67e74705SXin Li bool handleReference(const NamedDecl *D, SourceLocation Loc, 73*67e74705SXin Li const NamedDecl *Parent, 74*67e74705SXin Li const DeclContext *DC, 75*67e74705SXin Li SymbolRoleSet Roles, 76*67e74705SXin Li ArrayRef<SymbolRelation> Relations = None, 77*67e74705SXin Li const Expr *RefE = nullptr, 78*67e74705SXin Li const Decl *RefD = nullptr); 79*67e74705SXin Li 80*67e74705SXin Li bool importedModule(const ImportDecl *ImportD); 81*67e74705SXin Li 82*67e74705SXin Li bool indexDecl(const Decl *D); 83*67e74705SXin Li 84*67e74705SXin Li void indexTagDecl(const TagDecl *D); 85*67e74705SXin Li 86*67e74705SXin Li void indexTypeSourceInfo(TypeSourceInfo *TInfo, const NamedDecl *Parent, 87*67e74705SXin Li const DeclContext *DC = nullptr, 88*67e74705SXin Li bool isBase = false); 89*67e74705SXin Li 90*67e74705SXin Li void indexTypeLoc(TypeLoc TL, const NamedDecl *Parent, 91*67e74705SXin Li const DeclContext *DC = nullptr, 92*67e74705SXin Li bool isBase = false); 93*67e74705SXin Li 94*67e74705SXin Li void indexNestedNameSpecifierLoc(NestedNameSpecifierLoc NNS, 95*67e74705SXin Li const NamedDecl *Parent, 96*67e74705SXin Li const DeclContext *DC = nullptr); 97*67e74705SXin Li 98*67e74705SXin Li bool indexDeclContext(const DeclContext *DC); 99*67e74705SXin Li 100*67e74705SXin Li void indexBody(const Stmt *S, const NamedDecl *Parent, 101*67e74705SXin Li const DeclContext *DC = nullptr); 102*67e74705SXin Li 103*67e74705SXin Li bool indexTopLevelDecl(const Decl *D); 104*67e74705SXin Li bool indexDeclGroupRef(DeclGroupRef DG); 105*67e74705SXin Li 106*67e74705SXin Li private: 107*67e74705SXin Li bool shouldIgnoreIfImplicit(const Decl *D); 108*67e74705SXin Li 109*67e74705SXin Li bool handleDeclOccurrence(const Decl *D, SourceLocation Loc, 110*67e74705SXin Li bool IsRef, const Decl *Parent, 111*67e74705SXin Li SymbolRoleSet Roles, 112*67e74705SXin Li ArrayRef<SymbolRelation> Relations, 113*67e74705SXin Li const Expr *RefE, 114*67e74705SXin Li const Decl *RefD, 115*67e74705SXin Li const DeclContext *ContainerDC); 116*67e74705SXin Li }; 117*67e74705SXin Li 118*67e74705SXin Li } // end namespace index 119*67e74705SXin Li } // end namespace clang 120*67e74705SXin Li 121*67e74705SXin Li #endif 122