1243791Sdim//===--- MultiplexExternalSemaSource.cpp ---------------------------------===// 2243791Sdim// 3353358Sdim// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4353358Sdim// See https://llvm.org/LICENSE.txt for license information. 5353358Sdim// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6243791Sdim// 7243791Sdim//===----------------------------------------------------------------------===// 8243791Sdim// 9243791Sdim// This file implements the event dispatching to the subscribed clients. 10243791Sdim// 11243791Sdim//===----------------------------------------------------------------------===// 12243791Sdim#include "clang/Sema/MultiplexExternalSemaSource.h" 13243791Sdim#include "clang/AST/DeclContextInternals.h" 14243791Sdim#include "clang/Sema/Lookup.h" 15243791Sdim 16243791Sdimusing namespace clang; 17243791Sdim 18360784Sdimchar MultiplexExternalSemaSource::ID; 19360784Sdim 20341825Sdim///Constructs a new multiplexing external sema source and appends the 21243791Sdim/// given element to it. 22243791Sdim/// 23243791SdimMultiplexExternalSemaSource::MultiplexExternalSemaSource(ExternalSemaSource &s1, 24243791Sdim ExternalSemaSource &s2){ 25243791Sdim Sources.push_back(&s1); 26243791Sdim Sources.push_back(&s2); 27243791Sdim} 28243791Sdim 29243791Sdim// pin the vtable here. 30243791SdimMultiplexExternalSemaSource::~MultiplexExternalSemaSource() {} 31243791Sdim 32341825Sdim///Appends new source to the source list. 33243791Sdim/// 34243791Sdim///\param[in] source - An ExternalSemaSource. 35243791Sdim/// 36243791Sdimvoid MultiplexExternalSemaSource::addSource(ExternalSemaSource &source) { 37243791Sdim Sources.push_back(&source); 38243791Sdim} 39243791Sdim 40243791Sdim//===----------------------------------------------------------------------===// 41243791Sdim// ExternalASTSource. 42243791Sdim//===----------------------------------------------------------------------===// 43243791Sdim 44243791SdimDecl *MultiplexExternalSemaSource::GetExternalDecl(uint32_t ID) { 45243791Sdim for(size_t i = 0; i < Sources.size(); ++i) 46243791Sdim if (Decl *Result = Sources[i]->GetExternalDecl(ID)) 47243791Sdim return Result; 48276479Sdim return nullptr; 49243791Sdim} 50243791Sdim 51276479Sdimvoid MultiplexExternalSemaSource::CompleteRedeclChain(const Decl *D) { 52276479Sdim for (size_t i = 0; i < Sources.size(); ++i) 53276479Sdim Sources[i]->CompleteRedeclChain(D); 54276479Sdim} 55276479Sdim 56243791SdimSelector MultiplexExternalSemaSource::GetExternalSelector(uint32_t ID) { 57243791Sdim Selector Sel; 58243791Sdim for(size_t i = 0; i < Sources.size(); ++i) { 59243791Sdim Sel = Sources[i]->GetExternalSelector(ID); 60243791Sdim if (!Sel.isNull()) 61243791Sdim return Sel; 62243791Sdim } 63243791Sdim return Sel; 64243791Sdim} 65243791Sdim 66243791Sdimuint32_t MultiplexExternalSemaSource::GetNumExternalSelectors() { 67243791Sdim uint32_t total = 0; 68243791Sdim for(size_t i = 0; i < Sources.size(); ++i) 69243791Sdim total += Sources[i]->GetNumExternalSelectors(); 70243791Sdim return total; 71243791Sdim} 72243791Sdim 73243791SdimStmt *MultiplexExternalSemaSource::GetExternalDeclStmt(uint64_t Offset) { 74243791Sdim for(size_t i = 0; i < Sources.size(); ++i) 75243791Sdim if (Stmt *Result = Sources[i]->GetExternalDeclStmt(Offset)) 76243791Sdim return Result; 77276479Sdim return nullptr; 78243791Sdim} 79243791Sdim 80243791SdimCXXBaseSpecifier *MultiplexExternalSemaSource::GetExternalCXXBaseSpecifiers( 81243791Sdim uint64_t Offset){ 82243791Sdim for(size_t i = 0; i < Sources.size(); ++i) 83243791Sdim if (CXXBaseSpecifier *R = Sources[i]->GetExternalCXXBaseSpecifiers(Offset)) 84243791Sdim return R; 85276479Sdim return nullptr; 86243791Sdim} 87243791Sdim 88288943SdimCXXCtorInitializer ** 89288943SdimMultiplexExternalSemaSource::GetExternalCXXCtorInitializers(uint64_t Offset) { 90288943Sdim for (auto *S : Sources) 91288943Sdim if (auto *R = S->GetExternalCXXCtorInitializers(Offset)) 92288943Sdim return R; 93288943Sdim return nullptr; 94288943Sdim} 95288943Sdim 96321369SdimExternalASTSource::ExtKind 97321369SdimMultiplexExternalSemaSource::hasExternalDefinitions(const Decl *D) { 98321369Sdim for (const auto &S : Sources) 99321369Sdim if (auto EK = S->hasExternalDefinitions(D)) 100321369Sdim if (EK != EK_ReplyHazy) 101321369Sdim return EK; 102321369Sdim return EK_ReplyHazy; 103321369Sdim} 104321369Sdim 105249423Sdimbool MultiplexExternalSemaSource:: 106243791SdimFindExternalVisibleDeclsByName(const DeclContext *DC, DeclarationName Name) { 107249423Sdim bool AnyDeclsFound = false; 108249423Sdim for (size_t i = 0; i < Sources.size(); ++i) 109249423Sdim AnyDeclsFound |= Sources[i]->FindExternalVisibleDeclsByName(DC, Name); 110249423Sdim return AnyDeclsFound; 111243791Sdim} 112243791Sdim 113243791Sdimvoid MultiplexExternalSemaSource::completeVisibleDeclsMap(const DeclContext *DC){ 114243791Sdim for(size_t i = 0; i < Sources.size(); ++i) 115243791Sdim Sources[i]->completeVisibleDeclsMap(DC); 116243791Sdim} 117243791Sdim 118296417Sdimvoid MultiplexExternalSemaSource::FindExternalLexicalDecls( 119296417Sdim const DeclContext *DC, llvm::function_ref<bool(Decl::Kind)> IsKindWeWant, 120296417Sdim SmallVectorImpl<Decl *> &Result) { 121243791Sdim for(size_t i = 0; i < Sources.size(); ++i) 122296417Sdim Sources[i]->FindExternalLexicalDecls(DC, IsKindWeWant, Result); 123243791Sdim} 124243791Sdim 125341825Sdimvoid MultiplexExternalSemaSource::FindFileRegionDecls(FileID File, 126243791Sdim unsigned Offset, 127243791Sdim unsigned Length, 128243791Sdim SmallVectorImpl<Decl *> &Decls){ 129243791Sdim for(size_t i = 0; i < Sources.size(); ++i) 130243791Sdim Sources[i]->FindFileRegionDecls(File, Offset, Length, Decls); 131243791Sdim} 132243791Sdim 133243791Sdimvoid MultiplexExternalSemaSource::CompleteType(TagDecl *Tag) { 134243791Sdim for(size_t i = 0; i < Sources.size(); ++i) 135243791Sdim Sources[i]->CompleteType(Tag); 136243791Sdim} 137243791Sdim 138243791Sdimvoid MultiplexExternalSemaSource::CompleteType(ObjCInterfaceDecl *Class) { 139243791Sdim for(size_t i = 0; i < Sources.size(); ++i) 140243791Sdim Sources[i]->CompleteType(Class); 141243791Sdim} 142243791Sdim 143243791Sdimvoid MultiplexExternalSemaSource::ReadComments() { 144243791Sdim for(size_t i = 0; i < Sources.size(); ++i) 145243791Sdim Sources[i]->ReadComments(); 146243791Sdim} 147243791Sdim 148243791Sdimvoid MultiplexExternalSemaSource::StartedDeserializing() { 149243791Sdim for(size_t i = 0; i < Sources.size(); ++i) 150243791Sdim Sources[i]->StartedDeserializing(); 151243791Sdim} 152243791Sdim 153243791Sdimvoid MultiplexExternalSemaSource::FinishedDeserializing() { 154243791Sdim for(size_t i = 0; i < Sources.size(); ++i) 155243791Sdim Sources[i]->FinishedDeserializing(); 156243791Sdim} 157243791Sdim 158243791Sdimvoid MultiplexExternalSemaSource::StartTranslationUnit(ASTConsumer *Consumer) { 159243791Sdim for(size_t i = 0; i < Sources.size(); ++i) 160243791Sdim Sources[i]->StartTranslationUnit(Consumer); 161243791Sdim} 162243791Sdim 163243791Sdimvoid MultiplexExternalSemaSource::PrintStats() { 164243791Sdim for(size_t i = 0; i < Sources.size(); ++i) 165243791Sdim Sources[i]->PrintStats(); 166243791Sdim} 167243791Sdim 168341825SdimModule *MultiplexExternalSemaSource::getModule(unsigned ID) { 169341825Sdim for (size_t i = 0; i < Sources.size(); ++i) 170341825Sdim if (auto M = Sources[i]->getModule(ID)) 171341825Sdim return M; 172341825Sdim return nullptr; 173341825Sdim} 174341825Sdim 175341825Sdimbool MultiplexExternalSemaSource::DeclIsFromPCHWithObjectFile(const Decl *D) { 176341825Sdim for (auto *S : Sources) 177341825Sdim if (S->DeclIsFromPCHWithObjectFile(D)) 178341825Sdim return true; 179341825Sdim return false; 180341825Sdim} 181341825Sdim 182243791Sdimbool MultiplexExternalSemaSource::layoutRecordType(const RecordDecl *Record, 183341825Sdim uint64_t &Size, 184243791Sdim uint64_t &Alignment, 185243791Sdim llvm::DenseMap<const FieldDecl *, uint64_t> &FieldOffsets, 186243791Sdim llvm::DenseMap<const CXXRecordDecl *, CharUnits> &BaseOffsets, 187243791Sdim llvm::DenseMap<const CXXRecordDecl *, CharUnits> &VirtualBaseOffsets){ 188243791Sdim for(size_t i = 0; i < Sources.size(); ++i) 189341825Sdim if (Sources[i]->layoutRecordType(Record, Size, Alignment, FieldOffsets, 190243791Sdim BaseOffsets, VirtualBaseOffsets)) 191243791Sdim return true; 192243791Sdim return false; 193243791Sdim} 194243791Sdim 195243791Sdimvoid MultiplexExternalSemaSource:: 196243791SdimgetMemoryBufferSizes(MemoryBufferSizes &sizes) const { 197243791Sdim for(size_t i = 0; i < Sources.size(); ++i) 198243791Sdim Sources[i]->getMemoryBufferSizes(sizes); 199243791Sdim 200243791Sdim} 201243791Sdim 202243791Sdim//===----------------------------------------------------------------------===// 203243791Sdim// ExternalSemaSource. 204243791Sdim//===----------------------------------------------------------------------===// 205243791Sdim 206243791Sdim 207243791Sdimvoid MultiplexExternalSemaSource::InitializeSema(Sema &S) { 208243791Sdim for(size_t i = 0; i < Sources.size(); ++i) 209243791Sdim Sources[i]->InitializeSema(S); 210243791Sdim} 211243791Sdim 212243791Sdimvoid MultiplexExternalSemaSource::ForgetSema() { 213243791Sdim for(size_t i = 0; i < Sources.size(); ++i) 214243791Sdim Sources[i]->ForgetSema(); 215243791Sdim} 216243791Sdim 217243791Sdimvoid MultiplexExternalSemaSource::ReadMethodPool(Selector Sel) { 218243791Sdim for(size_t i = 0; i < Sources.size(); ++i) 219243791Sdim Sources[i]->ReadMethodPool(Sel); 220243791Sdim} 221243791Sdim 222309124Sdimvoid MultiplexExternalSemaSource::updateOutOfDateSelector(Selector Sel) { 223309124Sdim for(size_t i = 0; i < Sources.size(); ++i) 224309124Sdim Sources[i]->updateOutOfDateSelector(Sel); 225309124Sdim} 226309124Sdim 227243791Sdimvoid MultiplexExternalSemaSource::ReadKnownNamespaces( 228243791Sdim SmallVectorImpl<NamespaceDecl*> &Namespaces){ 229243791Sdim for(size_t i = 0; i < Sources.size(); ++i) 230243791Sdim Sources[i]->ReadKnownNamespaces(Namespaces); 231243791Sdim} 232249423Sdim 233249423Sdimvoid MultiplexExternalSemaSource::ReadUndefinedButUsed( 234309124Sdim llvm::MapVector<NamedDecl *, SourceLocation> &Undefined) { 235249423Sdim for(size_t i = 0; i < Sources.size(); ++i) 236249423Sdim Sources[i]->ReadUndefinedButUsed(Undefined); 237249423Sdim} 238288943Sdim 239288943Sdimvoid MultiplexExternalSemaSource::ReadMismatchingDeleteExpressions( 240288943Sdim llvm::MapVector<FieldDecl *, 241288943Sdim llvm::SmallVector<std::pair<SourceLocation, bool>, 4>> & 242288943Sdim Exprs) { 243288943Sdim for (auto &Source : Sources) 244288943Sdim Source->ReadMismatchingDeleteExpressions(Exprs); 245288943Sdim} 246288943Sdim 247341825Sdimbool MultiplexExternalSemaSource::LookupUnqualified(LookupResult &R, Scope *S){ 248243791Sdim for(size_t i = 0; i < Sources.size(); ++i) 249243791Sdim Sources[i]->LookupUnqualified(R, S); 250341825Sdim 251243791Sdim return !R.empty(); 252243791Sdim} 253243791Sdim 254243791Sdimvoid MultiplexExternalSemaSource::ReadTentativeDefinitions( 255243791Sdim SmallVectorImpl<VarDecl*> &TentativeDefs) { 256243791Sdim for(size_t i = 0; i < Sources.size(); ++i) 257243791Sdim Sources[i]->ReadTentativeDefinitions(TentativeDefs); 258243791Sdim} 259341825Sdim 260243791Sdimvoid MultiplexExternalSemaSource::ReadUnusedFileScopedDecls( 261243791Sdim SmallVectorImpl<const DeclaratorDecl*> &Decls) { 262243791Sdim for(size_t i = 0; i < Sources.size(); ++i) 263243791Sdim Sources[i]->ReadUnusedFileScopedDecls(Decls); 264243791Sdim} 265341825Sdim 266243791Sdimvoid MultiplexExternalSemaSource::ReadDelegatingConstructors( 267243791Sdim SmallVectorImpl<CXXConstructorDecl*> &Decls) { 268243791Sdim for(size_t i = 0; i < Sources.size(); ++i) 269243791Sdim Sources[i]->ReadDelegatingConstructors(Decls); 270243791Sdim} 271243791Sdim 272243791Sdimvoid MultiplexExternalSemaSource::ReadExtVectorDecls( 273243791Sdim SmallVectorImpl<TypedefNameDecl*> &Decls) { 274243791Sdim for(size_t i = 0; i < Sources.size(); ++i) 275243791Sdim Sources[i]->ReadExtVectorDecls(Decls); 276243791Sdim} 277243791Sdim 278280031Sdimvoid MultiplexExternalSemaSource::ReadUnusedLocalTypedefNameCandidates( 279280031Sdim llvm::SmallSetVector<const TypedefNameDecl *, 4> &Decls) { 280280031Sdim for(size_t i = 0; i < Sources.size(); ++i) 281280031Sdim Sources[i]->ReadUnusedLocalTypedefNameCandidates(Decls); 282280031Sdim} 283280031Sdim 284243791Sdimvoid MultiplexExternalSemaSource::ReadReferencedSelectors( 285243791Sdim SmallVectorImpl<std::pair<Selector, SourceLocation> > &Sels) { 286243791Sdim for(size_t i = 0; i < Sources.size(); ++i) 287243791Sdim Sources[i]->ReadReferencedSelectors(Sels); 288243791Sdim} 289243791Sdim 290243791Sdimvoid MultiplexExternalSemaSource::ReadWeakUndeclaredIdentifiers( 291243791Sdim SmallVectorImpl<std::pair<IdentifierInfo*, WeakInfo> > &WI) { 292243791Sdim for(size_t i = 0; i < Sources.size(); ++i) 293243791Sdim Sources[i]->ReadWeakUndeclaredIdentifiers(WI); 294243791Sdim} 295243791Sdim 296243791Sdimvoid MultiplexExternalSemaSource::ReadUsedVTables( 297243791Sdim SmallVectorImpl<ExternalVTableUse> &VTables) { 298243791Sdim for(size_t i = 0; i < Sources.size(); ++i) 299243791Sdim Sources[i]->ReadUsedVTables(VTables); 300243791Sdim} 301243791Sdim 302243791Sdimvoid MultiplexExternalSemaSource::ReadPendingInstantiations( 303243791Sdim SmallVectorImpl<std::pair<ValueDecl*, 304243791Sdim SourceLocation> > &Pending) { 305243791Sdim for(size_t i = 0; i < Sources.size(); ++i) 306243791Sdim Sources[i]->ReadPendingInstantiations(Pending); 307243791Sdim} 308261991Sdim 309261991Sdimvoid MultiplexExternalSemaSource::ReadLateParsedTemplates( 310314564Sdim llvm::MapVector<const FunctionDecl *, std::unique_ptr<LateParsedTemplate>> 311314564Sdim &LPTMap) { 312261991Sdim for (size_t i = 0; i < Sources.size(); ++i) 313261991Sdim Sources[i]->ReadLateParsedTemplates(LPTMap); 314261991Sdim} 315261991Sdim 316261991SdimTypoCorrection MultiplexExternalSemaSource::CorrectTypo( 317261991Sdim const DeclarationNameInfo &Typo, 318261991Sdim int LookupKind, Scope *S, CXXScopeSpec *SS, 319261991Sdim CorrectionCandidateCallback &CCC, 320261991Sdim DeclContext *MemberContext, 321261991Sdim bool EnteringContext, 322261991Sdim const ObjCObjectPointerType *OPT) { 323261991Sdim for (size_t I = 0, E = Sources.size(); I < E; ++I) { 324261991Sdim if (TypoCorrection C = Sources[I]->CorrectTypo(Typo, LookupKind, S, SS, CCC, 325261991Sdim MemberContext, 326261991Sdim EnteringContext, OPT)) 327261991Sdim return C; 328261991Sdim } 329261991Sdim return TypoCorrection(); 330261991Sdim} 331261991Sdim 332261991Sdimbool MultiplexExternalSemaSource::MaybeDiagnoseMissingCompleteType( 333261991Sdim SourceLocation Loc, QualType T) { 334261991Sdim for (size_t I = 0, E = Sources.size(); I < E; ++I) { 335261991Sdim if (Sources[I]->MaybeDiagnoseMissingCompleteType(Loc, T)) 336261991Sdim return true; 337261991Sdim } 338261991Sdim return false; 339261991Sdim} 340