MultiplexExternalSemaSource.cpp revision 309124
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; 49276479Sdim return nullptr; 50243791Sdim} 51243791Sdim 52276479Sdimvoid MultiplexExternalSemaSource::CompleteRedeclChain(const Decl *D) { 53276479Sdim for (size_t i = 0; i < Sources.size(); ++i) 54276479Sdim Sources[i]->CompleteRedeclChain(D); 55276479Sdim} 56276479Sdim 57243791SdimSelector MultiplexExternalSemaSource::GetExternalSelector(uint32_t ID) { 58243791Sdim Selector Sel; 59243791Sdim for(size_t i = 0; i < Sources.size(); ++i) { 60243791Sdim Sel = Sources[i]->GetExternalSelector(ID); 61243791Sdim if (!Sel.isNull()) 62243791Sdim return Sel; 63243791Sdim } 64243791Sdim return Sel; 65243791Sdim} 66243791Sdim 67243791Sdimuint32_t MultiplexExternalSemaSource::GetNumExternalSelectors() { 68243791Sdim uint32_t total = 0; 69243791Sdim for(size_t i = 0; i < Sources.size(); ++i) 70243791Sdim total += Sources[i]->GetNumExternalSelectors(); 71243791Sdim return total; 72243791Sdim} 73243791Sdim 74243791SdimStmt *MultiplexExternalSemaSource::GetExternalDeclStmt(uint64_t Offset) { 75243791Sdim for(size_t i = 0; i < Sources.size(); ++i) 76243791Sdim if (Stmt *Result = Sources[i]->GetExternalDeclStmt(Offset)) 77243791Sdim return Result; 78276479Sdim return nullptr; 79243791Sdim} 80243791Sdim 81243791SdimCXXBaseSpecifier *MultiplexExternalSemaSource::GetExternalCXXBaseSpecifiers( 82243791Sdim uint64_t Offset){ 83243791Sdim for(size_t i = 0; i < Sources.size(); ++i) 84243791Sdim if (CXXBaseSpecifier *R = Sources[i]->GetExternalCXXBaseSpecifiers(Offset)) 85243791Sdim return R; 86276479Sdim return nullptr; 87243791Sdim} 88243791Sdim 89288943SdimCXXCtorInitializer ** 90288943SdimMultiplexExternalSemaSource::GetExternalCXXCtorInitializers(uint64_t Offset) { 91288943Sdim for (auto *S : Sources) 92288943Sdim if (auto *R = S->GetExternalCXXCtorInitializers(Offset)) 93288943Sdim return R; 94288943Sdim return nullptr; 95288943Sdim} 96288943Sdim 97249423Sdimbool MultiplexExternalSemaSource:: 98243791SdimFindExternalVisibleDeclsByName(const DeclContext *DC, DeclarationName Name) { 99249423Sdim bool AnyDeclsFound = false; 100249423Sdim for (size_t i = 0; i < Sources.size(); ++i) 101249423Sdim AnyDeclsFound |= Sources[i]->FindExternalVisibleDeclsByName(DC, Name); 102249423Sdim return AnyDeclsFound; 103243791Sdim} 104243791Sdim 105243791Sdimvoid MultiplexExternalSemaSource::completeVisibleDeclsMap(const DeclContext *DC){ 106243791Sdim for(size_t i = 0; i < Sources.size(); ++i) 107243791Sdim Sources[i]->completeVisibleDeclsMap(DC); 108243791Sdim} 109243791Sdim 110296417Sdimvoid MultiplexExternalSemaSource::FindExternalLexicalDecls( 111296417Sdim const DeclContext *DC, llvm::function_ref<bool(Decl::Kind)> IsKindWeWant, 112296417Sdim SmallVectorImpl<Decl *> &Result) { 113243791Sdim for(size_t i = 0; i < Sources.size(); ++i) 114296417Sdim Sources[i]->FindExternalLexicalDecls(DC, IsKindWeWant, Result); 115243791Sdim} 116243791Sdim 117243791Sdimvoid MultiplexExternalSemaSource::FindFileRegionDecls(FileID File, 118243791Sdim unsigned Offset, 119243791Sdim unsigned Length, 120243791Sdim SmallVectorImpl<Decl *> &Decls){ 121243791Sdim for(size_t i = 0; i < Sources.size(); ++i) 122243791Sdim Sources[i]->FindFileRegionDecls(File, Offset, Length, Decls); 123243791Sdim} 124243791Sdim 125243791Sdimvoid MultiplexExternalSemaSource::CompleteType(TagDecl *Tag) { 126243791Sdim for(size_t i = 0; i < Sources.size(); ++i) 127243791Sdim Sources[i]->CompleteType(Tag); 128243791Sdim} 129243791Sdim 130243791Sdimvoid MultiplexExternalSemaSource::CompleteType(ObjCInterfaceDecl *Class) { 131243791Sdim for(size_t i = 0; i < Sources.size(); ++i) 132243791Sdim Sources[i]->CompleteType(Class); 133243791Sdim} 134243791Sdim 135243791Sdimvoid MultiplexExternalSemaSource::ReadComments() { 136243791Sdim for(size_t i = 0; i < Sources.size(); ++i) 137243791Sdim Sources[i]->ReadComments(); 138243791Sdim} 139243791Sdim 140243791Sdimvoid MultiplexExternalSemaSource::StartedDeserializing() { 141243791Sdim for(size_t i = 0; i < Sources.size(); ++i) 142243791Sdim Sources[i]->StartedDeserializing(); 143243791Sdim} 144243791Sdim 145243791Sdimvoid MultiplexExternalSemaSource::FinishedDeserializing() { 146243791Sdim for(size_t i = 0; i < Sources.size(); ++i) 147243791Sdim Sources[i]->FinishedDeserializing(); 148243791Sdim} 149243791Sdim 150243791Sdimvoid MultiplexExternalSemaSource::StartTranslationUnit(ASTConsumer *Consumer) { 151243791Sdim for(size_t i = 0; i < Sources.size(); ++i) 152243791Sdim Sources[i]->StartTranslationUnit(Consumer); 153243791Sdim} 154243791Sdim 155243791Sdimvoid MultiplexExternalSemaSource::PrintStats() { 156243791Sdim for(size_t i = 0; i < Sources.size(); ++i) 157243791Sdim Sources[i]->PrintStats(); 158243791Sdim} 159243791Sdim 160243791Sdimbool MultiplexExternalSemaSource::layoutRecordType(const RecordDecl *Record, 161243791Sdim uint64_t &Size, 162243791Sdim uint64_t &Alignment, 163243791Sdim llvm::DenseMap<const FieldDecl *, uint64_t> &FieldOffsets, 164243791Sdim llvm::DenseMap<const CXXRecordDecl *, CharUnits> &BaseOffsets, 165243791Sdim llvm::DenseMap<const CXXRecordDecl *, CharUnits> &VirtualBaseOffsets){ 166243791Sdim for(size_t i = 0; i < Sources.size(); ++i) 167243791Sdim if (Sources[i]->layoutRecordType(Record, Size, Alignment, FieldOffsets, 168243791Sdim BaseOffsets, VirtualBaseOffsets)) 169243791Sdim return true; 170243791Sdim return false; 171243791Sdim} 172243791Sdim 173243791Sdimvoid MultiplexExternalSemaSource:: 174243791SdimgetMemoryBufferSizes(MemoryBufferSizes &sizes) const { 175243791Sdim for(size_t i = 0; i < Sources.size(); ++i) 176243791Sdim Sources[i]->getMemoryBufferSizes(sizes); 177243791Sdim 178243791Sdim} 179243791Sdim 180243791Sdim//===----------------------------------------------------------------------===// 181243791Sdim// ExternalSemaSource. 182243791Sdim//===----------------------------------------------------------------------===// 183243791Sdim 184243791Sdim 185243791Sdimvoid MultiplexExternalSemaSource::InitializeSema(Sema &S) { 186243791Sdim for(size_t i = 0; i < Sources.size(); ++i) 187243791Sdim Sources[i]->InitializeSema(S); 188243791Sdim} 189243791Sdim 190243791Sdimvoid MultiplexExternalSemaSource::ForgetSema() { 191243791Sdim for(size_t i = 0; i < Sources.size(); ++i) 192243791Sdim Sources[i]->ForgetSema(); 193243791Sdim} 194243791Sdim 195243791Sdimvoid MultiplexExternalSemaSource::ReadMethodPool(Selector Sel) { 196243791Sdim for(size_t i = 0; i < Sources.size(); ++i) 197243791Sdim Sources[i]->ReadMethodPool(Sel); 198243791Sdim} 199243791Sdim 200309124Sdimvoid MultiplexExternalSemaSource::updateOutOfDateSelector(Selector Sel) { 201309124Sdim for(size_t i = 0; i < Sources.size(); ++i) 202309124Sdim Sources[i]->updateOutOfDateSelector(Sel); 203309124Sdim} 204309124Sdim 205243791Sdimvoid MultiplexExternalSemaSource::ReadKnownNamespaces( 206243791Sdim SmallVectorImpl<NamespaceDecl*> &Namespaces){ 207243791Sdim for(size_t i = 0; i < Sources.size(); ++i) 208243791Sdim Sources[i]->ReadKnownNamespaces(Namespaces); 209243791Sdim} 210249423Sdim 211249423Sdimvoid MultiplexExternalSemaSource::ReadUndefinedButUsed( 212309124Sdim llvm::MapVector<NamedDecl *, SourceLocation> &Undefined) { 213249423Sdim for(size_t i = 0; i < Sources.size(); ++i) 214249423Sdim Sources[i]->ReadUndefinedButUsed(Undefined); 215249423Sdim} 216288943Sdim 217288943Sdimvoid MultiplexExternalSemaSource::ReadMismatchingDeleteExpressions( 218288943Sdim llvm::MapVector<FieldDecl *, 219288943Sdim llvm::SmallVector<std::pair<SourceLocation, bool>, 4>> & 220288943Sdim Exprs) { 221288943Sdim for (auto &Source : Sources) 222288943Sdim Source->ReadMismatchingDeleteExpressions(Exprs); 223288943Sdim} 224288943Sdim 225243791Sdimbool MultiplexExternalSemaSource::LookupUnqualified(LookupResult &R, Scope *S){ 226243791Sdim for(size_t i = 0; i < Sources.size(); ++i) 227243791Sdim Sources[i]->LookupUnqualified(R, S); 228243791Sdim 229243791Sdim return !R.empty(); 230243791Sdim} 231243791Sdim 232243791Sdimvoid MultiplexExternalSemaSource::ReadTentativeDefinitions( 233243791Sdim SmallVectorImpl<VarDecl*> &TentativeDefs) { 234243791Sdim for(size_t i = 0; i < Sources.size(); ++i) 235243791Sdim Sources[i]->ReadTentativeDefinitions(TentativeDefs); 236243791Sdim} 237243791Sdim 238243791Sdimvoid MultiplexExternalSemaSource::ReadUnusedFileScopedDecls( 239243791Sdim SmallVectorImpl<const DeclaratorDecl*> &Decls) { 240243791Sdim for(size_t i = 0; i < Sources.size(); ++i) 241243791Sdim Sources[i]->ReadUnusedFileScopedDecls(Decls); 242243791Sdim} 243243791Sdim 244243791Sdimvoid MultiplexExternalSemaSource::ReadDelegatingConstructors( 245243791Sdim SmallVectorImpl<CXXConstructorDecl*> &Decls) { 246243791Sdim for(size_t i = 0; i < Sources.size(); ++i) 247243791Sdim Sources[i]->ReadDelegatingConstructors(Decls); 248243791Sdim} 249243791Sdim 250243791Sdimvoid MultiplexExternalSemaSource::ReadExtVectorDecls( 251243791Sdim SmallVectorImpl<TypedefNameDecl*> &Decls) { 252243791Sdim for(size_t i = 0; i < Sources.size(); ++i) 253243791Sdim Sources[i]->ReadExtVectorDecls(Decls); 254243791Sdim} 255243791Sdim 256280031Sdimvoid MultiplexExternalSemaSource::ReadUnusedLocalTypedefNameCandidates( 257280031Sdim llvm::SmallSetVector<const TypedefNameDecl *, 4> &Decls) { 258280031Sdim for(size_t i = 0; i < Sources.size(); ++i) 259280031Sdim Sources[i]->ReadUnusedLocalTypedefNameCandidates(Decls); 260280031Sdim} 261280031Sdim 262243791Sdimvoid MultiplexExternalSemaSource::ReadReferencedSelectors( 263243791Sdim SmallVectorImpl<std::pair<Selector, SourceLocation> > &Sels) { 264243791Sdim for(size_t i = 0; i < Sources.size(); ++i) 265243791Sdim Sources[i]->ReadReferencedSelectors(Sels); 266243791Sdim} 267243791Sdim 268243791Sdimvoid MultiplexExternalSemaSource::ReadWeakUndeclaredIdentifiers( 269243791Sdim SmallVectorImpl<std::pair<IdentifierInfo*, WeakInfo> > &WI) { 270243791Sdim for(size_t i = 0; i < Sources.size(); ++i) 271243791Sdim Sources[i]->ReadWeakUndeclaredIdentifiers(WI); 272243791Sdim} 273243791Sdim 274243791Sdimvoid MultiplexExternalSemaSource::ReadUsedVTables( 275243791Sdim SmallVectorImpl<ExternalVTableUse> &VTables) { 276243791Sdim for(size_t i = 0; i < Sources.size(); ++i) 277243791Sdim Sources[i]->ReadUsedVTables(VTables); 278243791Sdim} 279243791Sdim 280243791Sdimvoid MultiplexExternalSemaSource::ReadPendingInstantiations( 281243791Sdim SmallVectorImpl<std::pair<ValueDecl*, 282243791Sdim SourceLocation> > &Pending) { 283243791Sdim for(size_t i = 0; i < Sources.size(); ++i) 284243791Sdim Sources[i]->ReadPendingInstantiations(Pending); 285243791Sdim} 286261991Sdim 287261991Sdimvoid MultiplexExternalSemaSource::ReadLateParsedTemplates( 288288943Sdim llvm::MapVector<const FunctionDecl *, LateParsedTemplate *> &LPTMap) { 289261991Sdim for (size_t i = 0; i < Sources.size(); ++i) 290261991Sdim Sources[i]->ReadLateParsedTemplates(LPTMap); 291261991Sdim} 292261991Sdim 293261991SdimTypoCorrection MultiplexExternalSemaSource::CorrectTypo( 294261991Sdim const DeclarationNameInfo &Typo, 295261991Sdim int LookupKind, Scope *S, CXXScopeSpec *SS, 296261991Sdim CorrectionCandidateCallback &CCC, 297261991Sdim DeclContext *MemberContext, 298261991Sdim bool EnteringContext, 299261991Sdim const ObjCObjectPointerType *OPT) { 300261991Sdim for (size_t I = 0, E = Sources.size(); I < E; ++I) { 301261991Sdim if (TypoCorrection C = Sources[I]->CorrectTypo(Typo, LookupKind, S, SS, CCC, 302261991Sdim MemberContext, 303261991Sdim EnteringContext, OPT)) 304261991Sdim return C; 305261991Sdim } 306261991Sdim return TypoCorrection(); 307261991Sdim} 308261991Sdim 309261991Sdimbool MultiplexExternalSemaSource::MaybeDiagnoseMissingCompleteType( 310261991Sdim SourceLocation Loc, QualType T) { 311261991Sdim for (size_t I = 0, E = Sources.size(); I < E; ++I) { 312261991Sdim if (Sources[I]->MaybeDiagnoseMissingCompleteType(Loc, T)) 313261991Sdim return true; 314261991Sdim } 315261991Sdim return false; 316261991Sdim} 317