1dd433f0bSAxel Naumann //===--- MultiplexExternalSemaSource.cpp  ---------------------------------===//
2dd433f0bSAxel Naumann //
32946cd70SChandler Carruth // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
42946cd70SChandler Carruth // See https://llvm.org/LICENSE.txt for license information.
52946cd70SChandler Carruth // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6dd433f0bSAxel Naumann //
7dd433f0bSAxel Naumann //===----------------------------------------------------------------------===//
8dd433f0bSAxel Naumann //
9dd433f0bSAxel Naumann // This file implements the event dispatching to the subscribed clients.
10dd433f0bSAxel Naumann //
11dd433f0bSAxel Naumann //===----------------------------------------------------------------------===//
12dd433f0bSAxel Naumann #include "clang/Sema/MultiplexExternalSemaSource.h"
13dd433f0bSAxel Naumann #include "clang/Sema/Lookup.h"
14dd433f0bSAxel Naumann 
15dd433f0bSAxel Naumann using namespace clang;
16dd433f0bSAxel Naumann 
17aa455849SRaphael Isemann char MultiplexExternalSemaSource::ID;
18aa455849SRaphael Isemann 
199fc8faf9SAdrian Prantl ///Constructs a new multiplexing external sema source and appends the
20dd433f0bSAxel Naumann /// given element to it.
21dd433f0bSAxel Naumann ///
MultiplexExternalSemaSource(ExternalSemaSource & s1,ExternalSemaSource & s2)22dd433f0bSAxel Naumann MultiplexExternalSemaSource::MultiplexExternalSemaSource(ExternalSemaSource &s1,
23dd433f0bSAxel Naumann                                                         ExternalSemaSource &s2){
24dd433f0bSAxel Naumann   Sources.push_back(&s1);
25dd433f0bSAxel Naumann   Sources.push_back(&s2);
26dd433f0bSAxel Naumann }
27dd433f0bSAxel Naumann 
28dd433f0bSAxel Naumann // pin the vtable here.
~MultiplexExternalSemaSource()29637d1e66SAngel Garcia Gomez MultiplexExternalSemaSource::~MultiplexExternalSemaSource() {}
30dd433f0bSAxel Naumann 
319fc8faf9SAdrian Prantl ///Appends new source to the source list.
32dd433f0bSAxel Naumann ///
33dd433f0bSAxel Naumann ///\param[in] source - An ExternalSemaSource.
34dd433f0bSAxel Naumann ///
addSource(ExternalSemaSource & source)35dd433f0bSAxel Naumann void MultiplexExternalSemaSource::addSource(ExternalSemaSource &source) {
36dd433f0bSAxel Naumann   Sources.push_back(&source);
37dd433f0bSAxel Naumann }
38dd433f0bSAxel Naumann 
39dd433f0bSAxel Naumann //===----------------------------------------------------------------------===//
40dd433f0bSAxel Naumann // ExternalASTSource.
41dd433f0bSAxel Naumann //===----------------------------------------------------------------------===//
42dd433f0bSAxel Naumann 
GetExternalDecl(uint32_t ID)43dd433f0bSAxel Naumann Decl *MultiplexExternalSemaSource::GetExternalDecl(uint32_t ID) {
44dd433f0bSAxel Naumann   for(size_t i = 0; i < Sources.size(); ++i)
45dd433f0bSAxel Naumann     if (Decl *Result = Sources[i]->GetExternalDecl(ID))
46dd433f0bSAxel Naumann       return Result;
47c3ec149bSCraig Topper   return nullptr;
48dd433f0bSAxel Naumann }
49dd433f0bSAxel Naumann 
CompleteRedeclChain(const Decl * D)50053f6c6cSRichard Smith void MultiplexExternalSemaSource::CompleteRedeclChain(const Decl *D) {
51053f6c6cSRichard Smith   for (size_t i = 0; i < Sources.size(); ++i)
52053f6c6cSRichard Smith     Sources[i]->CompleteRedeclChain(D);
53053f6c6cSRichard Smith }
54053f6c6cSRichard Smith 
GetExternalSelector(uint32_t ID)55dd433f0bSAxel Naumann Selector MultiplexExternalSemaSource::GetExternalSelector(uint32_t ID) {
56dd433f0bSAxel Naumann   Selector Sel;
57dd433f0bSAxel Naumann   for(size_t i = 0; i < Sources.size(); ++i) {
58dd433f0bSAxel Naumann     Sel = Sources[i]->GetExternalSelector(ID);
59dd433f0bSAxel Naumann     if (!Sel.isNull())
60dd433f0bSAxel Naumann       return Sel;
61dd433f0bSAxel Naumann   }
62dd433f0bSAxel Naumann   return Sel;
63dd433f0bSAxel Naumann }
64dd433f0bSAxel Naumann 
GetNumExternalSelectors()65dd433f0bSAxel Naumann uint32_t MultiplexExternalSemaSource::GetNumExternalSelectors() {
66dd433f0bSAxel Naumann   uint32_t total = 0;
67dd433f0bSAxel Naumann   for(size_t i = 0; i < Sources.size(); ++i)
68dd433f0bSAxel Naumann     total += Sources[i]->GetNumExternalSelectors();
69dd433f0bSAxel Naumann   return total;
70dd433f0bSAxel Naumann }
71dd433f0bSAxel Naumann 
GetExternalDeclStmt(uint64_t Offset)72dd433f0bSAxel Naumann Stmt *MultiplexExternalSemaSource::GetExternalDeclStmt(uint64_t Offset) {
73dd433f0bSAxel Naumann   for(size_t i = 0; i < Sources.size(); ++i)
74dd433f0bSAxel Naumann     if (Stmt *Result = Sources[i]->GetExternalDeclStmt(Offset))
75dd433f0bSAxel Naumann       return Result;
76c3ec149bSCraig Topper   return nullptr;
77dd433f0bSAxel Naumann }
78dd433f0bSAxel Naumann 
GetExternalCXXBaseSpecifiers(uint64_t Offset)79dd433f0bSAxel Naumann CXXBaseSpecifier *MultiplexExternalSemaSource::GetExternalCXXBaseSpecifiers(
80dd433f0bSAxel Naumann                                                                uint64_t Offset){
81dd433f0bSAxel Naumann   for(size_t i = 0; i < Sources.size(); ++i)
82dd433f0bSAxel Naumann     if (CXXBaseSpecifier *R = Sources[i]->GetExternalCXXBaseSpecifiers(Offset))
83dd433f0bSAxel Naumann       return R;
84c3ec149bSCraig Topper   return nullptr;
85dd433f0bSAxel Naumann }
86dd433f0bSAxel Naumann 
87c2bb8186SRichard Smith CXXCtorInitializer **
GetExternalCXXCtorInitializers(uint64_t Offset)88c2bb8186SRichard Smith MultiplexExternalSemaSource::GetExternalCXXCtorInitializers(uint64_t Offset) {
89c2bb8186SRichard Smith   for (auto *S : Sources)
90c2bb8186SRichard Smith     if (auto *R = S->GetExternalCXXCtorInitializers(Offset))
91c2bb8186SRichard Smith       return R;
92c2bb8186SRichard Smith   return nullptr;
93c2bb8186SRichard Smith }
94c2bb8186SRichard Smith 
959ffe5a35SDavid Blaikie ExternalASTSource::ExtKind
hasExternalDefinitions(const Decl * D)961ac9c98eSDavid Blaikie MultiplexExternalSemaSource::hasExternalDefinitions(const Decl *D) {
979ffe5a35SDavid Blaikie   for (const auto &S : Sources)
981ac9c98eSDavid Blaikie     if (auto EK = S->hasExternalDefinitions(D))
999ffe5a35SDavid Blaikie       if (EK != EK_ReplyHazy)
1009ffe5a35SDavid Blaikie         return EK;
1019ffe5a35SDavid Blaikie   return EK_ReplyHazy;
1029ffe5a35SDavid Blaikie }
1039ffe5a35SDavid Blaikie 
1049ce12e36SRichard Smith bool MultiplexExternalSemaSource::
FindExternalVisibleDeclsByName(const DeclContext * DC,DeclarationName Name)105dd433f0bSAxel Naumann FindExternalVisibleDeclsByName(const DeclContext *DC, DeclarationName Name) {
1069ce12e36SRichard Smith   bool AnyDeclsFound = false;
1079ce12e36SRichard Smith   for (size_t i = 0; i < Sources.size(); ++i)
1089ce12e36SRichard Smith     AnyDeclsFound |= Sources[i]->FindExternalVisibleDeclsByName(DC, Name);
1099ce12e36SRichard Smith   return AnyDeclsFound;
110dd433f0bSAxel Naumann }
111dd433f0bSAxel Naumann 
completeVisibleDeclsMap(const DeclContext * DC)112dd433f0bSAxel Naumann void MultiplexExternalSemaSource::completeVisibleDeclsMap(const DeclContext *DC){
113dd433f0bSAxel Naumann   for(size_t i = 0; i < Sources.size(); ++i)
114dd433f0bSAxel Naumann     Sources[i]->completeVisibleDeclsMap(DC);
115dd433f0bSAxel Naumann }
116dd433f0bSAxel Naumann 
FindExternalLexicalDecls(const DeclContext * DC,llvm::function_ref<bool (Decl::Kind)> IsKindWeWant,SmallVectorImpl<Decl * > & Result)1173cb15729SRichard Smith void MultiplexExternalSemaSource::FindExternalLexicalDecls(
1183cb15729SRichard Smith     const DeclContext *DC, llvm::function_ref<bool(Decl::Kind)> IsKindWeWant,
119dd433f0bSAxel Naumann     SmallVectorImpl<Decl *> &Result) {
120dd433f0bSAxel Naumann   for(size_t i = 0; i < Sources.size(); ++i)
1213cb15729SRichard Smith     Sources[i]->FindExternalLexicalDecls(DC, IsKindWeWant, Result);
122dd433f0bSAxel Naumann }
123dd433f0bSAxel Naumann 
FindFileRegionDecls(FileID File,unsigned Offset,unsigned Length,SmallVectorImpl<Decl * > & Decls)124dd433f0bSAxel Naumann void MultiplexExternalSemaSource::FindFileRegionDecls(FileID File,
125dd433f0bSAxel Naumann                                                       unsigned Offset,
126dd433f0bSAxel Naumann                                                       unsigned Length,
127dd433f0bSAxel Naumann                                                 SmallVectorImpl<Decl *> &Decls){
128dd433f0bSAxel Naumann   for(size_t i = 0; i < Sources.size(); ++i)
129dd433f0bSAxel Naumann     Sources[i]->FindFileRegionDecls(File, Offset, Length, Decls);
130dd433f0bSAxel Naumann }
131dd433f0bSAxel Naumann 
CompleteType(TagDecl * Tag)132dd433f0bSAxel Naumann void MultiplexExternalSemaSource::CompleteType(TagDecl *Tag) {
133dd433f0bSAxel Naumann   for(size_t i = 0; i < Sources.size(); ++i)
134dd433f0bSAxel Naumann     Sources[i]->CompleteType(Tag);
135dd433f0bSAxel Naumann }
136dd433f0bSAxel Naumann 
CompleteType(ObjCInterfaceDecl * Class)137dd433f0bSAxel Naumann void MultiplexExternalSemaSource::CompleteType(ObjCInterfaceDecl *Class) {
138dd433f0bSAxel Naumann   for(size_t i = 0; i < Sources.size(); ++i)
139dd433f0bSAxel Naumann     Sources[i]->CompleteType(Class);
140dd433f0bSAxel Naumann }
141dd433f0bSAxel Naumann 
ReadComments()142dd433f0bSAxel Naumann void MultiplexExternalSemaSource::ReadComments() {
143dd433f0bSAxel Naumann   for(size_t i = 0; i < Sources.size(); ++i)
144dd433f0bSAxel Naumann     Sources[i]->ReadComments();
145dd433f0bSAxel Naumann }
146dd433f0bSAxel Naumann 
StartedDeserializing()147dd433f0bSAxel Naumann void MultiplexExternalSemaSource::StartedDeserializing() {
148dd433f0bSAxel Naumann   for(size_t i = 0; i < Sources.size(); ++i)
149dd433f0bSAxel Naumann     Sources[i]->StartedDeserializing();
150dd433f0bSAxel Naumann }
151dd433f0bSAxel Naumann 
FinishedDeserializing()152dd433f0bSAxel Naumann void MultiplexExternalSemaSource::FinishedDeserializing() {
153dd433f0bSAxel Naumann   for(size_t i = 0; i < Sources.size(); ++i)
154dd433f0bSAxel Naumann     Sources[i]->FinishedDeserializing();
155dd433f0bSAxel Naumann }
156dd433f0bSAxel Naumann 
StartTranslationUnit(ASTConsumer * Consumer)157dd433f0bSAxel Naumann void MultiplexExternalSemaSource::StartTranslationUnit(ASTConsumer *Consumer) {
158dd433f0bSAxel Naumann   for(size_t i = 0; i < Sources.size(); ++i)
159dd433f0bSAxel Naumann     Sources[i]->StartTranslationUnit(Consumer);
160dd433f0bSAxel Naumann }
161dd433f0bSAxel Naumann 
PrintStats()162dd433f0bSAxel Naumann void MultiplexExternalSemaSource::PrintStats() {
163dd433f0bSAxel Naumann   for(size_t i = 0; i < Sources.size(); ++i)
164dd433f0bSAxel Naumann     Sources[i]->PrintStats();
165dd433f0bSAxel Naumann }
166dd433f0bSAxel Naumann 
getModule(unsigned ID)167025d620cSRaphael Isemann Module *MultiplexExternalSemaSource::getModule(unsigned ID) {
168025d620cSRaphael Isemann   for (size_t i = 0; i < Sources.size(); ++i)
169025d620cSRaphael Isemann     if (auto M = Sources[i]->getModule(ID))
170025d620cSRaphael Isemann       return M;
171025d620cSRaphael Isemann   return nullptr;
172025d620cSRaphael Isemann }
173025d620cSRaphael Isemann 
layoutRecordType(const RecordDecl * Record,uint64_t & Size,uint64_t & Alignment,llvm::DenseMap<const FieldDecl *,uint64_t> & FieldOffsets,llvm::DenseMap<const CXXRecordDecl *,CharUnits> & BaseOffsets,llvm::DenseMap<const CXXRecordDecl *,CharUnits> & VirtualBaseOffsets)174dd433f0bSAxel Naumann bool MultiplexExternalSemaSource::layoutRecordType(const RecordDecl *Record,
175dd433f0bSAxel Naumann                                                    uint64_t &Size,
176dd433f0bSAxel Naumann                                                    uint64_t &Alignment,
177dd433f0bSAxel Naumann                       llvm::DenseMap<const FieldDecl *, uint64_t> &FieldOffsets,
178dd433f0bSAxel Naumann                   llvm::DenseMap<const CXXRecordDecl *, CharUnits> &BaseOffsets,
179dd433f0bSAxel Naumann           llvm::DenseMap<const CXXRecordDecl *, CharUnits> &VirtualBaseOffsets){
180dd433f0bSAxel Naumann   for(size_t i = 0; i < Sources.size(); ++i)
181dd433f0bSAxel Naumann     if (Sources[i]->layoutRecordType(Record, Size, Alignment, FieldOffsets,
182dd433f0bSAxel Naumann                                      BaseOffsets, VirtualBaseOffsets))
183dd433f0bSAxel Naumann       return true;
184dd433f0bSAxel Naumann   return false;
185dd433f0bSAxel Naumann }
186dd433f0bSAxel Naumann 
187dd433f0bSAxel Naumann void MultiplexExternalSemaSource::
getMemoryBufferSizes(MemoryBufferSizes & sizes) const188dd433f0bSAxel Naumann getMemoryBufferSizes(MemoryBufferSizes &sizes) const {
189dd433f0bSAxel Naumann   for(size_t i = 0; i < Sources.size(); ++i)
190dd433f0bSAxel Naumann     Sources[i]->getMemoryBufferSizes(sizes);
191dd433f0bSAxel Naumann 
192dd433f0bSAxel Naumann }
193dd433f0bSAxel Naumann 
194dd433f0bSAxel Naumann //===----------------------------------------------------------------------===//
195dd433f0bSAxel Naumann // ExternalSemaSource.
196dd433f0bSAxel Naumann //===----------------------------------------------------------------------===//
197dd433f0bSAxel Naumann 
198dd433f0bSAxel Naumann 
InitializeSema(Sema & S)199dd433f0bSAxel Naumann void MultiplexExternalSemaSource::InitializeSema(Sema &S) {
200dd433f0bSAxel Naumann   for(size_t i = 0; i < Sources.size(); ++i)
201dd433f0bSAxel Naumann     Sources[i]->InitializeSema(S);
202dd433f0bSAxel Naumann }
203dd433f0bSAxel Naumann 
ForgetSema()204dd433f0bSAxel Naumann void MultiplexExternalSemaSource::ForgetSema() {
205dd433f0bSAxel Naumann   for(size_t i = 0; i < Sources.size(); ++i)
206dd433f0bSAxel Naumann     Sources[i]->ForgetSema();
207dd433f0bSAxel Naumann }
208dd433f0bSAxel Naumann 
ReadMethodPool(Selector Sel)209dd433f0bSAxel Naumann void MultiplexExternalSemaSource::ReadMethodPool(Selector Sel) {
210dd433f0bSAxel Naumann   for(size_t i = 0; i < Sources.size(); ++i)
211dd433f0bSAxel Naumann     Sources[i]->ReadMethodPool(Sel);
212dd433f0bSAxel Naumann }
213dd433f0bSAxel Naumann 
updateOutOfDateSelector(Selector Sel)214a0f31a01SManman Ren void MultiplexExternalSemaSource::updateOutOfDateSelector(Selector Sel) {
215a0f31a01SManman Ren   for(size_t i = 0; i < Sources.size(); ++i)
216a0f31a01SManman Ren     Sources[i]->updateOutOfDateSelector(Sel);
217a0f31a01SManman Ren }
218a0f31a01SManman Ren 
ReadKnownNamespaces(SmallVectorImpl<NamespaceDecl * > & Namespaces)219dd433f0bSAxel Naumann void MultiplexExternalSemaSource::ReadKnownNamespaces(
220dd433f0bSAxel Naumann                                    SmallVectorImpl<NamespaceDecl*> &Namespaces){
221dd433f0bSAxel Naumann   for(size_t i = 0; i < Sources.size(); ++i)
222dd433f0bSAxel Naumann     Sources[i]->ReadKnownNamespaces(Namespaces);
223dd433f0bSAxel Naumann }
2248334af8cSNick Lewycky 
ReadUndefinedButUsed(llvm::MapVector<NamedDecl *,SourceLocation> & Undefined)2259c7eb1d8SNick Lewycky void MultiplexExternalSemaSource::ReadUndefinedButUsed(
226d6a04d79SRichard Smith     llvm::MapVector<NamedDecl *, SourceLocation> &Undefined) {
2278334af8cSNick Lewycky   for(size_t i = 0; i < Sources.size(); ++i)
2289c7eb1d8SNick Lewycky     Sources[i]->ReadUndefinedButUsed(Undefined);
2298334af8cSNick Lewycky }
230dd433f0bSAxel Naumann 
ReadMismatchingDeleteExpressions(llvm::MapVector<FieldDecl *,llvm::SmallVector<std::pair<SourceLocation,bool>,4>> & Exprs)231e5768d17SIsmail Pazarbasi void MultiplexExternalSemaSource::ReadMismatchingDeleteExpressions(
232e5768d17SIsmail Pazarbasi     llvm::MapVector<FieldDecl *,
233e5768d17SIsmail Pazarbasi                     llvm::SmallVector<std::pair<SourceLocation, bool>, 4>> &
234e5768d17SIsmail Pazarbasi         Exprs) {
235e5768d17SIsmail Pazarbasi   for (auto &Source : Sources)
236e5768d17SIsmail Pazarbasi     Source->ReadMismatchingDeleteExpressions(Exprs);
237e5768d17SIsmail Pazarbasi }
238e5768d17SIsmail Pazarbasi 
LookupUnqualified(LookupResult & R,Scope * S)239dd433f0bSAxel Naumann bool MultiplexExternalSemaSource::LookupUnqualified(LookupResult &R, Scope *S){
240dd433f0bSAxel Naumann   for(size_t i = 0; i < Sources.size(); ++i)
241dd433f0bSAxel Naumann     Sources[i]->LookupUnqualified(R, S);
242dd433f0bSAxel Naumann 
243dd433f0bSAxel Naumann   return !R.empty();
244dd433f0bSAxel Naumann }
245dd433f0bSAxel Naumann 
ReadTentativeDefinitions(SmallVectorImpl<VarDecl * > & TentativeDefs)246dd433f0bSAxel Naumann void MultiplexExternalSemaSource::ReadTentativeDefinitions(
247dd433f0bSAxel Naumann                                      SmallVectorImpl<VarDecl*> &TentativeDefs) {
248dd433f0bSAxel Naumann   for(size_t i = 0; i < Sources.size(); ++i)
249dd433f0bSAxel Naumann     Sources[i]->ReadTentativeDefinitions(TentativeDefs);
250dd433f0bSAxel Naumann }
251dd433f0bSAxel Naumann 
ReadUnusedFileScopedDecls(SmallVectorImpl<const DeclaratorDecl * > & Decls)252dd433f0bSAxel Naumann void MultiplexExternalSemaSource::ReadUnusedFileScopedDecls(
253dd433f0bSAxel Naumann                                 SmallVectorImpl<const DeclaratorDecl*> &Decls) {
254dd433f0bSAxel Naumann   for(size_t i = 0; i < Sources.size(); ++i)
255dd433f0bSAxel Naumann     Sources[i]->ReadUnusedFileScopedDecls(Decls);
256dd433f0bSAxel Naumann }
257dd433f0bSAxel Naumann 
ReadDelegatingConstructors(SmallVectorImpl<CXXConstructorDecl * > & Decls)258dd433f0bSAxel Naumann void MultiplexExternalSemaSource::ReadDelegatingConstructors(
259dd433f0bSAxel Naumann                                   SmallVectorImpl<CXXConstructorDecl*> &Decls) {
260dd433f0bSAxel Naumann   for(size_t i = 0; i < Sources.size(); ++i)
261dd433f0bSAxel Naumann     Sources[i]->ReadDelegatingConstructors(Decls);
262dd433f0bSAxel Naumann }
263dd433f0bSAxel Naumann 
ReadExtVectorDecls(SmallVectorImpl<TypedefNameDecl * > & Decls)264dd433f0bSAxel Naumann void MultiplexExternalSemaSource::ReadExtVectorDecls(
265dd433f0bSAxel Naumann                                      SmallVectorImpl<TypedefNameDecl*> &Decls) {
266dd433f0bSAxel Naumann   for(size_t i = 0; i < Sources.size(); ++i)
267dd433f0bSAxel Naumann     Sources[i]->ReadExtVectorDecls(Decls);
268dd433f0bSAxel Naumann }
269dd433f0bSAxel Naumann 
ReadDeclsToCheckForDeferredDiags(llvm::SmallSetVector<Decl *,4> & Decls)270b670ab7bSYaxun (Sam) Liu void MultiplexExternalSemaSource::ReadDeclsToCheckForDeferredDiags(
271*e6b8320cSWei Wang     llvm::SmallSetVector<Decl *, 4> &Decls) {
272b670ab7bSYaxun (Sam) Liu   for(size_t i = 0; i < Sources.size(); ++i)
273b670ab7bSYaxun (Sam) Liu     Sources[i]->ReadDeclsToCheckForDeferredDiags(Decls);
274b670ab7bSYaxun (Sam) Liu }
275b670ab7bSYaxun (Sam) Liu 
ReadUnusedLocalTypedefNameCandidates(llvm::SmallSetVector<const TypedefNameDecl *,4> & Decls)27672889434SNico Weber void MultiplexExternalSemaSource::ReadUnusedLocalTypedefNameCandidates(
27772889434SNico Weber     llvm::SmallSetVector<const TypedefNameDecl *, 4> &Decls) {
27872889434SNico Weber   for(size_t i = 0; i < Sources.size(); ++i)
27972889434SNico Weber     Sources[i]->ReadUnusedLocalTypedefNameCandidates(Decls);
28072889434SNico Weber }
28172889434SNico Weber 
ReadReferencedSelectors(SmallVectorImpl<std::pair<Selector,SourceLocation>> & Sels)282dd433f0bSAxel Naumann void MultiplexExternalSemaSource::ReadReferencedSelectors(
283dd433f0bSAxel Naumann                   SmallVectorImpl<std::pair<Selector, SourceLocation> > &Sels) {
284dd433f0bSAxel Naumann   for(size_t i = 0; i < Sources.size(); ++i)
285dd433f0bSAxel Naumann     Sources[i]->ReadReferencedSelectors(Sels);
286dd433f0bSAxel Naumann }
287dd433f0bSAxel Naumann 
ReadWeakUndeclaredIdentifiers(SmallVectorImpl<std::pair<IdentifierInfo *,WeakInfo>> & WI)288dd433f0bSAxel Naumann void MultiplexExternalSemaSource::ReadWeakUndeclaredIdentifiers(
289dd433f0bSAxel Naumann                    SmallVectorImpl<std::pair<IdentifierInfo*, WeakInfo> > &WI) {
290dd433f0bSAxel Naumann   for(size_t i = 0; i < Sources.size(); ++i)
291dd433f0bSAxel Naumann     Sources[i]->ReadWeakUndeclaredIdentifiers(WI);
292dd433f0bSAxel Naumann }
293dd433f0bSAxel Naumann 
ReadUsedVTables(SmallVectorImpl<ExternalVTableUse> & VTables)294dd433f0bSAxel Naumann void MultiplexExternalSemaSource::ReadUsedVTables(
295dd433f0bSAxel Naumann                                   SmallVectorImpl<ExternalVTableUse> &VTables) {
296dd433f0bSAxel Naumann   for(size_t i = 0; i < Sources.size(); ++i)
297dd433f0bSAxel Naumann     Sources[i]->ReadUsedVTables(VTables);
298dd433f0bSAxel Naumann }
299dd433f0bSAxel Naumann 
ReadPendingInstantiations(SmallVectorImpl<std::pair<ValueDecl *,SourceLocation>> & Pending)300dd433f0bSAxel Naumann void MultiplexExternalSemaSource::ReadPendingInstantiations(
301dd433f0bSAxel Naumann                                            SmallVectorImpl<std::pair<ValueDecl*,
302dd433f0bSAxel Naumann                                                    SourceLocation> > &Pending) {
303dd433f0bSAxel Naumann   for(size_t i = 0; i < Sources.size(); ++i)
304dd433f0bSAxel Naumann     Sources[i]->ReadPendingInstantiations(Pending);
305dd433f0bSAxel Naumann }
306e40f2baaSRichard Smith 
ReadLateParsedTemplates(llvm::MapVector<const FunctionDecl *,std::unique_ptr<LateParsedTemplate>> & LPTMap)307e40f2baaSRichard Smith void MultiplexExternalSemaSource::ReadLateParsedTemplates(
30828f09c50SJustin Lebar     llvm::MapVector<const FunctionDecl *, std::unique_ptr<LateParsedTemplate>>
30928f09c50SJustin Lebar         &LPTMap) {
310e40f2baaSRichard Smith   for (size_t i = 0; i < Sources.size(); ++i)
311e40f2baaSRichard Smith     Sources[i]->ReadLateParsedTemplates(LPTMap);
312e40f2baaSRichard Smith }
313f0aabdadSKaelyn Uhrain 
CorrectTypo(const DeclarationNameInfo & Typo,int LookupKind,Scope * S,CXXScopeSpec * SS,CorrectionCandidateCallback & CCC,DeclContext * MemberContext,bool EnteringContext,const ObjCObjectPointerType * OPT)314f0aabdadSKaelyn Uhrain TypoCorrection MultiplexExternalSemaSource::CorrectTypo(
315f0aabdadSKaelyn Uhrain                                      const DeclarationNameInfo &Typo,
316f0aabdadSKaelyn Uhrain                                      int LookupKind, Scope *S, CXXScopeSpec *SS,
317f0aabdadSKaelyn Uhrain                                      CorrectionCandidateCallback &CCC,
318f0aabdadSKaelyn Uhrain                                      DeclContext *MemberContext,
319f0aabdadSKaelyn Uhrain                                      bool EnteringContext,
320f0aabdadSKaelyn Uhrain                                      const ObjCObjectPointerType *OPT) {
321f0aabdadSKaelyn Uhrain   for (size_t I = 0, E = Sources.size(); I < E; ++I) {
322f0aabdadSKaelyn Uhrain     if (TypoCorrection C = Sources[I]->CorrectTypo(Typo, LookupKind, S, SS, CCC,
323f0aabdadSKaelyn Uhrain                                                    MemberContext,
324f0aabdadSKaelyn Uhrain                                                    EnteringContext, OPT))
325f0aabdadSKaelyn Uhrain       return C;
326f0aabdadSKaelyn Uhrain   }
327f0aabdadSKaelyn Uhrain   return TypoCorrection();
328f0aabdadSKaelyn Uhrain }
3292c351bbcSKaelyn Uhrain 
MaybeDiagnoseMissingCompleteType(SourceLocation Loc,QualType T)3302c351bbcSKaelyn Uhrain bool MultiplexExternalSemaSource::MaybeDiagnoseMissingCompleteType(
3312c351bbcSKaelyn Uhrain     SourceLocation Loc, QualType T) {
3322c351bbcSKaelyn Uhrain   for (size_t I = 0, E = Sources.size(); I < E; ++I) {
3332c351bbcSKaelyn Uhrain     if (Sources[I]->MaybeDiagnoseMissingCompleteType(Loc, T))
3342c351bbcSKaelyn Uhrain       return true;
3352c351bbcSKaelyn Uhrain   }
3362c351bbcSKaelyn Uhrain   return false;
3372c351bbcSKaelyn Uhrain }
338