blob: 04960086d0928f0dbf0ab307923b0c5177d2288e [file] [log] [blame]
Argyrios Kyrtzidisf4fb85b2016-02-12 23:10:59 +00001//===- 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
Eric Liu8c971952018-07-09 08:44:05 +000013#include "clang/Basic/IdentifierTable.h"
Argyrios Kyrtzidisf4fb85b2016-02-12 23:10:59 +000014#include "clang/Basic/LLVM.h"
15#include "clang/Index/IndexSymbol.h"
16#include "clang/Index/IndexingAction.h"
Eric Liu8c971952018-07-09 08:44:05 +000017#include "clang/Lex/MacroInfo.h"
Argyrios Kyrtzidisf4fb85b2016-02-12 23:10:59 +000018#include "llvm/ADT/ArrayRef.h"
19
20namespace clang {
21 class ASTContext;
22 class Decl;
23 class DeclGroupRef;
24 class ImportDecl;
25 class TagDecl;
26 class TypeSourceInfo;
27 class NamedDecl;
28 class ObjCMethodDecl;
29 class DeclContext;
30 class NestedNameSpecifierLoc;
31 class Stmt;
32 class Expr;
33 class TypeLoc;
34 class SourceLocation;
35
36namespace index {
37 class IndexDataConsumer;
38
39class IndexingContext {
40 IndexingOptions IndexOpts;
41 IndexDataConsumer &DataConsumer;
42 ASTContext *Ctx = nullptr;
43
44public:
45 IndexingContext(IndexingOptions IndexOpts, IndexDataConsumer &DataConsumer)
46 : IndexOpts(IndexOpts), DataConsumer(DataConsumer) {}
47
48 const IndexingOptions &getIndexOpts() const { return IndexOpts; }
49 IndexDataConsumer &getDataConsumer() { return DataConsumer; }
50
51 void setASTContext(ASTContext &ctx) { Ctx = &ctx; }
52
Argyrios Kyrtzidis6e5ca5b2017-04-21 05:42:46 +000053 bool shouldIndex(const Decl *D);
54
Alex Lorenza352ba02017-04-24 14:04:58 +000055 const LangOptions &getLangOpts() const;
56
Argyrios Kyrtzidisf4fb85b2016-02-12 23:10:59 +000057 bool shouldSuppressRefs() const {
58 return false;
59 }
60
61 bool shouldIndexFunctionLocalSymbols() const;
62
Fangrui Songd50f36e2018-07-09 21:49:06 +000063 bool shouldIndexImplicitInstantiation() const;
Argyrios Kyrtzidisf4fb85b2016-02-12 23:10:59 +000064
Argyrios Kyrtzidisf4fb85b2016-02-12 23:10:59 +000065 static bool isTemplateImplicitInstantiation(const Decl *D);
66
67 bool handleDecl(const Decl *D, SymbolRoleSet Roles = SymbolRoleSet(),
Argyrios Kyrtzidis29cd1a42016-02-13 05:17:15 +000068 ArrayRef<SymbolRelation> Relations = None);
Argyrios Kyrtzidisf4fb85b2016-02-12 23:10:59 +000069
70 bool handleDecl(const Decl *D, SourceLocation Loc,
71 SymbolRoleSet Roles = SymbolRoleSet(),
Argyrios Kyrtzidis29cd1a42016-02-13 05:17:15 +000072 ArrayRef<SymbolRelation> Relations = None,
Argyrios Kyrtzidisf4fb85b2016-02-12 23:10:59 +000073 const DeclContext *DC = nullptr);
74
75 bool handleReference(const NamedDecl *D, SourceLocation Loc,
76 const NamedDecl *Parent,
77 const DeclContext *DC,
Argyrios Kyrtzidis573624a2017-03-17 23:41:59 +000078 SymbolRoleSet Roles = SymbolRoleSet(),
Argyrios Kyrtzidis29cd1a42016-02-13 05:17:15 +000079 ArrayRef<SymbolRelation> Relations = None,
Argyrios Kyrtzidisf4fb85b2016-02-12 23:10:59 +000080 const Expr *RefE = nullptr,
81 const Decl *RefD = nullptr);
82
Eric Liu8c971952018-07-09 08:44:05 +000083 void handleMacroDefined(const IdentifierInfo &Name, SourceLocation Loc,
84 const MacroInfo &MI);
85
86 void handleMacroUndefined(const IdentifierInfo &Name, SourceLocation Loc,
87 const MacroInfo &MI);
88
89 void handleMacroReference(const IdentifierInfo &Name, SourceLocation Loc,
90 const MacroInfo &MD);
91
Argyrios Kyrtzidisf4fb85b2016-02-12 23:10:59 +000092 bool importedModule(const ImportDecl *ImportD);
93
94 bool indexDecl(const Decl *D);
95
Alex Lorenzf6071c32017-04-20 10:43:22 +000096 void indexTagDecl(const TagDecl *D,
97 ArrayRef<SymbolRelation> Relations = None);
Argyrios Kyrtzidisf4fb85b2016-02-12 23:10:59 +000098
99 void indexTypeSourceInfo(TypeSourceInfo *TInfo, const NamedDecl *Parent,
100 const DeclContext *DC = nullptr,
Argyrios Kyrtzidisde0f5082017-01-11 21:01:07 +0000101 bool isBase = false,
102 bool isIBType = false);
Argyrios Kyrtzidisf4fb85b2016-02-12 23:10:59 +0000103
104 void indexTypeLoc(TypeLoc TL, const NamedDecl *Parent,
105 const DeclContext *DC = nullptr,
Argyrios Kyrtzidisde0f5082017-01-11 21:01:07 +0000106 bool isBase = false,
107 bool isIBType = false);
Argyrios Kyrtzidisf4fb85b2016-02-12 23:10:59 +0000108
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
121private:
122 bool shouldIgnoreIfImplicit(const Decl *D);
123
124 bool handleDeclOccurrence(const Decl *D, SourceLocation Loc,
125 bool IsRef, const Decl *Parent,
126 SymbolRoleSet Roles,
127 ArrayRef<SymbolRelation> Relations,
128 const Expr *RefE,
129 const Decl *RefD,
130 const DeclContext *ContainerDC);
131};
132
133} // end namespace index
134} // end namespace clang
135
136#endif