1 //===--- MultiplexExternalSemaSource.cpp ---------------------------------===//
3 // The LLVM Compiler Infrastructure
5 // This file is distributed under the University of Illinois Open Source
6 // License. See LICENSE.TXT for details.
8 //===----------------------------------------------------------------------===//
10 // This file implements the event dispatching to the subscribed clients.
12 //===----------------------------------------------------------------------===//
13 #include "clang/Sema/MultiplexExternalSemaSource.h"
15 #include "clang/AST/DeclContextInternals.h"
16 #include "clang/Sema/Lookup.h"
18 using namespace clang;
20 ///\brief Constructs a new multiplexing external sema source and appends the
21 /// given element to it.
23 ///\param[in] source - An ExternalSemaSource.
25 MultiplexExternalSemaSource::MultiplexExternalSemaSource(ExternalSemaSource &s1,
26 ExternalSemaSource &s2){
27 Sources.push_back(&s1);
28 Sources.push_back(&s2);
31 // pin the vtable here.
32 MultiplexExternalSemaSource::~MultiplexExternalSemaSource() {}
34 ///\brief Appends new source to the source list.
36 ///\param[in] source - An ExternalSemaSource.
38 void MultiplexExternalSemaSource::addSource(ExternalSemaSource &source) {
39 Sources.push_back(&source);
42 //===----------------------------------------------------------------------===//
44 //===----------------------------------------------------------------------===//
46 Decl *MultiplexExternalSemaSource::GetExternalDecl(uint32_t ID) {
47 for(size_t i = 0; i < Sources.size(); ++i)
48 if (Decl *Result = Sources[i]->GetExternalDecl(ID))
53 Selector MultiplexExternalSemaSource::GetExternalSelector(uint32_t ID) {
55 for(size_t i = 0; i < Sources.size(); ++i) {
56 Sel = Sources[i]->GetExternalSelector(ID);
63 uint32_t MultiplexExternalSemaSource::GetNumExternalSelectors() {
65 for(size_t i = 0; i < Sources.size(); ++i)
66 total += Sources[i]->GetNumExternalSelectors();
70 Stmt *MultiplexExternalSemaSource::GetExternalDeclStmt(uint64_t Offset) {
71 for(size_t i = 0; i < Sources.size(); ++i)
72 if (Stmt *Result = Sources[i]->GetExternalDeclStmt(Offset))
77 CXXBaseSpecifier *MultiplexExternalSemaSource::GetExternalCXXBaseSpecifiers(
79 for(size_t i = 0; i < Sources.size(); ++i)
80 if (CXXBaseSpecifier *R = Sources[i]->GetExternalCXXBaseSpecifiers(Offset))
85 DeclContextLookupResult MultiplexExternalSemaSource::
86 FindExternalVisibleDeclsByName(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);
97 return DeclsFound.getLookupResult();
100 void MultiplexExternalSemaSource::completeVisibleDeclsMap(const DeclContext *DC){
101 for(size_t i = 0; i < Sources.size(); ++i)
102 Sources[i]->completeVisibleDeclsMap(DC);
105 ExternalLoadResult MultiplexExternalSemaSource::
106 FindExternalLexicalDecls(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);
116 void MultiplexExternalSemaSource::FindFileRegionDecls(FileID File,
119 SmallVectorImpl<Decl *> &Decls){
120 for(size_t i = 0; i < Sources.size(); ++i)
121 Sources[i]->FindFileRegionDecls(File, Offset, Length, Decls);
124 void MultiplexExternalSemaSource::CompleteType(TagDecl *Tag) {
125 for(size_t i = 0; i < Sources.size(); ++i)
126 Sources[i]->CompleteType(Tag);
129 void MultiplexExternalSemaSource::CompleteType(ObjCInterfaceDecl *Class) {
130 for(size_t i = 0; i < Sources.size(); ++i)
131 Sources[i]->CompleteType(Class);
134 void MultiplexExternalSemaSource::ReadComments() {
135 for(size_t i = 0; i < Sources.size(); ++i)
136 Sources[i]->ReadComments();
139 void MultiplexExternalSemaSource::StartedDeserializing() {
140 for(size_t i = 0; i < Sources.size(); ++i)
141 Sources[i]->StartedDeserializing();
144 void MultiplexExternalSemaSource::FinishedDeserializing() {
145 for(size_t i = 0; i < Sources.size(); ++i)
146 Sources[i]->FinishedDeserializing();
149 void MultiplexExternalSemaSource::StartTranslationUnit(ASTConsumer *Consumer) {
150 for(size_t i = 0; i < Sources.size(); ++i)
151 Sources[i]->StartTranslationUnit(Consumer);
154 void MultiplexExternalSemaSource::PrintStats() {
155 for(size_t i = 0; i < Sources.size(); ++i)
156 Sources[i]->PrintStats();
159 bool MultiplexExternalSemaSource::layoutRecordType(const RecordDecl *Record,
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))
172 void MultiplexExternalSemaSource::
173 getMemoryBufferSizes(MemoryBufferSizes &sizes) const {
174 for(size_t i = 0; i < Sources.size(); ++i)
175 Sources[i]->getMemoryBufferSizes(sizes);
179 //===----------------------------------------------------------------------===//
180 // ExternalSemaSource.
181 //===----------------------------------------------------------------------===//
184 void MultiplexExternalSemaSource::InitializeSema(Sema &S) {
185 for(size_t i = 0; i < Sources.size(); ++i)
186 Sources[i]->InitializeSema(S);
189 void MultiplexExternalSemaSource::ForgetSema() {
190 for(size_t i = 0; i < Sources.size(); ++i)
191 Sources[i]->ForgetSema();
194 void MultiplexExternalSemaSource::ReadMethodPool(Selector Sel) {
195 for(size_t i = 0; i < Sources.size(); ++i)
196 Sources[i]->ReadMethodPool(Sel);
199 void MultiplexExternalSemaSource::ReadKnownNamespaces(
200 SmallVectorImpl<NamespaceDecl*> &Namespaces){
201 for(size_t i = 0; i < Sources.size(); ++i)
202 Sources[i]->ReadKnownNamespaces(Namespaces);
205 bool MultiplexExternalSemaSource::LookupUnqualified(LookupResult &R, Scope *S){
206 for(size_t i = 0; i < Sources.size(); ++i)
207 Sources[i]->LookupUnqualified(R, S);
212 void MultiplexExternalSemaSource::ReadTentativeDefinitions(
213 SmallVectorImpl<VarDecl*> &TentativeDefs) {
214 for(size_t i = 0; i < Sources.size(); ++i)
215 Sources[i]->ReadTentativeDefinitions(TentativeDefs);
218 void MultiplexExternalSemaSource::ReadUnusedFileScopedDecls(
219 SmallVectorImpl<const DeclaratorDecl*> &Decls) {
220 for(size_t i = 0; i < Sources.size(); ++i)
221 Sources[i]->ReadUnusedFileScopedDecls(Decls);
224 void MultiplexExternalSemaSource::ReadDelegatingConstructors(
225 SmallVectorImpl<CXXConstructorDecl*> &Decls) {
226 for(size_t i = 0; i < Sources.size(); ++i)
227 Sources[i]->ReadDelegatingConstructors(Decls);
230 void MultiplexExternalSemaSource::ReadExtVectorDecls(
231 SmallVectorImpl<TypedefNameDecl*> &Decls) {
232 for(size_t i = 0; i < Sources.size(); ++i)
233 Sources[i]->ReadExtVectorDecls(Decls);
236 void MultiplexExternalSemaSource::ReadDynamicClasses(
237 SmallVectorImpl<CXXRecordDecl*> &Decls) {
238 for(size_t i = 0; i < Sources.size(); ++i)
239 Sources[i]->ReadDynamicClasses(Decls);
242 void MultiplexExternalSemaSource::ReadLocallyScopedExternalDecls(
243 SmallVectorImpl<NamedDecl*> &Decls) {
244 for(size_t i = 0; i < Sources.size(); ++i)
245 Sources[i]->ReadLocallyScopedExternalDecls(Decls);
248 void MultiplexExternalSemaSource::ReadReferencedSelectors(
249 SmallVectorImpl<std::pair<Selector, SourceLocation> > &Sels) {
250 for(size_t i = 0; i < Sources.size(); ++i)
251 Sources[i]->ReadReferencedSelectors(Sels);
254 void MultiplexExternalSemaSource::ReadWeakUndeclaredIdentifiers(
255 SmallVectorImpl<std::pair<IdentifierInfo*, WeakInfo> > &WI) {
256 for(size_t i = 0; i < Sources.size(); ++i)
257 Sources[i]->ReadWeakUndeclaredIdentifiers(WI);
260 void MultiplexExternalSemaSource::ReadUsedVTables(
261 SmallVectorImpl<ExternalVTableUse> &VTables) {
262 for(size_t i = 0; i < Sources.size(); ++i)
263 Sources[i]->ReadUsedVTables(VTables);
266 void 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);