blob: f930fb348a25159f5206437352d42828d61885dd [file] [log] [blame]
Axel Naumann0ec56b72012-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"
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}