MultiplexExternalSemaSource.cpp revision 296417
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
200243791Sdimvoid MultiplexExternalSemaSource::ReadKnownNamespaces(
201243791Sdim                                   SmallVectorImpl<NamespaceDecl*> &Namespaces){
202243791Sdim  for(size_t i = 0; i < Sources.size(); ++i)
203243791Sdim    Sources[i]->ReadKnownNamespaces(Namespaces);
204243791Sdim}
205249423Sdim
206249423Sdimvoid MultiplexExternalSemaSource::ReadUndefinedButUsed(
207249423Sdim                         llvm::DenseMap<NamedDecl*, SourceLocation> &Undefined){
208249423Sdim  for(size_t i = 0; i < Sources.size(); ++i)
209249423Sdim    Sources[i]->ReadUndefinedButUsed(Undefined);
210249423Sdim}
211288943Sdim
212288943Sdimvoid MultiplexExternalSemaSource::ReadMismatchingDeleteExpressions(
213288943Sdim    llvm::MapVector<FieldDecl *,
214288943Sdim                    llvm::SmallVector<std::pair<SourceLocation, bool>, 4>> &
215288943Sdim        Exprs) {
216288943Sdim  for (auto &Source : Sources)
217288943Sdim    Source->ReadMismatchingDeleteExpressions(Exprs);
218288943Sdim}
219288943Sdim
220243791Sdimbool MultiplexExternalSemaSource::LookupUnqualified(LookupResult &R, Scope *S){
221243791Sdim  for(size_t i = 0; i < Sources.size(); ++i)
222243791Sdim    Sources[i]->LookupUnqualified(R, S);
223243791Sdim
224243791Sdim  return !R.empty();
225243791Sdim}
226243791Sdim
227243791Sdimvoid MultiplexExternalSemaSource::ReadTentativeDefinitions(
228243791Sdim                                     SmallVectorImpl<VarDecl*> &TentativeDefs) {
229243791Sdim  for(size_t i = 0; i < Sources.size(); ++i)
230243791Sdim    Sources[i]->ReadTentativeDefinitions(TentativeDefs);
231243791Sdim}
232243791Sdim
233243791Sdimvoid MultiplexExternalSemaSource::ReadUnusedFileScopedDecls(
234243791Sdim                                SmallVectorImpl<const DeclaratorDecl*> &Decls) {
235243791Sdim  for(size_t i = 0; i < Sources.size(); ++i)
236243791Sdim    Sources[i]->ReadUnusedFileScopedDecls(Decls);
237243791Sdim}
238243791Sdim
239243791Sdimvoid MultiplexExternalSemaSource::ReadDelegatingConstructors(
240243791Sdim                                  SmallVectorImpl<CXXConstructorDecl*> &Decls) {
241243791Sdim  for(size_t i = 0; i < Sources.size(); ++i)
242243791Sdim    Sources[i]->ReadDelegatingConstructors(Decls);
243243791Sdim}
244243791Sdim
245243791Sdimvoid MultiplexExternalSemaSource::ReadExtVectorDecls(
246243791Sdim                                     SmallVectorImpl<TypedefNameDecl*> &Decls) {
247243791Sdim  for(size_t i = 0; i < Sources.size(); ++i)
248243791Sdim    Sources[i]->ReadExtVectorDecls(Decls);
249243791Sdim}
250243791Sdim
251280031Sdimvoid MultiplexExternalSemaSource::ReadUnusedLocalTypedefNameCandidates(
252280031Sdim    llvm::SmallSetVector<const TypedefNameDecl *, 4> &Decls) {
253280031Sdim  for(size_t i = 0; i < Sources.size(); ++i)
254280031Sdim    Sources[i]->ReadUnusedLocalTypedefNameCandidates(Decls);
255280031Sdim}
256280031Sdim
257243791Sdimvoid MultiplexExternalSemaSource::ReadReferencedSelectors(
258243791Sdim                  SmallVectorImpl<std::pair<Selector, SourceLocation> > &Sels) {
259243791Sdim  for(size_t i = 0; i < Sources.size(); ++i)
260243791Sdim    Sources[i]->ReadReferencedSelectors(Sels);
261243791Sdim}
262243791Sdim
263243791Sdimvoid MultiplexExternalSemaSource::ReadWeakUndeclaredIdentifiers(
264243791Sdim                   SmallVectorImpl<std::pair<IdentifierInfo*, WeakInfo> > &WI) {
265243791Sdim  for(size_t i = 0; i < Sources.size(); ++i)
266243791Sdim    Sources[i]->ReadWeakUndeclaredIdentifiers(WI);
267243791Sdim}
268243791Sdim
269243791Sdimvoid MultiplexExternalSemaSource::ReadUsedVTables(
270243791Sdim                                  SmallVectorImpl<ExternalVTableUse> &VTables) {
271243791Sdim  for(size_t i = 0; i < Sources.size(); ++i)
272243791Sdim    Sources[i]->ReadUsedVTables(VTables);
273243791Sdim}
274243791Sdim
275243791Sdimvoid MultiplexExternalSemaSource::ReadPendingInstantiations(
276243791Sdim                                           SmallVectorImpl<std::pair<ValueDecl*,
277243791Sdim                                                   SourceLocation> > &Pending) {
278243791Sdim  for(size_t i = 0; i < Sources.size(); ++i)
279243791Sdim    Sources[i]->ReadPendingInstantiations(Pending);
280243791Sdim}
281261991Sdim
282261991Sdimvoid MultiplexExternalSemaSource::ReadLateParsedTemplates(
283288943Sdim    llvm::MapVector<const FunctionDecl *, LateParsedTemplate *> &LPTMap) {
284261991Sdim  for (size_t i = 0; i < Sources.size(); ++i)
285261991Sdim    Sources[i]->ReadLateParsedTemplates(LPTMap);
286261991Sdim}
287261991Sdim
288261991SdimTypoCorrection MultiplexExternalSemaSource::CorrectTypo(
289261991Sdim                                     const DeclarationNameInfo &Typo,
290261991Sdim                                     int LookupKind, Scope *S, CXXScopeSpec *SS,
291261991Sdim                                     CorrectionCandidateCallback &CCC,
292261991Sdim                                     DeclContext *MemberContext,
293261991Sdim                                     bool EnteringContext,
294261991Sdim                                     const ObjCObjectPointerType *OPT) {
295261991Sdim  for (size_t I = 0, E = Sources.size(); I < E; ++I) {
296261991Sdim    if (TypoCorrection C = Sources[I]->CorrectTypo(Typo, LookupKind, S, SS, CCC,
297261991Sdim                                                   MemberContext,
298261991Sdim                                                   EnteringContext, OPT))
299261991Sdim      return C;
300261991Sdim  }
301261991Sdim  return TypoCorrection();
302261991Sdim}
303261991Sdim
304261991Sdimbool MultiplexExternalSemaSource::MaybeDiagnoseMissingCompleteType(
305261991Sdim    SourceLocation Loc, QualType T) {
306261991Sdim  for (size_t I = 0, E = Sources.size(); I < E; ++I) {
307261991Sdim    if (Sources[I]->MaybeDiagnoseMissingCompleteType(Loc, T))
308261991Sdim      return true;
309261991Sdim  }
310261991Sdim  return false;
311261991Sdim}
312