1 //===- IndexingContext.h - Indexing context data ----------------*- C++ -*-===// 2 // 3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4 // See https://llvm.org/LICENSE.txt for license information. 5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6 // 7 //===----------------------------------------------------------------------===// 8 9 #ifndef LLVM_CLANG_LIB_INDEX_INDEXINGCONTEXT_H 10 #define LLVM_CLANG_LIB_INDEX_INDEXINGCONTEXT_H 11 12 #include "clang/Basic/IdentifierTable.h" 13 #include "clang/Basic/LLVM.h" 14 #include "clang/Index/IndexSymbol.h" 15 #include "clang/Index/IndexingAction.h" 16 #include "clang/Lex/MacroInfo.h" 17 #include "llvm/ADT/ArrayRef.h" 18 19 namespace clang { 20 class ASTContext; 21 class Decl; 22 class DeclGroupRef; 23 class ImportDecl; 24 class TagDecl; 25 class TypeSourceInfo; 26 class NamedDecl; 27 class ObjCMethodDecl; 28 class DeclContext; 29 class NestedNameSpecifierLoc; 30 class Stmt; 31 class Expr; 32 class TypeLoc; 33 class SourceLocation; 34 35 namespace index { 36 class IndexDataConsumer; 37 38 class IndexingContext { 39 IndexingOptions IndexOpts; 40 IndexDataConsumer &DataConsumer; 41 ASTContext *Ctx = nullptr; 42 43 public: 44 IndexingContext(IndexingOptions IndexOpts, IndexDataConsumer &DataConsumer) 45 : IndexOpts(IndexOpts), DataConsumer(DataConsumer) {} 46 47 const IndexingOptions &getIndexOpts() const { return IndexOpts; } 48 IndexDataConsumer &getDataConsumer() { return DataConsumer; } 49 50 void setASTContext(ASTContext &ctx) { Ctx = &ctx; } 51 52 bool shouldIndex(const Decl *D); 53 54 const LangOptions &getLangOpts() const; 55 56 bool shouldSuppressRefs() const { 57 return false; 58 } 59 60 bool shouldIndexFunctionLocalSymbols() const; 61 62 bool shouldIndexImplicitInstantiation() const; 63 64 bool shouldIndexParametersInDeclarations() const; 65 66 bool shouldIndexTemplateParameters() const; 67 68 static bool isTemplateImplicitInstantiation(const Decl *D); 69 70 bool handleDecl(const Decl *D, SymbolRoleSet Roles = SymbolRoleSet(), 71 ArrayRef<SymbolRelation> Relations = None); 72 73 bool handleDecl(const Decl *D, SourceLocation Loc, 74 SymbolRoleSet Roles = SymbolRoleSet(), 75 ArrayRef<SymbolRelation> Relations = None, 76 const DeclContext *DC = nullptr); 77 78 bool handleReference(const NamedDecl *D, SourceLocation Loc, 79 const NamedDecl *Parent, 80 const DeclContext *DC, 81 SymbolRoleSet Roles = SymbolRoleSet(), 82 ArrayRef<SymbolRelation> Relations = None, 83 const Expr *RefE = nullptr, 84 const Decl *RefD = nullptr); 85 86 void handleMacroDefined(const IdentifierInfo &Name, SourceLocation Loc, 87 const MacroInfo &MI); 88 89 void handleMacroUndefined(const IdentifierInfo &Name, SourceLocation Loc, 90 const MacroInfo &MI); 91 92 void handleMacroReference(const IdentifierInfo &Name, SourceLocation Loc, 93 const MacroInfo &MD); 94 95 bool importedModule(const ImportDecl *ImportD); 96 97 bool indexDecl(const Decl *D); 98 99 void indexTagDecl(const TagDecl *D, 100 ArrayRef<SymbolRelation> Relations = None); 101 102 void indexTypeSourceInfo(TypeSourceInfo *TInfo, const NamedDecl *Parent, 103 const DeclContext *DC = nullptr, 104 bool isBase = false, 105 bool isIBType = false); 106 107 void indexTypeLoc(TypeLoc TL, const NamedDecl *Parent, 108 const DeclContext *DC = nullptr, 109 bool isBase = false, 110 bool isIBType = false); 111 112 void indexNestedNameSpecifierLoc(NestedNameSpecifierLoc NNS, 113 const NamedDecl *Parent, 114 const DeclContext *DC = nullptr); 115 116 bool indexDeclContext(const DeclContext *DC); 117 118 void indexBody(const Stmt *S, const NamedDecl *Parent, 119 const DeclContext *DC = nullptr); 120 121 bool indexTopLevelDecl(const Decl *D); 122 bool indexDeclGroupRef(DeclGroupRef DG); 123 124 private: 125 bool shouldIgnoreIfImplicit(const Decl *D); 126 127 bool shouldIndexMacroOccurrence(bool IsRef, SourceLocation Loc); 128 129 bool handleDeclOccurrence(const Decl *D, SourceLocation Loc, 130 bool IsRef, const Decl *Parent, 131 SymbolRoleSet Roles, 132 ArrayRef<SymbolRelation> Relations, 133 const Expr *RefE, 134 const Decl *RefD, 135 const DeclContext *ContainerDC); 136 }; 137 138 } // end namespace index 139 } // end namespace clang 140 141 #endif 142