xref: /openbsd-src/gnu/llvm/clang/lib/Sema/MultiplexExternalSemaSource.cpp (revision 12c855180aad702bbcca06e0398d774beeafb155)
1e5dd7070Spatrick //===--- MultiplexExternalSemaSource.cpp  ---------------------------------===//
2e5dd7070Spatrick //
3e5dd7070Spatrick // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4e5dd7070Spatrick // See https://llvm.org/LICENSE.txt for license information.
5e5dd7070Spatrick // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6e5dd7070Spatrick //
7e5dd7070Spatrick //===----------------------------------------------------------------------===//
8e5dd7070Spatrick //
9e5dd7070Spatrick // This file implements the event dispatching to the subscribed clients.
10e5dd7070Spatrick //
11e5dd7070Spatrick //===----------------------------------------------------------------------===//
12e5dd7070Spatrick #include "clang/Sema/MultiplexExternalSemaSource.h"
13e5dd7070Spatrick #include "clang/Sema/Lookup.h"
14e5dd7070Spatrick 
15e5dd7070Spatrick using namespace clang;
16e5dd7070Spatrick 
17e5dd7070Spatrick char MultiplexExternalSemaSource::ID;
18e5dd7070Spatrick 
19e5dd7070Spatrick /// Constructs a new multiplexing external sema source and appends the
20e5dd7070Spatrick /// given element to it.
21e5dd7070Spatrick ///
MultiplexExternalSemaSource(ExternalSemaSource * S1,ExternalSemaSource * S2)22*12c85518Srobert MultiplexExternalSemaSource::MultiplexExternalSemaSource(
23*12c85518Srobert     ExternalSemaSource *S1, ExternalSemaSource *S2) {
24*12c85518Srobert   S1->Retain();
25*12c85518Srobert   S2->Retain();
26*12c85518Srobert   Sources.push_back(S1);
27*12c85518Srobert   Sources.push_back(S2);
28e5dd7070Spatrick }
29e5dd7070Spatrick 
30e5dd7070Spatrick // pin the vtable here.
~MultiplexExternalSemaSource()31*12c85518Srobert MultiplexExternalSemaSource::~MultiplexExternalSemaSource() {
32*12c85518Srobert   for (auto *S : Sources)
33*12c85518Srobert     S->Release();
34*12c85518Srobert }
35e5dd7070Spatrick 
36e5dd7070Spatrick /// Appends new source to the source list.
37e5dd7070Spatrick ///
38e5dd7070Spatrick ///\param[in] source - An ExternalSemaSource.
39e5dd7070Spatrick ///
AddSource(ExternalSemaSource * Source)40*12c85518Srobert void MultiplexExternalSemaSource::AddSource(ExternalSemaSource *Source) {
41*12c85518Srobert   Source->Retain();
42*12c85518Srobert   Sources.push_back(Source);
43e5dd7070Spatrick }
44e5dd7070Spatrick 
45e5dd7070Spatrick //===----------------------------------------------------------------------===//
46e5dd7070Spatrick // ExternalASTSource.
47e5dd7070Spatrick //===----------------------------------------------------------------------===//
48e5dd7070Spatrick 
GetExternalDecl(uint32_t ID)49e5dd7070Spatrick Decl *MultiplexExternalSemaSource::GetExternalDecl(uint32_t ID) {
50e5dd7070Spatrick   for(size_t i = 0; i < Sources.size(); ++i)
51e5dd7070Spatrick     if (Decl *Result = Sources[i]->GetExternalDecl(ID))
52e5dd7070Spatrick       return Result;
53e5dd7070Spatrick   return nullptr;
54e5dd7070Spatrick }
55e5dd7070Spatrick 
CompleteRedeclChain(const Decl * D)56e5dd7070Spatrick void MultiplexExternalSemaSource::CompleteRedeclChain(const Decl *D) {
57e5dd7070Spatrick   for (size_t i = 0; i < Sources.size(); ++i)
58e5dd7070Spatrick     Sources[i]->CompleteRedeclChain(D);
59e5dd7070Spatrick }
60e5dd7070Spatrick 
GetExternalSelector(uint32_t ID)61e5dd7070Spatrick Selector MultiplexExternalSemaSource::GetExternalSelector(uint32_t ID) {
62e5dd7070Spatrick   Selector Sel;
63e5dd7070Spatrick   for(size_t i = 0; i < Sources.size(); ++i) {
64e5dd7070Spatrick     Sel = Sources[i]->GetExternalSelector(ID);
65e5dd7070Spatrick     if (!Sel.isNull())
66e5dd7070Spatrick       return Sel;
67e5dd7070Spatrick   }
68e5dd7070Spatrick   return Sel;
69e5dd7070Spatrick }
70e5dd7070Spatrick 
GetNumExternalSelectors()71e5dd7070Spatrick uint32_t MultiplexExternalSemaSource::GetNumExternalSelectors() {
72e5dd7070Spatrick   uint32_t total = 0;
73e5dd7070Spatrick   for(size_t i = 0; i < Sources.size(); ++i)
74e5dd7070Spatrick     total += Sources[i]->GetNumExternalSelectors();
75e5dd7070Spatrick   return total;
76e5dd7070Spatrick }
77e5dd7070Spatrick 
GetExternalDeclStmt(uint64_t Offset)78e5dd7070Spatrick Stmt *MultiplexExternalSemaSource::GetExternalDeclStmt(uint64_t Offset) {
79e5dd7070Spatrick   for(size_t i = 0; i < Sources.size(); ++i)
80e5dd7070Spatrick     if (Stmt *Result = Sources[i]->GetExternalDeclStmt(Offset))
81e5dd7070Spatrick       return Result;
82e5dd7070Spatrick   return nullptr;
83e5dd7070Spatrick }
84e5dd7070Spatrick 
GetExternalCXXBaseSpecifiers(uint64_t Offset)85e5dd7070Spatrick CXXBaseSpecifier *MultiplexExternalSemaSource::GetExternalCXXBaseSpecifiers(
86e5dd7070Spatrick                                                                uint64_t Offset){
87e5dd7070Spatrick   for(size_t i = 0; i < Sources.size(); ++i)
88e5dd7070Spatrick     if (CXXBaseSpecifier *R = Sources[i]->GetExternalCXXBaseSpecifiers(Offset))
89e5dd7070Spatrick       return R;
90e5dd7070Spatrick   return nullptr;
91e5dd7070Spatrick }
92e5dd7070Spatrick 
93e5dd7070Spatrick CXXCtorInitializer **
GetExternalCXXCtorInitializers(uint64_t Offset)94e5dd7070Spatrick MultiplexExternalSemaSource::GetExternalCXXCtorInitializers(uint64_t Offset) {
95e5dd7070Spatrick   for (auto *S : Sources)
96e5dd7070Spatrick     if (auto *R = S->GetExternalCXXCtorInitializers(Offset))
97e5dd7070Spatrick       return R;
98e5dd7070Spatrick   return nullptr;
99e5dd7070Spatrick }
100e5dd7070Spatrick 
101e5dd7070Spatrick ExternalASTSource::ExtKind
hasExternalDefinitions(const Decl * D)102e5dd7070Spatrick MultiplexExternalSemaSource::hasExternalDefinitions(const Decl *D) {
103e5dd7070Spatrick   for (const auto &S : Sources)
104e5dd7070Spatrick     if (auto EK = S->hasExternalDefinitions(D))
105e5dd7070Spatrick       if (EK != EK_ReplyHazy)
106e5dd7070Spatrick         return EK;
107e5dd7070Spatrick   return EK_ReplyHazy;
108e5dd7070Spatrick }
109e5dd7070Spatrick 
110e5dd7070Spatrick bool MultiplexExternalSemaSource::
FindExternalVisibleDeclsByName(const DeclContext * DC,DeclarationName Name)111e5dd7070Spatrick FindExternalVisibleDeclsByName(const DeclContext *DC, DeclarationName Name) {
112e5dd7070Spatrick   bool AnyDeclsFound = false;
113e5dd7070Spatrick   for (size_t i = 0; i < Sources.size(); ++i)
114e5dd7070Spatrick     AnyDeclsFound |= Sources[i]->FindExternalVisibleDeclsByName(DC, Name);
115e5dd7070Spatrick   return AnyDeclsFound;
116e5dd7070Spatrick }
117e5dd7070Spatrick 
completeVisibleDeclsMap(const DeclContext * DC)118e5dd7070Spatrick void MultiplexExternalSemaSource::completeVisibleDeclsMap(const DeclContext *DC){
119e5dd7070Spatrick   for(size_t i = 0; i < Sources.size(); ++i)
120e5dd7070Spatrick     Sources[i]->completeVisibleDeclsMap(DC);
121e5dd7070Spatrick }
122e5dd7070Spatrick 
FindExternalLexicalDecls(const DeclContext * DC,llvm::function_ref<bool (Decl::Kind)> IsKindWeWant,SmallVectorImpl<Decl * > & Result)123e5dd7070Spatrick void MultiplexExternalSemaSource::FindExternalLexicalDecls(
124e5dd7070Spatrick     const DeclContext *DC, llvm::function_ref<bool(Decl::Kind)> IsKindWeWant,
125e5dd7070Spatrick     SmallVectorImpl<Decl *> &Result) {
126e5dd7070Spatrick   for(size_t i = 0; i < Sources.size(); ++i)
127e5dd7070Spatrick     Sources[i]->FindExternalLexicalDecls(DC, IsKindWeWant, Result);
128e5dd7070Spatrick }
129e5dd7070Spatrick 
FindFileRegionDecls(FileID File,unsigned Offset,unsigned Length,SmallVectorImpl<Decl * > & Decls)130e5dd7070Spatrick void MultiplexExternalSemaSource::FindFileRegionDecls(FileID File,
131e5dd7070Spatrick                                                       unsigned Offset,
132e5dd7070Spatrick                                                       unsigned Length,
133e5dd7070Spatrick                                                 SmallVectorImpl<Decl *> &Decls){
134e5dd7070Spatrick   for(size_t i = 0; i < Sources.size(); ++i)
135e5dd7070Spatrick     Sources[i]->FindFileRegionDecls(File, Offset, Length, Decls);
136e5dd7070Spatrick }
137e5dd7070Spatrick 
CompleteType(TagDecl * Tag)138e5dd7070Spatrick void MultiplexExternalSemaSource::CompleteType(TagDecl *Tag) {
139e5dd7070Spatrick   for(size_t i = 0; i < Sources.size(); ++i)
140e5dd7070Spatrick     Sources[i]->CompleteType(Tag);
141e5dd7070Spatrick }
142e5dd7070Spatrick 
CompleteType(ObjCInterfaceDecl * Class)143e5dd7070Spatrick void MultiplexExternalSemaSource::CompleteType(ObjCInterfaceDecl *Class) {
144e5dd7070Spatrick   for(size_t i = 0; i < Sources.size(); ++i)
145e5dd7070Spatrick     Sources[i]->CompleteType(Class);
146e5dd7070Spatrick }
147e5dd7070Spatrick 
ReadComments()148e5dd7070Spatrick void MultiplexExternalSemaSource::ReadComments() {
149e5dd7070Spatrick   for(size_t i = 0; i < Sources.size(); ++i)
150e5dd7070Spatrick     Sources[i]->ReadComments();
151e5dd7070Spatrick }
152e5dd7070Spatrick 
StartedDeserializing()153e5dd7070Spatrick void MultiplexExternalSemaSource::StartedDeserializing() {
154e5dd7070Spatrick   for(size_t i = 0; i < Sources.size(); ++i)
155e5dd7070Spatrick     Sources[i]->StartedDeserializing();
156e5dd7070Spatrick }
157e5dd7070Spatrick 
FinishedDeserializing()158e5dd7070Spatrick void MultiplexExternalSemaSource::FinishedDeserializing() {
159e5dd7070Spatrick   for(size_t i = 0; i < Sources.size(); ++i)
160e5dd7070Spatrick     Sources[i]->FinishedDeserializing();
161e5dd7070Spatrick }
162e5dd7070Spatrick 
StartTranslationUnit(ASTConsumer * Consumer)163e5dd7070Spatrick void MultiplexExternalSemaSource::StartTranslationUnit(ASTConsumer *Consumer) {
164e5dd7070Spatrick   for(size_t i = 0; i < Sources.size(); ++i)
165e5dd7070Spatrick     Sources[i]->StartTranslationUnit(Consumer);
166e5dd7070Spatrick }
167e5dd7070Spatrick 
PrintStats()168e5dd7070Spatrick void MultiplexExternalSemaSource::PrintStats() {
169e5dd7070Spatrick   for(size_t i = 0; i < Sources.size(); ++i)
170e5dd7070Spatrick     Sources[i]->PrintStats();
171e5dd7070Spatrick }
172e5dd7070Spatrick 
getModule(unsigned ID)173e5dd7070Spatrick Module *MultiplexExternalSemaSource::getModule(unsigned ID) {
174e5dd7070Spatrick   for (size_t i = 0; i < Sources.size(); ++i)
175e5dd7070Spatrick     if (auto M = Sources[i]->getModule(ID))
176e5dd7070Spatrick       return M;
177e5dd7070Spatrick   return nullptr;
178e5dd7070Spatrick }
179e5dd7070Spatrick 
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)180e5dd7070Spatrick bool MultiplexExternalSemaSource::layoutRecordType(const RecordDecl *Record,
181e5dd7070Spatrick                                                    uint64_t &Size,
182e5dd7070Spatrick                                                    uint64_t &Alignment,
183e5dd7070Spatrick                       llvm::DenseMap<const FieldDecl *, uint64_t> &FieldOffsets,
184e5dd7070Spatrick                   llvm::DenseMap<const CXXRecordDecl *, CharUnits> &BaseOffsets,
185e5dd7070Spatrick           llvm::DenseMap<const CXXRecordDecl *, CharUnits> &VirtualBaseOffsets){
186e5dd7070Spatrick   for(size_t i = 0; i < Sources.size(); ++i)
187e5dd7070Spatrick     if (Sources[i]->layoutRecordType(Record, Size, Alignment, FieldOffsets,
188e5dd7070Spatrick                                      BaseOffsets, VirtualBaseOffsets))
189e5dd7070Spatrick       return true;
190e5dd7070Spatrick   return false;
191e5dd7070Spatrick }
192e5dd7070Spatrick 
193e5dd7070Spatrick void MultiplexExternalSemaSource::
getMemoryBufferSizes(MemoryBufferSizes & sizes) const194e5dd7070Spatrick getMemoryBufferSizes(MemoryBufferSizes &sizes) const {
195e5dd7070Spatrick   for(size_t i = 0; i < Sources.size(); ++i)
196e5dd7070Spatrick     Sources[i]->getMemoryBufferSizes(sizes);
197e5dd7070Spatrick 
198e5dd7070Spatrick }
199e5dd7070Spatrick 
200e5dd7070Spatrick //===----------------------------------------------------------------------===//
201e5dd7070Spatrick // ExternalSemaSource.
202e5dd7070Spatrick //===----------------------------------------------------------------------===//
203e5dd7070Spatrick 
204e5dd7070Spatrick 
InitializeSema(Sema & S)205e5dd7070Spatrick void MultiplexExternalSemaSource::InitializeSema(Sema &S) {
206e5dd7070Spatrick   for(size_t i = 0; i < Sources.size(); ++i)
207e5dd7070Spatrick     Sources[i]->InitializeSema(S);
208e5dd7070Spatrick }
209e5dd7070Spatrick 
ForgetSema()210e5dd7070Spatrick void MultiplexExternalSemaSource::ForgetSema() {
211e5dd7070Spatrick   for(size_t i = 0; i < Sources.size(); ++i)
212e5dd7070Spatrick     Sources[i]->ForgetSema();
213e5dd7070Spatrick }
214e5dd7070Spatrick 
ReadMethodPool(Selector Sel)215e5dd7070Spatrick void MultiplexExternalSemaSource::ReadMethodPool(Selector Sel) {
216e5dd7070Spatrick   for(size_t i = 0; i < Sources.size(); ++i)
217e5dd7070Spatrick     Sources[i]->ReadMethodPool(Sel);
218e5dd7070Spatrick }
219e5dd7070Spatrick 
updateOutOfDateSelector(Selector Sel)220e5dd7070Spatrick void MultiplexExternalSemaSource::updateOutOfDateSelector(Selector Sel) {
221e5dd7070Spatrick   for(size_t i = 0; i < Sources.size(); ++i)
222e5dd7070Spatrick     Sources[i]->updateOutOfDateSelector(Sel);
223e5dd7070Spatrick }
224e5dd7070Spatrick 
ReadKnownNamespaces(SmallVectorImpl<NamespaceDecl * > & Namespaces)225e5dd7070Spatrick void MultiplexExternalSemaSource::ReadKnownNamespaces(
226e5dd7070Spatrick                                    SmallVectorImpl<NamespaceDecl*> &Namespaces){
227e5dd7070Spatrick   for(size_t i = 0; i < Sources.size(); ++i)
228e5dd7070Spatrick     Sources[i]->ReadKnownNamespaces(Namespaces);
229e5dd7070Spatrick }
230e5dd7070Spatrick 
ReadUndefinedButUsed(llvm::MapVector<NamedDecl *,SourceLocation> & Undefined)231e5dd7070Spatrick void MultiplexExternalSemaSource::ReadUndefinedButUsed(
232e5dd7070Spatrick     llvm::MapVector<NamedDecl *, SourceLocation> &Undefined) {
233e5dd7070Spatrick   for(size_t i = 0; i < Sources.size(); ++i)
234e5dd7070Spatrick     Sources[i]->ReadUndefinedButUsed(Undefined);
235e5dd7070Spatrick }
236e5dd7070Spatrick 
ReadMismatchingDeleteExpressions(llvm::MapVector<FieldDecl *,llvm::SmallVector<std::pair<SourceLocation,bool>,4>> & Exprs)237e5dd7070Spatrick void MultiplexExternalSemaSource::ReadMismatchingDeleteExpressions(
238e5dd7070Spatrick     llvm::MapVector<FieldDecl *,
239e5dd7070Spatrick                     llvm::SmallVector<std::pair<SourceLocation, bool>, 4>> &
240e5dd7070Spatrick         Exprs) {
241e5dd7070Spatrick   for (auto &Source : Sources)
242e5dd7070Spatrick     Source->ReadMismatchingDeleteExpressions(Exprs);
243e5dd7070Spatrick }
244e5dd7070Spatrick 
LookupUnqualified(LookupResult & R,Scope * S)245e5dd7070Spatrick bool MultiplexExternalSemaSource::LookupUnqualified(LookupResult &R, Scope *S){
246e5dd7070Spatrick   for(size_t i = 0; i < Sources.size(); ++i)
247e5dd7070Spatrick     Sources[i]->LookupUnqualified(R, S);
248e5dd7070Spatrick 
249e5dd7070Spatrick   return !R.empty();
250e5dd7070Spatrick }
251e5dd7070Spatrick 
ReadTentativeDefinitions(SmallVectorImpl<VarDecl * > & TentativeDefs)252e5dd7070Spatrick void MultiplexExternalSemaSource::ReadTentativeDefinitions(
253e5dd7070Spatrick                                      SmallVectorImpl<VarDecl*> &TentativeDefs) {
254e5dd7070Spatrick   for(size_t i = 0; i < Sources.size(); ++i)
255e5dd7070Spatrick     Sources[i]->ReadTentativeDefinitions(TentativeDefs);
256e5dd7070Spatrick }
257e5dd7070Spatrick 
ReadUnusedFileScopedDecls(SmallVectorImpl<const DeclaratorDecl * > & Decls)258e5dd7070Spatrick void MultiplexExternalSemaSource::ReadUnusedFileScopedDecls(
259e5dd7070Spatrick                                 SmallVectorImpl<const DeclaratorDecl*> &Decls) {
260e5dd7070Spatrick   for(size_t i = 0; i < Sources.size(); ++i)
261e5dd7070Spatrick     Sources[i]->ReadUnusedFileScopedDecls(Decls);
262e5dd7070Spatrick }
263e5dd7070Spatrick 
ReadDelegatingConstructors(SmallVectorImpl<CXXConstructorDecl * > & Decls)264e5dd7070Spatrick void MultiplexExternalSemaSource::ReadDelegatingConstructors(
265e5dd7070Spatrick                                   SmallVectorImpl<CXXConstructorDecl*> &Decls) {
266e5dd7070Spatrick   for(size_t i = 0; i < Sources.size(); ++i)
267e5dd7070Spatrick     Sources[i]->ReadDelegatingConstructors(Decls);
268e5dd7070Spatrick }
269e5dd7070Spatrick 
ReadExtVectorDecls(SmallVectorImpl<TypedefNameDecl * > & Decls)270e5dd7070Spatrick void MultiplexExternalSemaSource::ReadExtVectorDecls(
271e5dd7070Spatrick                                      SmallVectorImpl<TypedefNameDecl*> &Decls) {
272e5dd7070Spatrick   for(size_t i = 0; i < Sources.size(); ++i)
273e5dd7070Spatrick     Sources[i]->ReadExtVectorDecls(Decls);
274e5dd7070Spatrick }
275e5dd7070Spatrick 
ReadDeclsToCheckForDeferredDiags(llvm::SmallSetVector<Decl *,4> & Decls)276ec727ea7Spatrick void MultiplexExternalSemaSource::ReadDeclsToCheckForDeferredDiags(
277a9ac8606Spatrick     llvm::SmallSetVector<Decl *, 4> &Decls) {
278ec727ea7Spatrick   for(size_t i = 0; i < Sources.size(); ++i)
279ec727ea7Spatrick     Sources[i]->ReadDeclsToCheckForDeferredDiags(Decls);
280ec727ea7Spatrick }
281ec727ea7Spatrick 
ReadUnusedLocalTypedefNameCandidates(llvm::SmallSetVector<const TypedefNameDecl *,4> & Decls)282e5dd7070Spatrick void MultiplexExternalSemaSource::ReadUnusedLocalTypedefNameCandidates(
283e5dd7070Spatrick     llvm::SmallSetVector<const TypedefNameDecl *, 4> &Decls) {
284e5dd7070Spatrick   for(size_t i = 0; i < Sources.size(); ++i)
285e5dd7070Spatrick     Sources[i]->ReadUnusedLocalTypedefNameCandidates(Decls);
286e5dd7070Spatrick }
287e5dd7070Spatrick 
ReadReferencedSelectors(SmallVectorImpl<std::pair<Selector,SourceLocation>> & Sels)288e5dd7070Spatrick void MultiplexExternalSemaSource::ReadReferencedSelectors(
289e5dd7070Spatrick                   SmallVectorImpl<std::pair<Selector, SourceLocation> > &Sels) {
290e5dd7070Spatrick   for(size_t i = 0; i < Sources.size(); ++i)
291e5dd7070Spatrick     Sources[i]->ReadReferencedSelectors(Sels);
292e5dd7070Spatrick }
293e5dd7070Spatrick 
ReadWeakUndeclaredIdentifiers(SmallVectorImpl<std::pair<IdentifierInfo *,WeakInfo>> & WI)294e5dd7070Spatrick void MultiplexExternalSemaSource::ReadWeakUndeclaredIdentifiers(
295e5dd7070Spatrick                    SmallVectorImpl<std::pair<IdentifierInfo*, WeakInfo> > &WI) {
296e5dd7070Spatrick   for(size_t i = 0; i < Sources.size(); ++i)
297e5dd7070Spatrick     Sources[i]->ReadWeakUndeclaredIdentifiers(WI);
298e5dd7070Spatrick }
299e5dd7070Spatrick 
ReadUsedVTables(SmallVectorImpl<ExternalVTableUse> & VTables)300e5dd7070Spatrick void MultiplexExternalSemaSource::ReadUsedVTables(
301e5dd7070Spatrick                                   SmallVectorImpl<ExternalVTableUse> &VTables) {
302e5dd7070Spatrick   for(size_t i = 0; i < Sources.size(); ++i)
303e5dd7070Spatrick     Sources[i]->ReadUsedVTables(VTables);
304e5dd7070Spatrick }
305e5dd7070Spatrick 
ReadPendingInstantiations(SmallVectorImpl<std::pair<ValueDecl *,SourceLocation>> & Pending)306e5dd7070Spatrick void MultiplexExternalSemaSource::ReadPendingInstantiations(
307e5dd7070Spatrick                                            SmallVectorImpl<std::pair<ValueDecl*,
308e5dd7070Spatrick                                                    SourceLocation> > &Pending) {
309e5dd7070Spatrick   for(size_t i = 0; i < Sources.size(); ++i)
310e5dd7070Spatrick     Sources[i]->ReadPendingInstantiations(Pending);
311e5dd7070Spatrick }
312e5dd7070Spatrick 
ReadLateParsedTemplates(llvm::MapVector<const FunctionDecl *,std::unique_ptr<LateParsedTemplate>> & LPTMap)313e5dd7070Spatrick void MultiplexExternalSemaSource::ReadLateParsedTemplates(
314e5dd7070Spatrick     llvm::MapVector<const FunctionDecl *, std::unique_ptr<LateParsedTemplate>>
315e5dd7070Spatrick         &LPTMap) {
316e5dd7070Spatrick   for (size_t i = 0; i < Sources.size(); ++i)
317e5dd7070Spatrick     Sources[i]->ReadLateParsedTemplates(LPTMap);
318e5dd7070Spatrick }
319e5dd7070Spatrick 
CorrectTypo(const DeclarationNameInfo & Typo,int LookupKind,Scope * S,CXXScopeSpec * SS,CorrectionCandidateCallback & CCC,DeclContext * MemberContext,bool EnteringContext,const ObjCObjectPointerType * OPT)320e5dd7070Spatrick TypoCorrection MultiplexExternalSemaSource::CorrectTypo(
321e5dd7070Spatrick                                      const DeclarationNameInfo &Typo,
322e5dd7070Spatrick                                      int LookupKind, Scope *S, CXXScopeSpec *SS,
323e5dd7070Spatrick                                      CorrectionCandidateCallback &CCC,
324e5dd7070Spatrick                                      DeclContext *MemberContext,
325e5dd7070Spatrick                                      bool EnteringContext,
326e5dd7070Spatrick                                      const ObjCObjectPointerType *OPT) {
327e5dd7070Spatrick   for (size_t I = 0, E = Sources.size(); I < E; ++I) {
328e5dd7070Spatrick     if (TypoCorrection C = Sources[I]->CorrectTypo(Typo, LookupKind, S, SS, CCC,
329e5dd7070Spatrick                                                    MemberContext,
330e5dd7070Spatrick                                                    EnteringContext, OPT))
331e5dd7070Spatrick       return C;
332e5dd7070Spatrick   }
333e5dd7070Spatrick   return TypoCorrection();
334e5dd7070Spatrick }
335e5dd7070Spatrick 
MaybeDiagnoseMissingCompleteType(SourceLocation Loc,QualType T)336e5dd7070Spatrick bool MultiplexExternalSemaSource::MaybeDiagnoseMissingCompleteType(
337e5dd7070Spatrick     SourceLocation Loc, QualType T) {
338e5dd7070Spatrick   for (size_t I = 0, E = Sources.size(); I < E; ++I) {
339e5dd7070Spatrick     if (Sources[I]->MaybeDiagnoseMissingCompleteType(Loc, T))
340e5dd7070Spatrick       return true;
341e5dd7070Spatrick   }
342e5dd7070Spatrick   return false;
343e5dd7070Spatrick }
344