xref: /freebsd/contrib/llvm-project/clang/lib/Index/IndexingContext.h (revision 5ca8e32633c4ffbbcd6762e5888b6a4ba0708c6c)
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