xref: /llvm-project/clang/lib/Index/IndexingContext.h (revision 4dd55c567aaed30c6842812e0798a70fee324c98)
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 = {});
72 
73   bool handleDecl(const Decl *D, SourceLocation Loc,
74                   SymbolRoleSet Roles = SymbolRoleSet(),
75                   ArrayRef<SymbolRelation> Relations = {},
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 = {},
82                        const Expr *RefE = 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, ArrayRef<SymbolRelation> Relations = {});
98 
99   void indexTypeSourceInfo(TypeSourceInfo *TInfo, const NamedDecl *Parent,
100                            const DeclContext *DC = nullptr,
101                            bool isBase = false,
102                            bool isIBType = false);
103 
104   void indexTypeLoc(TypeLoc TL, const NamedDecl *Parent,
105                     const DeclContext *DC = nullptr,
106                     bool isBase = false,
107                     bool isIBType = false);
108 
109   void indexNestedNameSpecifierLoc(NestedNameSpecifierLoc NNS,
110                                    const NamedDecl *Parent,
111                                    const DeclContext *DC = nullptr);
112 
113   bool indexDeclContext(const DeclContext *DC);
114 
115   void indexBody(const Stmt *S, const NamedDecl *Parent,
116                  const DeclContext *DC = nullptr);
117 
118   bool indexTopLevelDecl(const Decl *D);
119   bool indexDeclGroupRef(DeclGroupRef DG);
120 
121 private:
122   bool shouldIgnoreIfImplicit(const Decl *D);
123 
124   bool shouldIndexMacroOccurrence(bool IsRef, SourceLocation Loc);
125 
126   bool handleDeclOccurrence(const Decl *D, SourceLocation Loc,
127                             bool IsRef, const Decl *Parent,
128                             SymbolRoleSet Roles,
129                             ArrayRef<SymbolRelation> Relations,
130                             const Expr *RefE,
131                             const Decl *RefD,
132                             const DeclContext *ContainerDC);
133 };
134 
135 } // end namespace index
136 } // end namespace clang
137 
138 #endif
139