MultiplexExternalSemaSource.cpp revision 243791
1//===--- 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"
14
15#include "clang/AST/DeclContextInternals.h"
16#include "clang/Sema/Lookup.h"
17
18using namespace clang;
19
20///\brief Constructs a new multiplexing external sema source and appends the
21/// given element to it.
22///
23///\param[in] source - An ExternalSemaSource.
24///
25MultiplexExternalSemaSource::MultiplexExternalSemaSource(ExternalSemaSource &s1,
26                                                        ExternalSemaSource &s2){
27  Sources.push_back(&s1);
28  Sources.push_back(&s2);
29}
30
31// pin the vtable here.
32MultiplexExternalSemaSource::~MultiplexExternalSemaSource() {}
33
34///\brief Appends new source to the source list.
35///
36///\param[in] source - An ExternalSemaSource.
37///
38void MultiplexExternalSemaSource::addSource(ExternalSemaSource &source) {
39  Sources.push_back(&source);
40}
41
42//===----------------------------------------------------------------------===//
43// ExternalASTSource.
44//===----------------------------------------------------------------------===//
45
46Decl *MultiplexExternalSemaSource::GetExternalDecl(uint32_t ID) {
47  for(size_t i = 0; i < Sources.size(); ++i)
48    if (Decl *Result = Sources[i]->GetExternalDecl(ID))
49      return Result;
50  return 0;
51}
52
53Selector MultiplexExternalSemaSource::GetExternalSelector(uint32_t ID) {
54  Selector Sel;
55  for(size_t i = 0; i < Sources.size(); ++i) {
56    Sel = Sources[i]->GetExternalSelector(ID);
57    if (!Sel.isNull())
58      return Sel;
59  }
60  return Sel;
61}
62
63uint32_t MultiplexExternalSemaSource::GetNumExternalSelectors() {
64  uint32_t total = 0;
65  for(size_t i = 0; i < Sources.size(); ++i)
66    total += Sources[i]->GetNumExternalSelectors();
67  return total;
68}
69
70Stmt *MultiplexExternalSemaSource::GetExternalDeclStmt(uint64_t Offset) {
71  for(size_t i = 0; i < Sources.size(); ++i)
72    if (Stmt *Result = Sources[i]->GetExternalDeclStmt(Offset))
73      return Result;
74  return 0;
75}
76
77CXXBaseSpecifier *MultiplexExternalSemaSource::GetExternalCXXBaseSpecifiers(
78                                                               uint64_t Offset){
79  for(size_t i = 0; i < Sources.size(); ++i)
80    if (CXXBaseSpecifier *R = Sources[i]->GetExternalCXXBaseSpecifiers(Offset))
81      return R;
82  return 0;
83}
84
85DeclContextLookupResult MultiplexExternalSemaSource::
86FindExternalVisibleDeclsByName(const DeclContext *DC, DeclarationName Name) {
87  StoredDeclsList DeclsFound;
88  DeclContextLookupResult lookup;
89  for(size_t i = 0; i < Sources.size(); ++i) {
90    lookup = Sources[i]->FindExternalVisibleDeclsByName(DC, Name);
91    while(lookup.first != lookup.second) {
92      if (!DeclsFound.HandleRedeclaration(*lookup.first))
93        DeclsFound.AddSubsequentDecl(*lookup.first);
94      lookup.first++;
95    }
96  }
97  return DeclsFound.getLookupResult();
98}
99
100void MultiplexExternalSemaSource::completeVisibleDeclsMap(const DeclContext *DC){
101  for(size_t i = 0; i < Sources.size(); ++i)
102    Sources[i]->completeVisibleDeclsMap(DC);
103}
104
105ExternalLoadResult MultiplexExternalSemaSource::
106FindExternalLexicalDecls(const DeclContext *DC,
107                         bool (*isKindWeWant)(Decl::Kind),
108                         SmallVectorImpl<Decl*> &Result) {
109  for(size_t i = 0; i < Sources.size(); ++i)
110    // FIXME: The semantics of the return result is unclear to me...
111    Sources[i]->FindExternalLexicalDecls(DC, isKindWeWant, Result);
112
113  return ELR_Success;
114}
115
116void MultiplexExternalSemaSource::FindFileRegionDecls(FileID File,
117                                                      unsigned Offset,
118                                                      unsigned Length,
119                                                SmallVectorImpl<Decl *> &Decls){
120  for(size_t i = 0; i < Sources.size(); ++i)
121    Sources[i]->FindFileRegionDecls(File, Offset, Length, Decls);
122}
123
124void MultiplexExternalSemaSource::CompleteType(TagDecl *Tag) {
125  for(size_t i = 0; i < Sources.size(); ++i)
126    Sources[i]->CompleteType(Tag);
127}
128
129void MultiplexExternalSemaSource::CompleteType(ObjCInterfaceDecl *Class) {
130  for(size_t i = 0; i < Sources.size(); ++i)
131    Sources[i]->CompleteType(Class);
132}
133
134void MultiplexExternalSemaSource::ReadComments() {
135  for(size_t i = 0; i < Sources.size(); ++i)
136    Sources[i]->ReadComments();
137}
138
139void MultiplexExternalSemaSource::StartedDeserializing() {
140  for(size_t i = 0; i < Sources.size(); ++i)
141    Sources[i]->StartedDeserializing();
142}
143
144void MultiplexExternalSemaSource::FinishedDeserializing() {
145  for(size_t i = 0; i < Sources.size(); ++i)
146    Sources[i]->FinishedDeserializing();
147}
148
149void MultiplexExternalSemaSource::StartTranslationUnit(ASTConsumer *Consumer) {
150  for(size_t i = 0; i < Sources.size(); ++i)
151    Sources[i]->StartTranslationUnit(Consumer);
152}
153
154void MultiplexExternalSemaSource::PrintStats() {
155  for(size_t i = 0; i < Sources.size(); ++i)
156    Sources[i]->PrintStats();
157}
158
159bool MultiplexExternalSemaSource::layoutRecordType(const RecordDecl *Record,
160                                                   uint64_t &Size,
161                                                   uint64_t &Alignment,
162                      llvm::DenseMap<const FieldDecl *, uint64_t> &FieldOffsets,
163                  llvm::DenseMap<const CXXRecordDecl *, CharUnits> &BaseOffsets,
164          llvm::DenseMap<const CXXRecordDecl *, CharUnits> &VirtualBaseOffsets){
165  for(size_t i = 0; i < Sources.size(); ++i)
166    if (Sources[i]->layoutRecordType(Record, Size, Alignment, FieldOffsets,
167                                     BaseOffsets, VirtualBaseOffsets))
168      return true;
169  return false;
170}
171
172void MultiplexExternalSemaSource::
173getMemoryBufferSizes(MemoryBufferSizes &sizes) const {
174  for(size_t i = 0; i < Sources.size(); ++i)
175    Sources[i]->getMemoryBufferSizes(sizes);
176
177}
178
179//===----------------------------------------------------------------------===//
180// ExternalSemaSource.
181//===----------------------------------------------------------------------===//
182
183
184void MultiplexExternalSemaSource::InitializeSema(Sema &S) {
185  for(size_t i = 0; i < Sources.size(); ++i)
186    Sources[i]->InitializeSema(S);
187}
188
189void MultiplexExternalSemaSource::ForgetSema() {
190  for(size_t i = 0; i < Sources.size(); ++i)
191    Sources[i]->ForgetSema();
192}
193
194void MultiplexExternalSemaSource::ReadMethodPool(Selector Sel) {
195  for(size_t i = 0; i < Sources.size(); ++i)
196    Sources[i]->ReadMethodPool(Sel);
197}
198
199void MultiplexExternalSemaSource::ReadKnownNamespaces(
200                                   SmallVectorImpl<NamespaceDecl*> &Namespaces){
201  for(size_t i = 0; i < Sources.size(); ++i)
202    Sources[i]->ReadKnownNamespaces(Namespaces);
203}
204
205bool MultiplexExternalSemaSource::LookupUnqualified(LookupResult &R, Scope *S){
206  for(size_t i = 0; i < Sources.size(); ++i)
207    Sources[i]->LookupUnqualified(R, S);
208
209  return !R.empty();
210}
211
212void MultiplexExternalSemaSource::ReadTentativeDefinitions(
213                                     SmallVectorImpl<VarDecl*> &TentativeDefs) {
214  for(size_t i = 0; i < Sources.size(); ++i)
215    Sources[i]->ReadTentativeDefinitions(TentativeDefs);
216}
217
218void MultiplexExternalSemaSource::ReadUnusedFileScopedDecls(
219                                SmallVectorImpl<const DeclaratorDecl*> &Decls) {
220  for(size_t i = 0; i < Sources.size(); ++i)
221    Sources[i]->ReadUnusedFileScopedDecls(Decls);
222}
223
224void MultiplexExternalSemaSource::ReadDelegatingConstructors(
225                                  SmallVectorImpl<CXXConstructorDecl*> &Decls) {
226  for(size_t i = 0; i < Sources.size(); ++i)
227    Sources[i]->ReadDelegatingConstructors(Decls);
228}
229
230void MultiplexExternalSemaSource::ReadExtVectorDecls(
231                                     SmallVectorImpl<TypedefNameDecl*> &Decls) {
232  for(size_t i = 0; i < Sources.size(); ++i)
233    Sources[i]->ReadExtVectorDecls(Decls);
234}
235
236void MultiplexExternalSemaSource::ReadDynamicClasses(
237                                       SmallVectorImpl<CXXRecordDecl*> &Decls) {
238  for(size_t i = 0; i < Sources.size(); ++i)
239    Sources[i]->ReadDynamicClasses(Decls);
240}
241
242void MultiplexExternalSemaSource::ReadLocallyScopedExternalDecls(
243                                           SmallVectorImpl<NamedDecl*> &Decls) {
244  for(size_t i = 0; i < Sources.size(); ++i)
245    Sources[i]->ReadLocallyScopedExternalDecls(Decls);
246}
247
248void MultiplexExternalSemaSource::ReadReferencedSelectors(
249                  SmallVectorImpl<std::pair<Selector, SourceLocation> > &Sels) {
250  for(size_t i = 0; i < Sources.size(); ++i)
251    Sources[i]->ReadReferencedSelectors(Sels);
252}
253
254void MultiplexExternalSemaSource::ReadWeakUndeclaredIdentifiers(
255                   SmallVectorImpl<std::pair<IdentifierInfo*, WeakInfo> > &WI) {
256  for(size_t i = 0; i < Sources.size(); ++i)
257    Sources[i]->ReadWeakUndeclaredIdentifiers(WI);
258}
259
260void MultiplexExternalSemaSource::ReadUsedVTables(
261                                  SmallVectorImpl<ExternalVTableUse> &VTables) {
262  for(size_t i = 0; i < Sources.size(); ++i)
263    Sources[i]->ReadUsedVTables(VTables);
264}
265
266void MultiplexExternalSemaSource::ReadPendingInstantiations(
267                                           SmallVectorImpl<std::pair<ValueDecl*,
268                                                   SourceLocation> > &Pending) {
269  for(size_t i = 0; i < Sources.size(); ++i)
270    Sources[i]->ReadPendingInstantiations(Pending);
271}
272