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