blob: 89eec242eb1d291c79055eb69bd754829be738f8 [file] [log] [blame]
Axel Naumanndd433f02012-10-18 19:05:02 +00001//===--- MultiplexExternalSemaSource.cpp ---------------------------------===//
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// This file implements the event dispatching to the subscribed clients.
11//
12//===----------------------------------------------------------------------===//
13#include "clang/Sema/MultiplexExternalSemaSource.h"
Axel Naumanndd433f02012-10-18 19:05:02 +000014#include "clang/AST/DeclContextInternals.h"
15#include "clang/Sema/Lookup.h"
16
17using namespace clang;
18
19///\brief Constructs a new multiplexing external sema source and appends the
20/// given element to it.
21///
22///\param[in] source - An ExternalSemaSource.
23///
24MultiplexExternalSemaSource::MultiplexExternalSemaSource(ExternalSemaSource &s1,
25 ExternalSemaSource &s2){
26 Sources.push_back(&s1);
27 Sources.push_back(&s2);
28}
29
30// pin the vtable here.
Angel Garcia Gomez637d1e62015-10-20 13:23:58 +000031MultiplexExternalSemaSource::~MultiplexExternalSemaSource() {}
Axel Naumanndd433f02012-10-18 19:05:02 +000032
33///\brief Appends new source to the source list.
34///
35///\param[in] source - An ExternalSemaSource.
36///
37void MultiplexExternalSemaSource::addSource(ExternalSemaSource &source) {
38 Sources.push_back(&source);
39}
40
41//===----------------------------------------------------------------------===//
42// ExternalASTSource.
43//===----------------------------------------------------------------------===//
44
45Decl *MultiplexExternalSemaSource::GetExternalDecl(uint32_t ID) {
46 for(size_t i = 0; i < Sources.size(); ++i)
47 if (Decl *Result = Sources[i]->GetExternalDecl(ID))
48 return Result;
Craig Topperc3ec1492014-05-26 06:22:03 +000049 return nullptr;
Axel Naumanndd433f02012-10-18 19:05:02 +000050}
51
Richard Smith053f6c62014-05-16 23:01:30 +000052void MultiplexExternalSemaSource::CompleteRedeclChain(const Decl *D) {
53 for (size_t i = 0; i < Sources.size(); ++i)
54 Sources[i]->CompleteRedeclChain(D);
55}
56
Axel Naumanndd433f02012-10-18 19:05:02 +000057Selector MultiplexExternalSemaSource::GetExternalSelector(uint32_t ID) {
58 Selector Sel;
59 for(size_t i = 0; i < Sources.size(); ++i) {
60 Sel = Sources[i]->GetExternalSelector(ID);
61 if (!Sel.isNull())
62 return Sel;
63 }
64 return Sel;
65}
66
67uint32_t MultiplexExternalSemaSource::GetNumExternalSelectors() {
68 uint32_t total = 0;
69 for(size_t i = 0; i < Sources.size(); ++i)
70 total += Sources[i]->GetNumExternalSelectors();
71 return total;
72}
73
74Stmt *MultiplexExternalSemaSource::GetExternalDeclStmt(uint64_t Offset) {
75 for(size_t i = 0; i < Sources.size(); ++i)
76 if (Stmt *Result = Sources[i]->GetExternalDeclStmt(Offset))
77 return Result;
Craig Topperc3ec1492014-05-26 06:22:03 +000078 return nullptr;
Axel Naumanndd433f02012-10-18 19:05:02 +000079}
80
81CXXBaseSpecifier *MultiplexExternalSemaSource::GetExternalCXXBaseSpecifiers(
82 uint64_t Offset){
83 for(size_t i = 0; i < Sources.size(); ++i)
84 if (CXXBaseSpecifier *R = Sources[i]->GetExternalCXXBaseSpecifiers(Offset))
85 return R;
Craig Topperc3ec1492014-05-26 06:22:03 +000086 return nullptr;
Axel Naumanndd433f02012-10-18 19:05:02 +000087}
88
Richard Smithc2bb8182015-03-24 06:36:48 +000089CXXCtorInitializer **
90MultiplexExternalSemaSource::GetExternalCXXCtorInitializers(uint64_t Offset) {
91 for (auto *S : Sources)
92 if (auto *R = S->GetExternalCXXCtorInitializers(Offset))
93 return R;
94 return nullptr;
95}
96
Richard Smith9ce12e32013-02-07 03:30:24 +000097bool MultiplexExternalSemaSource::
Axel Naumanndd433f02012-10-18 19:05:02 +000098FindExternalVisibleDeclsByName(const DeclContext *DC, DeclarationName Name) {
Richard Smith9ce12e32013-02-07 03:30:24 +000099 bool AnyDeclsFound = false;
100 for (size_t i = 0; i < Sources.size(); ++i)
101 AnyDeclsFound |= Sources[i]->FindExternalVisibleDeclsByName(DC, Name);
102 return AnyDeclsFound;
Axel Naumanndd433f02012-10-18 19:05:02 +0000103}
104
105void MultiplexExternalSemaSource::completeVisibleDeclsMap(const DeclContext *DC){
106 for(size_t i = 0; i < Sources.size(); ++i)
107 Sources[i]->completeVisibleDeclsMap(DC);
108}
109
Richard Smith3cb15722015-08-05 22:41:45 +0000110void MultiplexExternalSemaSource::FindExternalLexicalDecls(
111 const DeclContext *DC, llvm::function_ref<bool(Decl::Kind)> IsKindWeWant,
112 SmallVectorImpl<Decl *> &Result) {
Axel Naumanndd433f02012-10-18 19:05:02 +0000113 for(size_t i = 0; i < Sources.size(); ++i)
Richard Smith3cb15722015-08-05 22:41:45 +0000114 Sources[i]->FindExternalLexicalDecls(DC, IsKindWeWant, Result);
Axel Naumanndd433f02012-10-18 19:05:02 +0000115}
116
117void MultiplexExternalSemaSource::FindFileRegionDecls(FileID File,
118 unsigned Offset,
119 unsigned Length,
120 SmallVectorImpl<Decl *> &Decls){
121 for(size_t i = 0; i < Sources.size(); ++i)
122 Sources[i]->FindFileRegionDecls(File, Offset, Length, Decls);
123}
124
125void MultiplexExternalSemaSource::CompleteType(TagDecl *Tag) {
126 for(size_t i = 0; i < Sources.size(); ++i)
127 Sources[i]->CompleteType(Tag);
128}
129
130void MultiplexExternalSemaSource::CompleteType(ObjCInterfaceDecl *Class) {
131 for(size_t i = 0; i < Sources.size(); ++i)
132 Sources[i]->CompleteType(Class);
133}
134
135void MultiplexExternalSemaSource::ReadComments() {
136 for(size_t i = 0; i < Sources.size(); ++i)
137 Sources[i]->ReadComments();
138}
139
140void MultiplexExternalSemaSource::StartedDeserializing() {
141 for(size_t i = 0; i < Sources.size(); ++i)
142 Sources[i]->StartedDeserializing();
143}
144
145void MultiplexExternalSemaSource::FinishedDeserializing() {
146 for(size_t i = 0; i < Sources.size(); ++i)
147 Sources[i]->FinishedDeserializing();
148}
149
150void MultiplexExternalSemaSource::StartTranslationUnit(ASTConsumer *Consumer) {
151 for(size_t i = 0; i < Sources.size(); ++i)
152 Sources[i]->StartTranslationUnit(Consumer);
153}
154
155void MultiplexExternalSemaSource::PrintStats() {
156 for(size_t i = 0; i < Sources.size(); ++i)
157 Sources[i]->PrintStats();
158}
159
160bool MultiplexExternalSemaSource::layoutRecordType(const RecordDecl *Record,
161 uint64_t &Size,
162 uint64_t &Alignment,
163 llvm::DenseMap<const FieldDecl *, uint64_t> &FieldOffsets,
164 llvm::DenseMap<const CXXRecordDecl *, CharUnits> &BaseOffsets,
165 llvm::DenseMap<const CXXRecordDecl *, CharUnits> &VirtualBaseOffsets){
166 for(size_t i = 0; i < Sources.size(); ++i)
167 if (Sources[i]->layoutRecordType(Record, Size, Alignment, FieldOffsets,
168 BaseOffsets, VirtualBaseOffsets))
169 return true;
170 return false;
171}
172
173void MultiplexExternalSemaSource::
174getMemoryBufferSizes(MemoryBufferSizes &sizes) const {
175 for(size_t i = 0; i < Sources.size(); ++i)
176 Sources[i]->getMemoryBufferSizes(sizes);
177
178}
179
180//===----------------------------------------------------------------------===//
181// ExternalSemaSource.
182//===----------------------------------------------------------------------===//
183
184
185void MultiplexExternalSemaSource::InitializeSema(Sema &S) {
186 for(size_t i = 0; i < Sources.size(); ++i)
187 Sources[i]->InitializeSema(S);
188}
189
190void MultiplexExternalSemaSource::ForgetSema() {
191 for(size_t i = 0; i < Sources.size(); ++i)
192 Sources[i]->ForgetSema();
193}
194
195void MultiplexExternalSemaSource::ReadMethodPool(Selector Sel) {
196 for(size_t i = 0; i < Sources.size(); ++i)
197 Sources[i]->ReadMethodPool(Sel);
198}
199
200void MultiplexExternalSemaSource::ReadKnownNamespaces(
201 SmallVectorImpl<NamespaceDecl*> &Namespaces){
202 for(size_t i = 0; i < Sources.size(); ++i)
203 Sources[i]->ReadKnownNamespaces(Namespaces);
204}
Nick Lewycky8334af82013-01-26 00:35:08 +0000205
Nick Lewycky9c7eb1d2013-02-01 08:13:20 +0000206void MultiplexExternalSemaSource::ReadUndefinedButUsed(
Richard Smithd6a04d72016-03-25 21:49:43 +0000207 llvm::MapVector<NamedDecl *, SourceLocation> &Undefined) {
Nick Lewycky8334af82013-01-26 00:35:08 +0000208 for(size_t i = 0; i < Sources.size(); ++i)
Nick Lewycky9c7eb1d2013-02-01 08:13:20 +0000209 Sources[i]->ReadUndefinedButUsed(Undefined);
Nick Lewycky8334af82013-01-26 00:35:08 +0000210}
Ismail Pazarbasie5768d12015-05-18 19:59:11 +0000211
212void MultiplexExternalSemaSource::ReadMismatchingDeleteExpressions(
213 llvm::MapVector<FieldDecl *,
214 llvm::SmallVector<std::pair<SourceLocation, bool>, 4>> &
215 Exprs) {
216 for (auto &Source : Sources)
217 Source->ReadMismatchingDeleteExpressions(Exprs);
218}
219
Axel Naumanndd433f02012-10-18 19:05:02 +0000220bool MultiplexExternalSemaSource::LookupUnqualified(LookupResult &R, Scope *S){
221 for(size_t i = 0; i < Sources.size(); ++i)
222 Sources[i]->LookupUnqualified(R, S);
223
224 return !R.empty();
225}
226
227void MultiplexExternalSemaSource::ReadTentativeDefinitions(
228 SmallVectorImpl<VarDecl*> &TentativeDefs) {
229 for(size_t i = 0; i < Sources.size(); ++i)
230 Sources[i]->ReadTentativeDefinitions(TentativeDefs);
231}
232
233void MultiplexExternalSemaSource::ReadUnusedFileScopedDecls(
234 SmallVectorImpl<const DeclaratorDecl*> &Decls) {
235 for(size_t i = 0; i < Sources.size(); ++i)
236 Sources[i]->ReadUnusedFileScopedDecls(Decls);
237}
238
239void MultiplexExternalSemaSource::ReadDelegatingConstructors(
240 SmallVectorImpl<CXXConstructorDecl*> &Decls) {
241 for(size_t i = 0; i < Sources.size(); ++i)
242 Sources[i]->ReadDelegatingConstructors(Decls);
243}
244
245void MultiplexExternalSemaSource::ReadExtVectorDecls(
246 SmallVectorImpl<TypedefNameDecl*> &Decls) {
247 for(size_t i = 0; i < Sources.size(); ++i)
248 Sources[i]->ReadExtVectorDecls(Decls);
249}
250
Nico Weber72889432014-09-06 01:25:55 +0000251void MultiplexExternalSemaSource::ReadUnusedLocalTypedefNameCandidates(
252 llvm::SmallSetVector<const TypedefNameDecl *, 4> &Decls) {
253 for(size_t i = 0; i < Sources.size(); ++i)
254 Sources[i]->ReadUnusedLocalTypedefNameCandidates(Decls);
255}
256
Axel Naumanndd433f02012-10-18 19:05:02 +0000257void MultiplexExternalSemaSource::ReadReferencedSelectors(
258 SmallVectorImpl<std::pair<Selector, SourceLocation> > &Sels) {
259 for(size_t i = 0; i < Sources.size(); ++i)
260 Sources[i]->ReadReferencedSelectors(Sels);
261}
262
263void MultiplexExternalSemaSource::ReadWeakUndeclaredIdentifiers(
264 SmallVectorImpl<std::pair<IdentifierInfo*, WeakInfo> > &WI) {
265 for(size_t i = 0; i < Sources.size(); ++i)
266 Sources[i]->ReadWeakUndeclaredIdentifiers(WI);
267}
268
269void MultiplexExternalSemaSource::ReadUsedVTables(
270 SmallVectorImpl<ExternalVTableUse> &VTables) {
271 for(size_t i = 0; i < Sources.size(); ++i)
272 Sources[i]->ReadUsedVTables(VTables);
273}
274
275void MultiplexExternalSemaSource::ReadPendingInstantiations(
276 SmallVectorImpl<std::pair<ValueDecl*,
277 SourceLocation> > &Pending) {
278 for(size_t i = 0; i < Sources.size(); ++i)
279 Sources[i]->ReadPendingInstantiations(Pending);
280}
Richard Smithe40f2ba2013-08-07 21:41:30 +0000281
282void MultiplexExternalSemaSource::ReadLateParsedTemplates(
Chandler Carruth52cee4d2015-03-26 09:08:15 +0000283 llvm::MapVector<const FunctionDecl *, LateParsedTemplate *> &LPTMap) {
Richard Smithe40f2ba2013-08-07 21:41:30 +0000284 for (size_t i = 0; i < Sources.size(); ++i)
285 Sources[i]->ReadLateParsedTemplates(LPTMap);
286}
Kaelyn Uhrainf0aabda2013-08-12 19:54:38 +0000287
288TypoCorrection MultiplexExternalSemaSource::CorrectTypo(
289 const DeclarationNameInfo &Typo,
290 int LookupKind, Scope *S, CXXScopeSpec *SS,
291 CorrectionCandidateCallback &CCC,
292 DeclContext *MemberContext,
293 bool EnteringContext,
294 const ObjCObjectPointerType *OPT) {
295 for (size_t I = 0, E = Sources.size(); I < E; ++I) {
296 if (TypoCorrection C = Sources[I]->CorrectTypo(Typo, LookupKind, S, SS, CCC,
297 MemberContext,
298 EnteringContext, OPT))
299 return C;
300 }
301 return TypoCorrection();
302}
Kaelyn Uhrain2c351bb2013-08-12 22:11:14 +0000303
304bool MultiplexExternalSemaSource::MaybeDiagnoseMissingCompleteType(
305 SourceLocation Loc, QualType T) {
306 for (size_t I = 0, E = Sources.size(); I < E; ++I) {
307 if (Sources[I]->MaybeDiagnoseMissingCompleteType(Loc, T))
308 return true;
309 }
310 return false;
311}