blob: d69f1c8eaa9c0942bf6fac0d9fada30e4855106a [file] [log] [blame]
Argyrios Kyrtzidis4e7064f2011-10-17 19:48:19 +00001//===- IndexingContext.h - Higher level API functions ------------------------===//
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#include "Index_Internal.h"
11#include "CXCursor.h"
12
13#include "clang/AST/Decl.h"
14#include "clang/AST/DeclGroup.h"
15#include "llvm/ADT/DenseMap.h"
16
17namespace clang {
18 class FileEntry;
19 class ObjCPropertyDecl;
20
21namespace cxindex {
22 class IndexingContext;
23
24class IndexingContext {
25 ASTContext *Ctx;
26 CXClientData ClientData;
27 IndexerCallbacks &CB;
28 unsigned IndexOptions;
29 CXTranslationUnit CXTU;
30
31 typedef llvm::DenseMap<const FileEntry *, CXIdxFile> FileMapTy;
32 typedef llvm::DenseMap<const NamedDecl *, CXIdxEntity> EntityMapTy;
33 typedef llvm::DenseMap<const void *, CXIdxMacro> MacroMapTy;
34 typedef llvm::DenseMap<const DeclContext *, CXIdxContainer> ContainerMapTy;
35 FileMapTy FileMap;
36 EntityMapTy EntityMap;
37 MacroMapTy MacroMap;
38 ContainerMapTy ContainerMap;
39
40 SmallVector<DeclGroupRef, 8> TUDeclsInObjCContainer;
41
42 llvm::SmallString<256> StrScratch;
43
44 class StrAdapter {
45 llvm::SmallString<256> &Scratch;
46
47 public:
48 StrAdapter(IndexingContext *indexCtx)
49 : Scratch(indexCtx->StrScratch) {}
50 ~StrAdapter() { Scratch.clear(); }
51
52 const char *toCStr(StringRef Str);
53
54 unsigned getCurSize() const { return Scratch.size(); }
55
56 const char *getCStr(unsigned CharIndex) {
57 Scratch.push_back('\0');
58 return Scratch.data() + CharIndex;
59 }
60
61 SmallVectorImpl<char> &getBuffer() { return Scratch; }
62 };
63
64public:
65 IndexingContext(CXClientData clientData, IndexerCallbacks &indexCallbacks,
66 unsigned indexOptions, CXTranslationUnit cxTU)
67 : Ctx(0), ClientData(clientData), CB(indexCallbacks),
68 IndexOptions(indexOptions), CXTU(cxTU) { }
69
70 ASTContext &getASTContext() const { return *Ctx; }
71
72 void setASTContext(ASTContext &ctx);
73
74 void ppIncludedFile(SourceLocation hashLoc,
75 StringRef filename, const FileEntry *File,
76 bool isImport, bool isAngled);
77
78 void ppMacroDefined(SourceLocation Loc, StringRef Name,
79 SourceLocation DefBegin, unsigned Length,
80 const void *OpaqueMacro);
81
82 void ppMacroUndefined(SourceLocation Loc, StringRef Name,
83 const void *OpaqueMacro);
84
85 void ppMacroExpanded(SourceLocation Loc, StringRef Name,
86 const void *OpaqueMacro);
87
88 void invokeStartedTranslationUnit();
89
90 void invokeFinishedTranslationUnit();
91
92 void indexDecl(const Decl *D);
93
94 void indexTagDecl(const TagDecl *D);
95
96 void indexTypeSourceInfo(TypeSourceInfo *TInfo, const NamedDecl *Parent,
97 const DeclContext *DC = 0);
98
99 void indexTypeLoc(TypeLoc TL, const NamedDecl *Parent,
100 const DeclContext *DC);
101
102 void indexDeclContext(const DeclContext *DC);
103
104 void indexBody(const Stmt *S, const DeclContext *DC);
105
106 void handleDiagnostic(const StoredDiagnostic &StoredDiag);
107
108 void handleFunction(const FunctionDecl *FD);
109
110 void handleVar(const VarDecl *D);
111
112 void handleField(const FieldDecl *D);
113
114 void handleEnumerator(const EnumConstantDecl *D);
115
116 void handleTagDecl(const TagDecl *D);
117
118 void handleTypedef(const TypedefDecl *D);
119
120 void handleObjCInterface(const ObjCInterfaceDecl *D);
121
122 void defineObjCInterface(const ObjCInterfaceDecl *D);
123
124 void handleObjCProtocol(const ObjCProtocolDecl *D);
125
126 void handleObjCCategory(const ObjCCategoryDecl *D);
127
128 void handleObjCMethod(const ObjCMethodDecl *D);
129
130 void handleObjCProperty(const ObjCPropertyDecl *D);
131
132 void handleReference(const NamedDecl *D, SourceLocation Loc,
133 const NamedDecl *Parent,
134 const DeclContext *DC,
Argyrios Kyrtzidisaca19be2011-10-18 15:50:50 +0000135 const Expr *E = 0,
136 CXIdxEntityRefKind Kind = CXIdxEntityRef_Direct);
Argyrios Kyrtzidis4e7064f2011-10-17 19:48:19 +0000137
138 void invokeStartedTagTypeDefinition(const TagDecl *D);
139
140 void invokeStartedStatementBody(const NamedDecl *D, const DeclContext *DC);
141
142 void invokeStartedObjCContainer(const ObjCContainerDecl *D);
143
144 void invokeEndedContainer(const DeclContext *DC);
145
146 bool isNotFromSourceFile(SourceLocation Loc) const;
147
148 void indexTUDeclsInObjCContainer();
149 void indexDeclGroupRef(DeclGroupRef DG);
150
151 void addTUDeclInObjCContainer(DeclGroupRef DG) {
152 TUDeclsInObjCContainer.push_back(DG);
153 }
154
155 void translateLoc(SourceLocation Loc, CXIdxFile *indexFile, CXFile *file,
156 unsigned *line, unsigned *column, unsigned *offset);
157
158private:
159 void addEntityInMap(const NamedDecl *D, CXIdxEntity entity);
160
161 void addContainerInMap(const DeclContext *DC, CXIdxContainer container);
162
163 CXIdxEntity getIndexEntity(const NamedDecl *D);
164
165 const NamedDecl *getEntityDecl(const NamedDecl *D) const;
166
167 CXIdxContainer getIndexContainer(const NamedDecl *D) const {
168 return getIndexContainerForDC(D->getDeclContext());
169 }
170
171 const DeclContext *getScopedContext(const DeclContext *DC) const;
172 CXIdxContainer getIndexContainerForDC(const DeclContext *DC) const;
173
174 CXIdxFile getIndexFile(const FileEntry *File);
175
176 CXIdxLoc getIndexLoc(SourceLocation Loc) const;
177
178 void getIndexedEntityInfo(const NamedDecl *D,
179 CXIdxIndexedEntityInfo &IdxEntityInfo,
180 CXIdxEntityInfo &EntityInfo,
181 CXIdxIndexedDeclInfo &IdxDeclInfo,
182 StrAdapter &SA);
183
184 void getIndexedDeclInfo(const NamedDecl *D,
185 CXIdxIndexedDeclInfo &IdxDeclInfo);
186
187 void getIndexedRedeclInfo(const NamedDecl *D,
188 CXIdxIndexedRedeclInfo &RedeclInfo,
189 CXIdxIndexedDeclInfo &IdxDeclInfo);
190
191 void getContainerInfo(const NamedDecl *D,
192 CXIdxContainerInfo &ContainerInfo);
193
194 void getEntityInfo(const NamedDecl *D,
195 CXIdxEntityInfo &EntityInfo,
196 StrAdapter &SA);
197
198 CXCursor getCursor(const NamedDecl *D) {
199 return cxcursor::MakeCXCursor(const_cast<NamedDecl*>(D), CXTU);
200 }
201
202 CXCursor getRefCursor(const NamedDecl *D, SourceLocation Loc);
203};
204
205}} // end clang::cxindex