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 = std::nullopt); 72 73 bool handleDecl(const Decl *D, SourceLocation Loc, 74 SymbolRoleSet Roles = SymbolRoleSet(), 75 ArrayRef<SymbolRelation> Relations = std::nullopt, 76 const DeclContext *DC = nullptr); 77 78 bool handleReference(const NamedDecl *D, SourceLocation Loc, 79 const NamedDecl *Parent, const DeclContext *DC, 80 SymbolRoleSet Roles = SymbolRoleSet(), 81 ArrayRef<SymbolRelation> Relations = std::nullopt, 82 const Expr *RefE = nullptr, const Decl *RefD = nullptr); 83 84 void handleMacroDefined(const IdentifierInfo &Name, SourceLocation Loc, 85 const MacroInfo &MI); 86 87 void handleMacroUndefined(const IdentifierInfo &Name, SourceLocation Loc, 88 const MacroInfo &MI); 89 90 void handleMacroReference(const IdentifierInfo &Name, SourceLocation Loc, 91 const MacroInfo &MD); 92 93 bool importedModule(const ImportDecl *ImportD); 94 95 bool indexDecl(const Decl *D); 96 97 void indexTagDecl(const TagDecl *D, 98 ArrayRef<SymbolRelation> Relations = std::nullopt); 99 100 void indexTypeSourceInfo(TypeSourceInfo *TInfo, const NamedDecl *Parent, 101 const DeclContext *DC = nullptr, 102 bool isBase = false, 103 bool isIBType = false); 104 105 void indexTypeLoc(TypeLoc TL, const NamedDecl *Parent, 106 const DeclContext *DC = nullptr, 107 bool isBase = false, 108 bool isIBType = false); 109 110 void indexNestedNameSpecifierLoc(NestedNameSpecifierLoc NNS, 111 const NamedDecl *Parent, 112 const DeclContext *DC = nullptr); 113 114 bool indexDeclContext(const DeclContext *DC); 115 116 void indexBody(const Stmt *S, const NamedDecl *Parent, 117 const DeclContext *DC = nullptr); 118 119 bool indexTopLevelDecl(const Decl *D); 120 bool indexDeclGroupRef(DeclGroupRef DG); 121 122 private: 123 bool shouldIgnoreIfImplicit(const Decl *D); 124 125 bool shouldIndexMacroOccurrence(bool IsRef, SourceLocation Loc); 126 127 bool handleDeclOccurrence(const Decl *D, SourceLocation Loc, 128 bool IsRef, const Decl *Parent, 129 SymbolRoleSet Roles, 130 ArrayRef<SymbolRelation> Relations, 131 const Expr *RefE, 132 const Decl *RefD, 133 const DeclContext *ContainerDC); 134 }; 135 136 } // end namespace index 137 } // end namespace clang 138 139 #endif 140