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