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