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