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"
14 #include "clang/AST/DeclContextInternals.h"
15 #include "clang/Sema/Lookup.h"
17 using namespace clang;
19 ///\brief Constructs a new multiplexing external sema source and appends the
20 /// given element to it.
22 ///\param[in] source - An ExternalSemaSource.
24 MultiplexExternalSemaSource::MultiplexExternalSemaSource(ExternalSemaSource &s1,
25 ExternalSemaSource &s2){
26 Sources.push_back(&s1);
27 Sources.push_back(&s2);
30 // pin the vtable here.
31 MultiplexExternalSemaSource::~MultiplexExternalSemaSource() {}
33 ///\brief Appends new source to the source list.
35 ///\param[in] source - An ExternalSemaSource.
37 void MultiplexExternalSemaSource::addSource(ExternalSemaSource &source) {
38 Sources.push_back(&source);
41 //===----------------------------------------------------------------------===//
43 //===----------------------------------------------------------------------===//
45 Decl *MultiplexExternalSemaSource::GetExternalDecl(uint32_t ID) {
46 for(size_t i = 0; i < Sources.size(); ++i)
47 if (Decl *Result = Sources[i]->GetExternalDecl(ID))
52 Selector MultiplexExternalSemaSource::GetExternalSelector(uint32_t ID) {
54 for(size_t i = 0; i < Sources.size(); ++i) {
55 Sel = Sources[i]->GetExternalSelector(ID);
62 uint32_t MultiplexExternalSemaSource::GetNumExternalSelectors() {
64 for(size_t i = 0; i < Sources.size(); ++i)
65 total += Sources[i]->GetNumExternalSelectors();
69 Stmt *MultiplexExternalSemaSource::GetExternalDeclStmt(uint64_t Offset) {
70 for(size_t i = 0; i < Sources.size(); ++i)
71 if (Stmt *Result = Sources[i]->GetExternalDeclStmt(Offset))
76 CXXBaseSpecifier *MultiplexExternalSemaSource::GetExternalCXXBaseSpecifiers(
78 for(size_t i = 0; i < Sources.size(); ++i)
79 if (CXXBaseSpecifier *R = Sources[i]->GetExternalCXXBaseSpecifiers(Offset))
84 bool MultiplexExternalSemaSource::
85 FindExternalVisibleDeclsByName(const DeclContext *DC, DeclarationName Name) {
86 bool AnyDeclsFound = false;
87 for (size_t i = 0; i < Sources.size(); ++i)
88 AnyDeclsFound |= Sources[i]->FindExternalVisibleDeclsByName(DC, Name);
92 void MultiplexExternalSemaSource::completeVisibleDeclsMap(const DeclContext *DC){
93 for(size_t i = 0; i < Sources.size(); ++i)
94 Sources[i]->completeVisibleDeclsMap(DC);
97 ExternalLoadResult MultiplexExternalSemaSource::
98 FindExternalLexicalDecls(const DeclContext *DC,
99 bool (*isKindWeWant)(Decl::Kind),
100 SmallVectorImpl<Decl*> &Result) {
101 for(size_t i = 0; i < Sources.size(); ++i)
102 // FIXME: The semantics of the return result is unclear to me...
103 Sources[i]->FindExternalLexicalDecls(DC, isKindWeWant, Result);
108 void MultiplexExternalSemaSource::FindFileRegionDecls(FileID File,
111 SmallVectorImpl<Decl *> &Decls){
112 for(size_t i = 0; i < Sources.size(); ++i)
113 Sources[i]->FindFileRegionDecls(File, Offset, Length, Decls);
116 void MultiplexExternalSemaSource::CompleteType(TagDecl *Tag) {
117 for(size_t i = 0; i < Sources.size(); ++i)
118 Sources[i]->CompleteType(Tag);
121 void MultiplexExternalSemaSource::CompleteType(ObjCInterfaceDecl *Class) {
122 for(size_t i = 0; i < Sources.size(); ++i)
123 Sources[i]->CompleteType(Class);
126 void MultiplexExternalSemaSource::ReadComments() {
127 for(size_t i = 0; i < Sources.size(); ++i)
128 Sources[i]->ReadComments();
131 void MultiplexExternalSemaSource::StartedDeserializing() {
132 for(size_t i = 0; i < Sources.size(); ++i)
133 Sources[i]->StartedDeserializing();
136 void MultiplexExternalSemaSource::FinishedDeserializing() {
137 for(size_t i = 0; i < Sources.size(); ++i)
138 Sources[i]->FinishedDeserializing();
141 void MultiplexExternalSemaSource::StartTranslationUnit(ASTConsumer *Consumer) {
142 for(size_t i = 0; i < Sources.size(); ++i)
143 Sources[i]->StartTranslationUnit(Consumer);
146 void MultiplexExternalSemaSource::PrintStats() {
147 for(size_t i = 0; i < Sources.size(); ++i)
148 Sources[i]->PrintStats();
151 bool MultiplexExternalSemaSource::layoutRecordType(const RecordDecl *Record,
154 llvm::DenseMap<const FieldDecl *, uint64_t> &FieldOffsets,
155 llvm::DenseMap<const CXXRecordDecl *, CharUnits> &BaseOffsets,
156 llvm::DenseMap<const CXXRecordDecl *, CharUnits> &VirtualBaseOffsets){
157 for(size_t i = 0; i < Sources.size(); ++i)
158 if (Sources[i]->layoutRecordType(Record, Size, Alignment, FieldOffsets,
159 BaseOffsets, VirtualBaseOffsets))
164 void MultiplexExternalSemaSource::
165 getMemoryBufferSizes(MemoryBufferSizes &sizes) const {
166 for(size_t i = 0; i < Sources.size(); ++i)
167 Sources[i]->getMemoryBufferSizes(sizes);
171 //===----------------------------------------------------------------------===//
172 // ExternalSemaSource.
173 //===----------------------------------------------------------------------===//
176 void MultiplexExternalSemaSource::InitializeSema(Sema &S) {
177 for(size_t i = 0; i < Sources.size(); ++i)
178 Sources[i]->InitializeSema(S);
181 void MultiplexExternalSemaSource::ForgetSema() {
182 for(size_t i = 0; i < Sources.size(); ++i)
183 Sources[i]->ForgetSema();
186 void MultiplexExternalSemaSource::ReadMethodPool(Selector Sel) {
187 for(size_t i = 0; i < Sources.size(); ++i)
188 Sources[i]->ReadMethodPool(Sel);
191 void MultiplexExternalSemaSource::ReadKnownNamespaces(
192 SmallVectorImpl<NamespaceDecl*> &Namespaces){
193 for(size_t i = 0; i < Sources.size(); ++i)
194 Sources[i]->ReadKnownNamespaces(Namespaces);
197 void MultiplexExternalSemaSource::ReadUndefinedButUsed(
198 llvm::DenseMap<NamedDecl*, SourceLocation> &Undefined){
199 for(size_t i = 0; i < Sources.size(); ++i)
200 Sources[i]->ReadUndefinedButUsed(Undefined);
203 bool MultiplexExternalSemaSource::LookupUnqualified(LookupResult &R, Scope *S){
204 for(size_t i = 0; i < Sources.size(); ++i)
205 Sources[i]->LookupUnqualified(R, S);
210 void MultiplexExternalSemaSource::ReadTentativeDefinitions(
211 SmallVectorImpl<VarDecl*> &TentativeDefs) {
212 for(size_t i = 0; i < Sources.size(); ++i)
213 Sources[i]->ReadTentativeDefinitions(TentativeDefs);
216 void MultiplexExternalSemaSource::ReadUnusedFileScopedDecls(
217 SmallVectorImpl<const DeclaratorDecl*> &Decls) {
218 for(size_t i = 0; i < Sources.size(); ++i)
219 Sources[i]->ReadUnusedFileScopedDecls(Decls);
222 void MultiplexExternalSemaSource::ReadDelegatingConstructors(
223 SmallVectorImpl<CXXConstructorDecl*> &Decls) {
224 for(size_t i = 0; i < Sources.size(); ++i)
225 Sources[i]->ReadDelegatingConstructors(Decls);
228 void MultiplexExternalSemaSource::ReadExtVectorDecls(
229 SmallVectorImpl<TypedefNameDecl*> &Decls) {
230 for(size_t i = 0; i < Sources.size(); ++i)
231 Sources[i]->ReadExtVectorDecls(Decls);
234 void MultiplexExternalSemaSource::ReadDynamicClasses(
235 SmallVectorImpl<CXXRecordDecl*> &Decls) {
236 for(size_t i = 0; i < Sources.size(); ++i)
237 Sources[i]->ReadDynamicClasses(Decls);
240 void MultiplexExternalSemaSource::ReadLocallyScopedExternCDecls(
241 SmallVectorImpl<NamedDecl*> &Decls) {
242 for(size_t i = 0; i < Sources.size(); ++i)
243 Sources[i]->ReadLocallyScopedExternCDecls(Decls);
246 void MultiplexExternalSemaSource::ReadReferencedSelectors(
247 SmallVectorImpl<std::pair<Selector, SourceLocation> > &Sels) {
248 for(size_t i = 0; i < Sources.size(); ++i)
249 Sources[i]->ReadReferencedSelectors(Sels);
252 void MultiplexExternalSemaSource::ReadWeakUndeclaredIdentifiers(
253 SmallVectorImpl<std::pair<IdentifierInfo*, WeakInfo> > &WI) {
254 for(size_t i = 0; i < Sources.size(); ++i)
255 Sources[i]->ReadWeakUndeclaredIdentifiers(WI);
258 void MultiplexExternalSemaSource::ReadUsedVTables(
259 SmallVectorImpl<ExternalVTableUse> &VTables) {
260 for(size_t i = 0; i < Sources.size(); ++i)
261 Sources[i]->ReadUsedVTables(VTables);
264 void MultiplexExternalSemaSource::ReadPendingInstantiations(
265 SmallVectorImpl<std::pair<ValueDecl*,
266 SourceLocation> > &Pending) {
267 for(size_t i = 0; i < Sources.size(); ++i)
268 Sources[i]->ReadPendingInstantiations(Pending);