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