MultiplexExternalSemaSource.cpp revision 296417
1130812Smarcel//===--- MultiplexExternalSemaSource.cpp  ---------------------------------===//
2130812Smarcel//
3130812Smarcel//                     The LLVM Compiler Infrastructure
4130812Smarcel//
5130812Smarcel// This file is distributed under the University of Illinois Open Source
6130812Smarcel// License. See LICENSE.TXT for details.
7130812Smarcel//
8130812Smarcel//===----------------------------------------------------------------------===//
9130812Smarcel//
10130812Smarcel// This file implements the event dispatching to the subscribed clients.
11130812Smarcel//
12130812Smarcel//===----------------------------------------------------------------------===//
13130812Smarcel#include "clang/Sema/MultiplexExternalSemaSource.h"
14130812Smarcel#include "clang/AST/DeclContextInternals.h"
15130812Smarcel#include "clang/Sema/Lookup.h"
16130812Smarcel
17130812Smarcelusing namespace clang;
18130812Smarcel
19130812Smarcel///\brief Constructs a new multiplexing external sema source and appends the
20130812Smarcel/// given element to it.
21130812Smarcel///
22130812Smarcel///\param[in] source - An ExternalSemaSource.
23130812Smarcel///
24130812SmarcelMultiplexExternalSemaSource::MultiplexExternalSemaSource(ExternalSemaSource &s1,
25130812Smarcel                                                        ExternalSemaSource &s2){
26130812Smarcel  Sources.push_back(&s1);
27130812Smarcel  Sources.push_back(&s2);
28130812Smarcel}
29130812Smarcel
30130812Smarcel// pin the vtable here.
31130812SmarcelMultiplexExternalSemaSource::~MultiplexExternalSemaSource() {}
32130812Smarcel
33130812Smarcel///\brief Appends new source to the source list.
34130812Smarcel///
35130812Smarcel///\param[in] source - An ExternalSemaSource.
36130812Smarcel///
37130812Smarcelvoid MultiplexExternalSemaSource::addSource(ExternalSemaSource &source) {
38130812Smarcel  Sources.push_back(&source);
39130812Smarcel}
40130812Smarcel
41130812Smarcel//===----------------------------------------------------------------------===//
42130812Smarcel// ExternalASTSource.
43130812Smarcel//===----------------------------------------------------------------------===//
44130812Smarcel
45130812SmarcelDecl *MultiplexExternalSemaSource::GetExternalDecl(uint32_t ID) {
46130812Smarcel  for(size_t i = 0; i < Sources.size(); ++i)
47130812Smarcel    if (Decl *Result = Sources[i]->GetExternalDecl(ID))
48130812Smarcel      return Result;
49130812Smarcel  return nullptr;
50130812Smarcel}
51130812Smarcel
52130812Smarcelvoid MultiplexExternalSemaSource::CompleteRedeclChain(const Decl *D) {
53130812Smarcel  for (size_t i = 0; i < Sources.size(); ++i)
54130812Smarcel    Sources[i]->CompleteRedeclChain(D);
55130812Smarcel}
56130812Smarcel
57130812SmarcelSelector MultiplexExternalSemaSource::GetExternalSelector(uint32_t ID) {
58130812Smarcel  Selector Sel;
59130812Smarcel  for(size_t i = 0; i < Sources.size(); ++i) {
60130812Smarcel    Sel = Sources[i]->GetExternalSelector(ID);
61130812Smarcel    if (!Sel.isNull())
62130812Smarcel      return Sel;
63130812Smarcel  }
64130812Smarcel  return Sel;
65130812Smarcel}
66130812Smarcel
67130812Smarceluint32_t MultiplexExternalSemaSource::GetNumExternalSelectors() {
68130812Smarcel  uint32_t total = 0;
69130812Smarcel  for(size_t i = 0; i < Sources.size(); ++i)
70130812Smarcel    total += Sources[i]->GetNumExternalSelectors();
71130812Smarcel  return total;
72130812Smarcel}
73130812Smarcel
74130812SmarcelStmt *MultiplexExternalSemaSource::GetExternalDeclStmt(uint64_t Offset) {
75130812Smarcel  for(size_t i = 0; i < Sources.size(); ++i)
76130812Smarcel    if (Stmt *Result = Sources[i]->GetExternalDeclStmt(Offset))
77130812Smarcel      return Result;
78130812Smarcel  return nullptr;
79130812Smarcel}
80130812Smarcel
81130812SmarcelCXXBaseSpecifier *MultiplexExternalSemaSource::GetExternalCXXBaseSpecifiers(
82130812Smarcel                                                               uint64_t Offset){
83130812Smarcel  for(size_t i = 0; i < Sources.size(); ++i)
84130812Smarcel    if (CXXBaseSpecifier *R = Sources[i]->GetExternalCXXBaseSpecifiers(Offset))
85130812Smarcel      return R;
86130812Smarcel  return nullptr;
87130812Smarcel}
88130812Smarcel
89130812SmarcelCXXCtorInitializer **
90130812SmarcelMultiplexExternalSemaSource::GetExternalCXXCtorInitializers(uint64_t Offset) {
91130812Smarcel  for (auto *S : Sources)
92    if (auto *R = S->GetExternalCXXCtorInitializers(Offset))
93      return R;
94  return nullptr;
95}
96
97bool MultiplexExternalSemaSource::
98FindExternalVisibleDeclsByName(const DeclContext *DC, DeclarationName Name) {
99  bool AnyDeclsFound = false;
100  for (size_t i = 0; i < Sources.size(); ++i)
101    AnyDeclsFound |= Sources[i]->FindExternalVisibleDeclsByName(DC, Name);
102  return AnyDeclsFound;
103}
104
105void MultiplexExternalSemaSource::completeVisibleDeclsMap(const DeclContext *DC){
106  for(size_t i = 0; i < Sources.size(); ++i)
107    Sources[i]->completeVisibleDeclsMap(DC);
108}
109
110void MultiplexExternalSemaSource::FindExternalLexicalDecls(
111    const DeclContext *DC, llvm::function_ref<bool(Decl::Kind)> IsKindWeWant,
112    SmallVectorImpl<Decl *> &Result) {
113  for(size_t i = 0; i < Sources.size(); ++i)
114    Sources[i]->FindExternalLexicalDecls(DC, IsKindWeWant, Result);
115}
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}
205
206void MultiplexExternalSemaSource::ReadUndefinedButUsed(
207                         llvm::DenseMap<NamedDecl*, SourceLocation> &Undefined){
208  for(size_t i = 0; i < Sources.size(); ++i)
209    Sources[i]->ReadUndefinedButUsed(Undefined);
210}
211
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
220bool 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
251void 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
257void 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}
281
282void MultiplexExternalSemaSource::ReadLateParsedTemplates(
283    llvm::MapVector<const FunctionDecl *, LateParsedTemplate *> &LPTMap) {
284  for (size_t i = 0; i < Sources.size(); ++i)
285    Sources[i]->ReadLateParsedTemplates(LPTMap);
286}
287
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}
303
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}
312