1243791Sdim//===--- MultiplexExternalSemaSource.cpp ---------------------------------===// 2243791Sdim// 3243791Sdim// The LLVM Compiler Infrastructure 4243791Sdim// 5243791Sdim// This file is distributed under the University of Illinois Open Source 6243791Sdim// License. See LICENSE.TXT for details. 7243791Sdim// 8243791Sdim//===----------------------------------------------------------------------===// 9243791Sdim// 10243791Sdim// This file implements the event dispatching to the subscribed clients. 11243791Sdim// 12243791Sdim//===----------------------------------------------------------------------===// 13243791Sdim#include "clang/Sema/MultiplexExternalSemaSource.h" 14243791Sdim#include "clang/AST/DeclContextInternals.h" 15243791Sdim#include "clang/Sema/Lookup.h" 16243791Sdim 17243791Sdimusing namespace clang; 18243791Sdim 19243791Sdim///\brief Constructs a new multiplexing external sema source and appends the 20243791Sdim/// given element to it. 21243791Sdim/// 22243791Sdim///\param[in] source - An ExternalSemaSource. 23243791Sdim/// 24243791SdimMultiplexExternalSemaSource::MultiplexExternalSemaSource(ExternalSemaSource &s1, 25243791Sdim ExternalSemaSource &s2){ 26243791Sdim Sources.push_back(&s1); 27243791Sdim Sources.push_back(&s2); 28243791Sdim} 29243791Sdim 30243791Sdim// pin the vtable here. 31243791SdimMultiplexExternalSemaSource::~MultiplexExternalSemaSource() {} 32243791Sdim 33243791Sdim///\brief Appends new source to the source list. 34243791Sdim/// 35243791Sdim///\param[in] source - An ExternalSemaSource. 36243791Sdim/// 37243791Sdimvoid MultiplexExternalSemaSource::addSource(ExternalSemaSource &source) { 38243791Sdim Sources.push_back(&source); 39243791Sdim} 40243791Sdim 41243791Sdim//===----------------------------------------------------------------------===// 42243791Sdim// ExternalASTSource. 43243791Sdim//===----------------------------------------------------------------------===// 44243791Sdim 45243791SdimDecl *MultiplexExternalSemaSource::GetExternalDecl(uint32_t ID) { 46243791Sdim for(size_t i = 0; i < Sources.size(); ++i) 47243791Sdim if (Decl *Result = Sources[i]->GetExternalDecl(ID)) 48243791Sdim return Result; 49243791Sdim return 0; 50243791Sdim} 51243791Sdim 52243791SdimSelector MultiplexExternalSemaSource::GetExternalSelector(uint32_t ID) { 53243791Sdim Selector Sel; 54243791Sdim for(size_t i = 0; i < Sources.size(); ++i) { 55243791Sdim Sel = Sources[i]->GetExternalSelector(ID); 56243791Sdim if (!Sel.isNull()) 57243791Sdim return Sel; 58243791Sdim } 59243791Sdim return Sel; 60243791Sdim} 61243791Sdim 62243791Sdimuint32_t MultiplexExternalSemaSource::GetNumExternalSelectors() { 63243791Sdim uint32_t total = 0; 64243791Sdim for(size_t i = 0; i < Sources.size(); ++i) 65243791Sdim total += Sources[i]->GetNumExternalSelectors(); 66243791Sdim return total; 67243791Sdim} 68243791Sdim 69243791SdimStmt *MultiplexExternalSemaSource::GetExternalDeclStmt(uint64_t Offset) { 70243791Sdim for(size_t i = 0; i < Sources.size(); ++i) 71243791Sdim if (Stmt *Result = Sources[i]->GetExternalDeclStmt(Offset)) 72243791Sdim return Result; 73243791Sdim return 0; 74243791Sdim} 75243791Sdim 76243791SdimCXXBaseSpecifier *MultiplexExternalSemaSource::GetExternalCXXBaseSpecifiers( 77243791Sdim uint64_t Offset){ 78243791Sdim for(size_t i = 0; i < Sources.size(); ++i) 79243791Sdim if (CXXBaseSpecifier *R = Sources[i]->GetExternalCXXBaseSpecifiers(Offset)) 80243791Sdim return R; 81243791Sdim return 0; 82243791Sdim} 83243791Sdim 84252723Sdimbool MultiplexExternalSemaSource:: 85243791SdimFindExternalVisibleDeclsByName(const DeclContext *DC, DeclarationName Name) { 86252723Sdim bool AnyDeclsFound = false; 87252723Sdim for (size_t i = 0; i < Sources.size(); ++i) 88252723Sdim AnyDeclsFound |= Sources[i]->FindExternalVisibleDeclsByName(DC, Name); 89252723Sdim return AnyDeclsFound; 90243791Sdim} 91243791Sdim 92243791Sdimvoid MultiplexExternalSemaSource::completeVisibleDeclsMap(const DeclContext *DC){ 93243791Sdim for(size_t i = 0; i < Sources.size(); ++i) 94243791Sdim Sources[i]->completeVisibleDeclsMap(DC); 95243791Sdim} 96243791Sdim 97243791SdimExternalLoadResult MultiplexExternalSemaSource:: 98243791SdimFindExternalLexicalDecls(const DeclContext *DC, 99243791Sdim bool (*isKindWeWant)(Decl::Kind), 100243791Sdim SmallVectorImpl<Decl*> &Result) { 101243791Sdim for(size_t i = 0; i < Sources.size(); ++i) 102243791Sdim // FIXME: The semantics of the return result is unclear to me... 103243791Sdim Sources[i]->FindExternalLexicalDecls(DC, isKindWeWant, Result); 104243791Sdim 105243791Sdim return ELR_Success; 106243791Sdim} 107243791Sdim 108243791Sdimvoid MultiplexExternalSemaSource::FindFileRegionDecls(FileID File, 109243791Sdim unsigned Offset, 110243791Sdim unsigned Length, 111243791Sdim SmallVectorImpl<Decl *> &Decls){ 112243791Sdim for(size_t i = 0; i < Sources.size(); ++i) 113243791Sdim Sources[i]->FindFileRegionDecls(File, Offset, Length, Decls); 114243791Sdim} 115243791Sdim 116243791Sdimvoid MultiplexExternalSemaSource::CompleteType(TagDecl *Tag) { 117243791Sdim for(size_t i = 0; i < Sources.size(); ++i) 118243791Sdim Sources[i]->CompleteType(Tag); 119243791Sdim} 120243791Sdim 121243791Sdimvoid MultiplexExternalSemaSource::CompleteType(ObjCInterfaceDecl *Class) { 122243791Sdim for(size_t i = 0; i < Sources.size(); ++i) 123243791Sdim Sources[i]->CompleteType(Class); 124243791Sdim} 125243791Sdim 126243791Sdimvoid MultiplexExternalSemaSource::ReadComments() { 127243791Sdim for(size_t i = 0; i < Sources.size(); ++i) 128243791Sdim Sources[i]->ReadComments(); 129243791Sdim} 130243791Sdim 131243791Sdimvoid MultiplexExternalSemaSource::StartedDeserializing() { 132243791Sdim for(size_t i = 0; i < Sources.size(); ++i) 133243791Sdim Sources[i]->StartedDeserializing(); 134243791Sdim} 135243791Sdim 136243791Sdimvoid MultiplexExternalSemaSource::FinishedDeserializing() { 137243791Sdim for(size_t i = 0; i < Sources.size(); ++i) 138243791Sdim Sources[i]->FinishedDeserializing(); 139243791Sdim} 140243791Sdim 141243791Sdimvoid MultiplexExternalSemaSource::StartTranslationUnit(ASTConsumer *Consumer) { 142243791Sdim for(size_t i = 0; i < Sources.size(); ++i) 143243791Sdim Sources[i]->StartTranslationUnit(Consumer); 144243791Sdim} 145243791Sdim 146243791Sdimvoid MultiplexExternalSemaSource::PrintStats() { 147243791Sdim for(size_t i = 0; i < Sources.size(); ++i) 148243791Sdim Sources[i]->PrintStats(); 149243791Sdim} 150243791Sdim 151243791Sdimbool MultiplexExternalSemaSource::layoutRecordType(const RecordDecl *Record, 152243791Sdim uint64_t &Size, 153243791Sdim uint64_t &Alignment, 154243791Sdim llvm::DenseMap<const FieldDecl *, uint64_t> &FieldOffsets, 155243791Sdim llvm::DenseMap<const CXXRecordDecl *, CharUnits> &BaseOffsets, 156243791Sdim llvm::DenseMap<const CXXRecordDecl *, CharUnits> &VirtualBaseOffsets){ 157243791Sdim for(size_t i = 0; i < Sources.size(); ++i) 158243791Sdim if (Sources[i]->layoutRecordType(Record, Size, Alignment, FieldOffsets, 159243791Sdim BaseOffsets, VirtualBaseOffsets)) 160243791Sdim return true; 161243791Sdim return false; 162243791Sdim} 163243791Sdim 164243791Sdimvoid MultiplexExternalSemaSource:: 165243791SdimgetMemoryBufferSizes(MemoryBufferSizes &sizes) const { 166243791Sdim for(size_t i = 0; i < Sources.size(); ++i) 167243791Sdim Sources[i]->getMemoryBufferSizes(sizes); 168243791Sdim 169243791Sdim} 170243791Sdim 171243791Sdim//===----------------------------------------------------------------------===// 172243791Sdim// ExternalSemaSource. 173243791Sdim//===----------------------------------------------------------------------===// 174243791Sdim 175243791Sdim 176243791Sdimvoid MultiplexExternalSemaSource::InitializeSema(Sema &S) { 177243791Sdim for(size_t i = 0; i < Sources.size(); ++i) 178243791Sdim Sources[i]->InitializeSema(S); 179243791Sdim} 180243791Sdim 181243791Sdimvoid MultiplexExternalSemaSource::ForgetSema() { 182243791Sdim for(size_t i = 0; i < Sources.size(); ++i) 183243791Sdim Sources[i]->ForgetSema(); 184243791Sdim} 185243791Sdim 186243791Sdimvoid MultiplexExternalSemaSource::ReadMethodPool(Selector Sel) { 187243791Sdim for(size_t i = 0; i < Sources.size(); ++i) 188243791Sdim Sources[i]->ReadMethodPool(Sel); 189243791Sdim} 190243791Sdim 191243791Sdimvoid MultiplexExternalSemaSource::ReadKnownNamespaces( 192243791Sdim SmallVectorImpl<NamespaceDecl*> &Namespaces){ 193243791Sdim for(size_t i = 0; i < Sources.size(); ++i) 194243791Sdim Sources[i]->ReadKnownNamespaces(Namespaces); 195243791Sdim} 196252723Sdim 197252723Sdimvoid MultiplexExternalSemaSource::ReadUndefinedButUsed( 198252723Sdim llvm::DenseMap<NamedDecl*, SourceLocation> &Undefined){ 199252723Sdim for(size_t i = 0; i < Sources.size(); ++i) 200252723Sdim Sources[i]->ReadUndefinedButUsed(Undefined); 201252723Sdim} 202243791Sdim 203243791Sdimbool MultiplexExternalSemaSource::LookupUnqualified(LookupResult &R, Scope *S){ 204243791Sdim for(size_t i = 0; i < Sources.size(); ++i) 205243791Sdim Sources[i]->LookupUnqualified(R, S); 206243791Sdim 207243791Sdim return !R.empty(); 208243791Sdim} 209243791Sdim 210243791Sdimvoid MultiplexExternalSemaSource::ReadTentativeDefinitions( 211243791Sdim SmallVectorImpl<VarDecl*> &TentativeDefs) { 212243791Sdim for(size_t i = 0; i < Sources.size(); ++i) 213243791Sdim Sources[i]->ReadTentativeDefinitions(TentativeDefs); 214243791Sdim} 215243791Sdim 216243791Sdimvoid MultiplexExternalSemaSource::ReadUnusedFileScopedDecls( 217243791Sdim SmallVectorImpl<const DeclaratorDecl*> &Decls) { 218243791Sdim for(size_t i = 0; i < Sources.size(); ++i) 219243791Sdim Sources[i]->ReadUnusedFileScopedDecls(Decls); 220243791Sdim} 221243791Sdim 222243791Sdimvoid MultiplexExternalSemaSource::ReadDelegatingConstructors( 223243791Sdim SmallVectorImpl<CXXConstructorDecl*> &Decls) { 224243791Sdim for(size_t i = 0; i < Sources.size(); ++i) 225243791Sdim Sources[i]->ReadDelegatingConstructors(Decls); 226243791Sdim} 227243791Sdim 228243791Sdimvoid MultiplexExternalSemaSource::ReadExtVectorDecls( 229243791Sdim SmallVectorImpl<TypedefNameDecl*> &Decls) { 230243791Sdim for(size_t i = 0; i < Sources.size(); ++i) 231243791Sdim Sources[i]->ReadExtVectorDecls(Decls); 232243791Sdim} 233243791Sdim 234243791Sdimvoid MultiplexExternalSemaSource::ReadDynamicClasses( 235243791Sdim SmallVectorImpl<CXXRecordDecl*> &Decls) { 236243791Sdim for(size_t i = 0; i < Sources.size(); ++i) 237243791Sdim Sources[i]->ReadDynamicClasses(Decls); 238243791Sdim} 239243791Sdim 240252723Sdimvoid MultiplexExternalSemaSource::ReadLocallyScopedExternCDecls( 241243791Sdim SmallVectorImpl<NamedDecl*> &Decls) { 242243791Sdim for(size_t i = 0; i < Sources.size(); ++i) 243252723Sdim Sources[i]->ReadLocallyScopedExternCDecls(Decls); 244243791Sdim} 245243791Sdim 246243791Sdimvoid MultiplexExternalSemaSource::ReadReferencedSelectors( 247243791Sdim SmallVectorImpl<std::pair<Selector, SourceLocation> > &Sels) { 248243791Sdim for(size_t i = 0; i < Sources.size(); ++i) 249243791Sdim Sources[i]->ReadReferencedSelectors(Sels); 250243791Sdim} 251243791Sdim 252243791Sdimvoid MultiplexExternalSemaSource::ReadWeakUndeclaredIdentifiers( 253243791Sdim SmallVectorImpl<std::pair<IdentifierInfo*, WeakInfo> > &WI) { 254243791Sdim for(size_t i = 0; i < Sources.size(); ++i) 255243791Sdim Sources[i]->ReadWeakUndeclaredIdentifiers(WI); 256243791Sdim} 257243791Sdim 258243791Sdimvoid MultiplexExternalSemaSource::ReadUsedVTables( 259243791Sdim SmallVectorImpl<ExternalVTableUse> &VTables) { 260243791Sdim for(size_t i = 0; i < Sources.size(); ++i) 261243791Sdim Sources[i]->ReadUsedVTables(VTables); 262243791Sdim} 263243791Sdim 264243791Sdimvoid MultiplexExternalSemaSource::ReadPendingInstantiations( 265243791Sdim SmallVectorImpl<std::pair<ValueDecl*, 266243791Sdim SourceLocation> > &Pending) { 267243791Sdim for(size_t i = 0; i < Sources.size(); ++i) 268243791Sdim Sources[i]->ReadPendingInstantiations(Pending); 269243791Sdim} 270263509Sdim 271263509Sdimvoid MultiplexExternalSemaSource::ReadLateParsedTemplates( 272263509Sdim llvm::DenseMap<const FunctionDecl *, LateParsedTemplate *> &LPTMap) { 273263509Sdim for (size_t i = 0; i < Sources.size(); ++i) 274263509Sdim Sources[i]->ReadLateParsedTemplates(LPTMap); 275263509Sdim} 276263509Sdim 277263509SdimTypoCorrection MultiplexExternalSemaSource::CorrectTypo( 278263509Sdim const DeclarationNameInfo &Typo, 279263509Sdim int LookupKind, Scope *S, CXXScopeSpec *SS, 280263509Sdim CorrectionCandidateCallback &CCC, 281263509Sdim DeclContext *MemberContext, 282263509Sdim bool EnteringContext, 283263509Sdim const ObjCObjectPointerType *OPT) { 284263509Sdim for (size_t I = 0, E = Sources.size(); I < E; ++I) { 285263509Sdim if (TypoCorrection C = Sources[I]->CorrectTypo(Typo, LookupKind, S, SS, CCC, 286263509Sdim MemberContext, 287263509Sdim EnteringContext, OPT)) 288263509Sdim return C; 289263509Sdim } 290263509Sdim return TypoCorrection(); 291263509Sdim} 292263509Sdim 293263509Sdimbool MultiplexExternalSemaSource::MaybeDiagnoseMissingCompleteType( 294263509Sdim SourceLocation Loc, QualType T) { 295263509Sdim for (size_t I = 0, E = Sources.size(); I < E; ++I) { 296263509Sdim if (Sources[I]->MaybeDiagnoseMissingCompleteType(Loc, T)) 297263509Sdim return true; 298263509Sdim } 299263509Sdim return false; 300263509Sdim} 301