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