blob: c70cb0a8272d7fa818d6dc6a1c98d27de4f213ff [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
13#include "clang/Basic/LLVM.h"
14#include "clang/Index/IndexSymbol.h"
15#include "clang/Index/IndexingAction.h"
16#include "llvm/ADT/ArrayRef.h"
17
18namespace clang {
19 class ASTContext;
20 class Decl;
21 class DeclGroupRef;
22 class ImportDecl;
23 class TagDecl;
24 class TypeSourceInfo;
25 class NamedDecl;
26 class ObjCMethodDecl;
27 class DeclContext;
28 class NestedNameSpecifierLoc;
29 class Stmt;
30 class Expr;
31 class TypeLoc;
32 class SourceLocation;
33
34namespace index {
35 class IndexDataConsumer;
36
37class IndexingContext {
38 IndexingOptions IndexOpts;
39 IndexDataConsumer &DataConsumer;
40 ASTContext *Ctx = nullptr;
41
42public:
43 IndexingContext(IndexingOptions IndexOpts, IndexDataConsumer &DataConsumer)
44 : IndexOpts(IndexOpts), DataConsumer(DataConsumer) {}
45
46 const IndexingOptions &getIndexOpts() const { return IndexOpts; }
47 IndexDataConsumer &getDataConsumer() { return DataConsumer; }
48
49 void setASTContext(ASTContext &ctx) { Ctx = &ctx; }
50
Argyrios Kyrtzidis6e5ca5b2017-04-21 05:42:46 +000051 bool shouldIndex(const Decl *D);
52
Argyrios Kyrtzidisf4fb85b2016-02-12 23:10:59 +000053 bool shouldSuppressRefs() const {
54 return false;
55 }
56
57 bool shouldIndexFunctionLocalSymbols() const;
58
59 bool shouldIndexImplicitTemplateInsts() const {
60 return false;
61 }
62
Argyrios Kyrtzidisf4fb85b2016-02-12 23:10:59 +000063 static bool isTemplateImplicitInstantiation(const Decl *D);
64
65 bool handleDecl(const Decl *D, SymbolRoleSet Roles = SymbolRoleSet(),
Argyrios Kyrtzidis29cd1a42016-02-13 05:17:15 +000066 ArrayRef<SymbolRelation> Relations = None);
Argyrios Kyrtzidisf4fb85b2016-02-12 23:10:59 +000067
68 bool handleDecl(const Decl *D, SourceLocation Loc,
69 SymbolRoleSet Roles = SymbolRoleSet(),
Argyrios Kyrtzidis29cd1a42016-02-13 05:17:15 +000070 ArrayRef<SymbolRelation> Relations = None,
Argyrios Kyrtzidisf4fb85b2016-02-12 23:10:59 +000071 const DeclContext *DC = nullptr);
72
73 bool handleReference(const NamedDecl *D, SourceLocation Loc,
74 const NamedDecl *Parent,
75 const DeclContext *DC,
Argyrios Kyrtzidis573624a2017-03-17 23:41:59 +000076 SymbolRoleSet Roles = SymbolRoleSet(),
Argyrios Kyrtzidis29cd1a42016-02-13 05:17:15 +000077 ArrayRef<SymbolRelation> Relations = None,
Argyrios Kyrtzidisf4fb85b2016-02-12 23:10:59 +000078 const Expr *RefE = nullptr,
79 const Decl *RefD = nullptr);
80
81 bool importedModule(const ImportDecl *ImportD);
82
83 bool indexDecl(const Decl *D);
84
Alex Lorenzf6071c32017-04-20 10:43:22 +000085 void indexTagDecl(const TagDecl *D,
86 ArrayRef<SymbolRelation> Relations = None);
Argyrios Kyrtzidisf4fb85b2016-02-12 23:10:59 +000087
88 void indexTypeSourceInfo(TypeSourceInfo *TInfo, const NamedDecl *Parent,
89 const DeclContext *DC = nullptr,
Argyrios Kyrtzidisde0f5082017-01-11 21:01:07 +000090 bool isBase = false,
91 bool isIBType = false);
Argyrios Kyrtzidisf4fb85b2016-02-12 23:10:59 +000092
93 void indexTypeLoc(TypeLoc TL, const NamedDecl *Parent,
94 const DeclContext *DC = nullptr,
Argyrios Kyrtzidisde0f5082017-01-11 21:01:07 +000095 bool isBase = false,
96 bool isIBType = false);
Argyrios Kyrtzidisf4fb85b2016-02-12 23:10:59 +000097
98 void indexNestedNameSpecifierLoc(NestedNameSpecifierLoc NNS,
99 const NamedDecl *Parent,
100 const DeclContext *DC = nullptr);
101
102 bool indexDeclContext(const DeclContext *DC);
103
104 void indexBody(const Stmt *S, const NamedDecl *Parent,
105 const DeclContext *DC = nullptr);
106
107 bool indexTopLevelDecl(const Decl *D);
108 bool indexDeclGroupRef(DeclGroupRef DG);
109
110private:
111 bool shouldIgnoreIfImplicit(const Decl *D);
112
113 bool handleDeclOccurrence(const Decl *D, SourceLocation Loc,
114 bool IsRef, const Decl *Parent,
115 SymbolRoleSet Roles,
116 ArrayRef<SymbolRelation> Relations,
117 const Expr *RefE,
118 const Decl *RefD,
119 const DeclContext *ContainerDC);
120};
121
122} // end namespace index
123} // end namespace clang
124
125#endif