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;
49243791Sdim  return 0;
50243791Sdim}
51243791Sdim
52243791SdimSelector MultiplexExternalSemaSource::GetExternalSelector(uint32_t ID) {
53243791Sdim  Selector Sel;
54243791Sdim  for(size_t i = 0; i < Sources.size(); ++i) {
55243791Sdim    Sel = Sources[i]->GetExternalSelector(ID);
56243791Sdim    if (!Sel.isNull())
57243791Sdim      return Sel;
58243791Sdim  }
59243791Sdim  return Sel;
60243791Sdim}
61243791Sdim
62243791Sdimuint32_t MultiplexExternalSemaSource::GetNumExternalSelectors() {
63243791Sdim  uint32_t total = 0;
64243791Sdim  for(size_t i = 0; i < Sources.size(); ++i)
65243791Sdim    total += Sources[i]->GetNumExternalSelectors();
66243791Sdim  return total;
67243791Sdim}
68243791Sdim
69243791SdimStmt *MultiplexExternalSemaSource::GetExternalDeclStmt(uint64_t Offset) {
70243791Sdim  for(size_t i = 0; i < Sources.size(); ++i)
71243791Sdim    if (Stmt *Result = Sources[i]->GetExternalDeclStmt(Offset))
72243791Sdim      return Result;
73243791Sdim  return 0;
74243791Sdim}
75243791Sdim
76243791SdimCXXBaseSpecifier *MultiplexExternalSemaSource::GetExternalCXXBaseSpecifiers(
77243791Sdim                                                               uint64_t Offset){
78243791Sdim  for(size_t i = 0; i < Sources.size(); ++i)
79243791Sdim    if (CXXBaseSpecifier *R = Sources[i]->GetExternalCXXBaseSpecifiers(Offset))
80243791Sdim      return R;
81243791Sdim  return 0;
82243791Sdim}
83243791Sdim
84252723Sdimbool MultiplexExternalSemaSource::
85243791SdimFindExternalVisibleDeclsByName(const DeclContext *DC, DeclarationName Name) {
86252723Sdim  bool AnyDeclsFound = false;
87252723Sdim  for (size_t i = 0; i < Sources.size(); ++i)
88252723Sdim    AnyDeclsFound |= Sources[i]->FindExternalVisibleDeclsByName(DC, Name);
89252723Sdim  return AnyDeclsFound;
90243791Sdim}
91243791Sdim
92243791Sdimvoid MultiplexExternalSemaSource::completeVisibleDeclsMap(const DeclContext *DC){
93243791Sdim  for(size_t i = 0; i < Sources.size(); ++i)
94243791Sdim    Sources[i]->completeVisibleDeclsMap(DC);
95243791Sdim}
96243791Sdim
97243791SdimExternalLoadResult MultiplexExternalSemaSource::
98243791SdimFindExternalLexicalDecls(const DeclContext *DC,
99243791Sdim                         bool (*isKindWeWant)(Decl::Kind),
100243791Sdim                         SmallVectorImpl<Decl*> &Result) {
101243791Sdim  for(size_t i = 0; i < Sources.size(); ++i)
102243791Sdim    // FIXME: The semantics of the return result is unclear to me...
103243791Sdim    Sources[i]->FindExternalLexicalDecls(DC, isKindWeWant, Result);
104243791Sdim
105243791Sdim  return ELR_Success;
106243791Sdim}
107243791Sdim
108243791Sdimvoid MultiplexExternalSemaSource::FindFileRegionDecls(FileID File,
109243791Sdim                                                      unsigned Offset,
110243791Sdim                                                      unsigned Length,
111243791Sdim                                                SmallVectorImpl<Decl *> &Decls){
112243791Sdim  for(size_t i = 0; i < Sources.size(); ++i)
113243791Sdim    Sources[i]->FindFileRegionDecls(File, Offset, Length, Decls);
114243791Sdim}
115243791Sdim
116243791Sdimvoid MultiplexExternalSemaSource::CompleteType(TagDecl *Tag) {
117243791Sdim  for(size_t i = 0; i < Sources.size(); ++i)
118243791Sdim    Sources[i]->CompleteType(Tag);
119243791Sdim}
120243791Sdim
121243791Sdimvoid MultiplexExternalSemaSource::CompleteType(ObjCInterfaceDecl *Class) {
122243791Sdim  for(size_t i = 0; i < Sources.size(); ++i)
123243791Sdim    Sources[i]->CompleteType(Class);
124243791Sdim}
125243791Sdim
126243791Sdimvoid MultiplexExternalSemaSource::ReadComments() {
127243791Sdim  for(size_t i = 0; i < Sources.size(); ++i)
128243791Sdim    Sources[i]->ReadComments();
129243791Sdim}
130243791Sdim
131243791Sdimvoid MultiplexExternalSemaSource::StartedDeserializing() {
132243791Sdim  for(size_t i = 0; i < Sources.size(); ++i)
133243791Sdim    Sources[i]->StartedDeserializing();
134243791Sdim}
135243791Sdim
136243791Sdimvoid MultiplexExternalSemaSource::FinishedDeserializing() {
137243791Sdim  for(size_t i = 0; i < Sources.size(); ++i)
138243791Sdim    Sources[i]->FinishedDeserializing();
139243791Sdim}
140243791Sdim
141243791Sdimvoid MultiplexExternalSemaSource::StartTranslationUnit(ASTConsumer *Consumer) {
142243791Sdim  for(size_t i = 0; i < Sources.size(); ++i)
143243791Sdim    Sources[i]->StartTranslationUnit(Consumer);
144243791Sdim}
145243791Sdim
146243791Sdimvoid MultiplexExternalSemaSource::PrintStats() {
147243791Sdim  for(size_t i = 0; i < Sources.size(); ++i)
148243791Sdim    Sources[i]->PrintStats();
149243791Sdim}
150243791Sdim
151243791Sdimbool MultiplexExternalSemaSource::layoutRecordType(const RecordDecl *Record,
152243791Sdim                                                   uint64_t &Size,
153243791Sdim                                                   uint64_t &Alignment,
154243791Sdim                      llvm::DenseMap<const FieldDecl *, uint64_t> &FieldOffsets,
155243791Sdim                  llvm::DenseMap<const CXXRecordDecl *, CharUnits> &BaseOffsets,
156243791Sdim          llvm::DenseMap<const CXXRecordDecl *, CharUnits> &VirtualBaseOffsets){
157243791Sdim  for(size_t i = 0; i < Sources.size(); ++i)
158243791Sdim    if (Sources[i]->layoutRecordType(Record, Size, Alignment, FieldOffsets,
159243791Sdim                                     BaseOffsets, VirtualBaseOffsets))
160243791Sdim      return true;
161243791Sdim  return false;
162243791Sdim}
163243791Sdim
164243791Sdimvoid MultiplexExternalSemaSource::
165243791SdimgetMemoryBufferSizes(MemoryBufferSizes &sizes) const {
166243791Sdim  for(size_t i = 0; i < Sources.size(); ++i)
167243791Sdim    Sources[i]->getMemoryBufferSizes(sizes);
168243791Sdim
169243791Sdim}
170243791Sdim
171243791Sdim//===----------------------------------------------------------------------===//
172243791Sdim// ExternalSemaSource.
173243791Sdim//===----------------------------------------------------------------------===//
174243791Sdim
175243791Sdim
176243791Sdimvoid MultiplexExternalSemaSource::InitializeSema(Sema &S) {
177243791Sdim  for(size_t i = 0; i < Sources.size(); ++i)
178243791Sdim    Sources[i]->InitializeSema(S);
179243791Sdim}
180243791Sdim
181243791Sdimvoid MultiplexExternalSemaSource::ForgetSema() {
182243791Sdim  for(size_t i = 0; i < Sources.size(); ++i)
183243791Sdim    Sources[i]->ForgetSema();
184243791Sdim}
185243791Sdim
186243791Sdimvoid MultiplexExternalSemaSource::ReadMethodPool(Selector Sel) {
187243791Sdim  for(size_t i = 0; i < Sources.size(); ++i)
188243791Sdim    Sources[i]->ReadMethodPool(Sel);
189243791Sdim}
190243791Sdim
191243791Sdimvoid MultiplexExternalSemaSource::ReadKnownNamespaces(
192243791Sdim                                   SmallVectorImpl<NamespaceDecl*> &Namespaces){
193243791Sdim  for(size_t i = 0; i < Sources.size(); ++i)
194243791Sdim    Sources[i]->ReadKnownNamespaces(Namespaces);
195243791Sdim}
196252723Sdim
197252723Sdimvoid MultiplexExternalSemaSource::ReadUndefinedButUsed(
198252723Sdim                         llvm::DenseMap<NamedDecl*, SourceLocation> &Undefined){
199252723Sdim  for(size_t i = 0; i < Sources.size(); ++i)
200252723Sdim    Sources[i]->ReadUndefinedButUsed(Undefined);
201252723Sdim}
202243791Sdim
203243791Sdimbool MultiplexExternalSemaSource::LookupUnqualified(LookupResult &R, Scope *S){
204243791Sdim  for(size_t i = 0; i < Sources.size(); ++i)
205243791Sdim    Sources[i]->LookupUnqualified(R, S);
206243791Sdim
207243791Sdim  return !R.empty();
208243791Sdim}
209243791Sdim
210243791Sdimvoid MultiplexExternalSemaSource::ReadTentativeDefinitions(
211243791Sdim                                     SmallVectorImpl<VarDecl*> &TentativeDefs) {
212243791Sdim  for(size_t i = 0; i < Sources.size(); ++i)
213243791Sdim    Sources[i]->ReadTentativeDefinitions(TentativeDefs);
214243791Sdim}
215243791Sdim
216243791Sdimvoid MultiplexExternalSemaSource::ReadUnusedFileScopedDecls(
217243791Sdim                                SmallVectorImpl<const DeclaratorDecl*> &Decls) {
218243791Sdim  for(size_t i = 0; i < Sources.size(); ++i)
219243791Sdim    Sources[i]->ReadUnusedFileScopedDecls(Decls);
220243791Sdim}
221243791Sdim
222243791Sdimvoid MultiplexExternalSemaSource::ReadDelegatingConstructors(
223243791Sdim                                  SmallVectorImpl<CXXConstructorDecl*> &Decls) {
224243791Sdim  for(size_t i = 0; i < Sources.size(); ++i)
225243791Sdim    Sources[i]->ReadDelegatingConstructors(Decls);
226243791Sdim}
227243791Sdim
228243791Sdimvoid MultiplexExternalSemaSource::ReadExtVectorDecls(
229243791Sdim                                     SmallVectorImpl<TypedefNameDecl*> &Decls) {
230243791Sdim  for(size_t i = 0; i < Sources.size(); ++i)
231243791Sdim    Sources[i]->ReadExtVectorDecls(Decls);
232243791Sdim}
233243791Sdim
234243791Sdimvoid MultiplexExternalSemaSource::ReadDynamicClasses(
235243791Sdim                                       SmallVectorImpl<CXXRecordDecl*> &Decls) {
236243791Sdim  for(size_t i = 0; i < Sources.size(); ++i)
237243791Sdim    Sources[i]->ReadDynamicClasses(Decls);
238243791Sdim}
239243791Sdim
240252723Sdimvoid MultiplexExternalSemaSource::ReadLocallyScopedExternCDecls(
241243791Sdim                                           SmallVectorImpl<NamedDecl*> &Decls) {
242243791Sdim  for(size_t i = 0; i < Sources.size(); ++i)
243252723Sdim    Sources[i]->ReadLocallyScopedExternCDecls(Decls);
244243791Sdim}
245243791Sdim
246243791Sdimvoid MultiplexExternalSemaSource::ReadReferencedSelectors(
247243791Sdim                  SmallVectorImpl<std::pair<Selector, SourceLocation> > &Sels) {
248243791Sdim  for(size_t i = 0; i < Sources.size(); ++i)
249243791Sdim    Sources[i]->ReadReferencedSelectors(Sels);
250243791Sdim}
251243791Sdim
252243791Sdimvoid MultiplexExternalSemaSource::ReadWeakUndeclaredIdentifiers(
253243791Sdim                   SmallVectorImpl<std::pair<IdentifierInfo*, WeakInfo> > &WI) {
254243791Sdim  for(size_t i = 0; i < Sources.size(); ++i)
255243791Sdim    Sources[i]->ReadWeakUndeclaredIdentifiers(WI);
256243791Sdim}
257243791Sdim
258243791Sdimvoid MultiplexExternalSemaSource::ReadUsedVTables(
259243791Sdim                                  SmallVectorImpl<ExternalVTableUse> &VTables) {
260243791Sdim  for(size_t i = 0; i < Sources.size(); ++i)
261243791Sdim    Sources[i]->ReadUsedVTables(VTables);
262243791Sdim}
263243791Sdim
264243791Sdimvoid MultiplexExternalSemaSource::ReadPendingInstantiations(
265243791Sdim                                           SmallVectorImpl<std::pair<ValueDecl*,
266243791Sdim                                                   SourceLocation> > &Pending) {
267243791Sdim  for(size_t i = 0; i < Sources.size(); ++i)
268243791Sdim    Sources[i]->ReadPendingInstantiations(Pending);
269243791Sdim}
270263509Sdim
271263509Sdimvoid MultiplexExternalSemaSource::ReadLateParsedTemplates(
272263509Sdim    llvm::DenseMap<const FunctionDecl *, LateParsedTemplate *> &LPTMap) {
273263509Sdim  for (size_t i = 0; i < Sources.size(); ++i)
274263509Sdim    Sources[i]->ReadLateParsedTemplates(LPTMap);
275263509Sdim}
276263509Sdim
277263509SdimTypoCorrection MultiplexExternalSemaSource::CorrectTypo(
278263509Sdim                                     const DeclarationNameInfo &Typo,
279263509Sdim                                     int LookupKind, Scope *S, CXXScopeSpec *SS,
280263509Sdim                                     CorrectionCandidateCallback &CCC,
281263509Sdim                                     DeclContext *MemberContext,
282263509Sdim                                     bool EnteringContext,
283263509Sdim                                     const ObjCObjectPointerType *OPT) {
284263509Sdim  for (size_t I = 0, E = Sources.size(); I < E; ++I) {
285263509Sdim    if (TypoCorrection C = Sources[I]->CorrectTypo(Typo, LookupKind, S, SS, CCC,
286263509Sdim                                                   MemberContext,
287263509Sdim                                                   EnteringContext, OPT))
288263509Sdim      return C;
289263509Sdim  }
290263509Sdim  return TypoCorrection();
291263509Sdim}
292263509Sdim
293263509Sdimbool MultiplexExternalSemaSource::MaybeDiagnoseMissingCompleteType(
294263509Sdim    SourceLocation Loc, QualType T) {
295263509Sdim  for (size_t I = 0, E = Sources.size(); I < E; ++I) {
296263509Sdim    if (Sources[I]->MaybeDiagnoseMissingCompleteType(Loc, T))
297263509Sdim      return true;
298263509Sdim  }
299263509Sdim  return false;
300263509Sdim}
301