1 //===--- MultiplexExternalSemaSource.cpp ---------------------------------===//
3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4 // See https://llvm.org/LICENSE.txt for license information.
5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
7 //===----------------------------------------------------------------------===//
9 // This file implements the event dispatching to the subscribed clients.
11 //===----------------------------------------------------------------------===//
12 #include "clang/Sema/MultiplexExternalSemaSource.h"
13 #include "clang/Sema/Lookup.h"
15 using namespace clang
;
17 char MultiplexExternalSemaSource::ID
;
19 /// Constructs a new multiplexing external sema source and appends the
20 /// given element to it.
22 MultiplexExternalSemaSource::MultiplexExternalSemaSource(
23 ExternalSemaSource
*S1
, ExternalSemaSource
*S2
) {
26 Sources
.push_back(S1
);
27 Sources
.push_back(S2
);
30 // pin the vtable here.
31 MultiplexExternalSemaSource::~MultiplexExternalSemaSource() {
32 for (auto *S
: Sources
)
36 /// Appends new source to the source list.
38 ///\param[in] source - An ExternalSemaSource.
40 void MultiplexExternalSemaSource::AddSource(ExternalSemaSource
*Source
) {
42 Sources
.push_back(Source
);
45 //===----------------------------------------------------------------------===//
47 //===----------------------------------------------------------------------===//
49 Decl
*MultiplexExternalSemaSource::GetExternalDecl(uint32_t ID
) {
50 for(size_t i
= 0; i
< Sources
.size(); ++i
)
51 if (Decl
*Result
= Sources
[i
]->GetExternalDecl(ID
))
56 void MultiplexExternalSemaSource::CompleteRedeclChain(const Decl
*D
) {
57 for (size_t i
= 0; i
< Sources
.size(); ++i
)
58 Sources
[i
]->CompleteRedeclChain(D
);
61 Selector
MultiplexExternalSemaSource::GetExternalSelector(uint32_t ID
) {
63 for(size_t i
= 0; i
< Sources
.size(); ++i
) {
64 Sel
= Sources
[i
]->GetExternalSelector(ID
);
71 uint32_t MultiplexExternalSemaSource::GetNumExternalSelectors() {
73 for(size_t i
= 0; i
< Sources
.size(); ++i
)
74 total
+= Sources
[i
]->GetNumExternalSelectors();
78 Stmt
*MultiplexExternalSemaSource::GetExternalDeclStmt(uint64_t Offset
) {
79 for(size_t i
= 0; i
< Sources
.size(); ++i
)
80 if (Stmt
*Result
= Sources
[i
]->GetExternalDeclStmt(Offset
))
85 CXXBaseSpecifier
*MultiplexExternalSemaSource::GetExternalCXXBaseSpecifiers(
87 for(size_t i
= 0; i
< Sources
.size(); ++i
)
88 if (CXXBaseSpecifier
*R
= Sources
[i
]->GetExternalCXXBaseSpecifiers(Offset
))
94 MultiplexExternalSemaSource::GetExternalCXXCtorInitializers(uint64_t Offset
) {
95 for (auto *S
: Sources
)
96 if (auto *R
= S
->GetExternalCXXCtorInitializers(Offset
))
101 ExternalASTSource::ExtKind
102 MultiplexExternalSemaSource::hasExternalDefinitions(const Decl
*D
) {
103 for (const auto &S
: Sources
)
104 if (auto EK
= S
->hasExternalDefinitions(D
))
105 if (EK
!= EK_ReplyHazy
)
110 bool MultiplexExternalSemaSource::
111 FindExternalVisibleDeclsByName(const DeclContext
*DC
, DeclarationName Name
) {
112 bool AnyDeclsFound
= false;
113 for (size_t i
= 0; i
< Sources
.size(); ++i
)
114 AnyDeclsFound
|= Sources
[i
]->FindExternalVisibleDeclsByName(DC
, Name
);
115 return AnyDeclsFound
;
118 void MultiplexExternalSemaSource::completeVisibleDeclsMap(const DeclContext
*DC
){
119 for(size_t i
= 0; i
< Sources
.size(); ++i
)
120 Sources
[i
]->completeVisibleDeclsMap(DC
);
123 void MultiplexExternalSemaSource::FindExternalLexicalDecls(
124 const DeclContext
*DC
, llvm::function_ref
<bool(Decl::Kind
)> IsKindWeWant
,
125 SmallVectorImpl
<Decl
*> &Result
) {
126 for(size_t i
= 0; i
< Sources
.size(); ++i
)
127 Sources
[i
]->FindExternalLexicalDecls(DC
, IsKindWeWant
, Result
);
130 void MultiplexExternalSemaSource::FindFileRegionDecls(FileID File
,
133 SmallVectorImpl
<Decl
*> &Decls
){
134 for(size_t i
= 0; i
< Sources
.size(); ++i
)
135 Sources
[i
]->FindFileRegionDecls(File
, Offset
, Length
, Decls
);
138 void MultiplexExternalSemaSource::CompleteType(TagDecl
*Tag
) {
139 for(size_t i
= 0; i
< Sources
.size(); ++i
)
140 Sources
[i
]->CompleteType(Tag
);
143 void MultiplexExternalSemaSource::CompleteType(ObjCInterfaceDecl
*Class
) {
144 for(size_t i
= 0; i
< Sources
.size(); ++i
)
145 Sources
[i
]->CompleteType(Class
);
148 void MultiplexExternalSemaSource::ReadComments() {
149 for(size_t i
= 0; i
< Sources
.size(); ++i
)
150 Sources
[i
]->ReadComments();
153 void MultiplexExternalSemaSource::StartedDeserializing() {
154 for(size_t i
= 0; i
< Sources
.size(); ++i
)
155 Sources
[i
]->StartedDeserializing();
158 void MultiplexExternalSemaSource::FinishedDeserializing() {
159 for(size_t i
= 0; i
< Sources
.size(); ++i
)
160 Sources
[i
]->FinishedDeserializing();
163 void MultiplexExternalSemaSource::StartTranslationUnit(ASTConsumer
*Consumer
) {
164 for(size_t i
= 0; i
< Sources
.size(); ++i
)
165 Sources
[i
]->StartTranslationUnit(Consumer
);
168 void MultiplexExternalSemaSource::PrintStats() {
169 for(size_t i
= 0; i
< Sources
.size(); ++i
)
170 Sources
[i
]->PrintStats();
173 Module
*MultiplexExternalSemaSource::getModule(unsigned ID
) {
174 for (size_t i
= 0; i
< Sources
.size(); ++i
)
175 if (auto M
= Sources
[i
]->getModule(ID
))
180 bool MultiplexExternalSemaSource::layoutRecordType(const RecordDecl
*Record
,
183 llvm::DenseMap
<const FieldDecl
*, uint64_t> &FieldOffsets
,
184 llvm::DenseMap
<const CXXRecordDecl
*, CharUnits
> &BaseOffsets
,
185 llvm::DenseMap
<const CXXRecordDecl
*, CharUnits
> &VirtualBaseOffsets
){
186 for(size_t i
= 0; i
< Sources
.size(); ++i
)
187 if (Sources
[i
]->layoutRecordType(Record
, Size
, Alignment
, FieldOffsets
,
188 BaseOffsets
, VirtualBaseOffsets
))
193 void MultiplexExternalSemaSource::
194 getMemoryBufferSizes(MemoryBufferSizes
&sizes
) const {
195 for(size_t i
= 0; i
< Sources
.size(); ++i
)
196 Sources
[i
]->getMemoryBufferSizes(sizes
);
200 //===----------------------------------------------------------------------===//
201 // ExternalSemaSource.
202 //===----------------------------------------------------------------------===//
205 void MultiplexExternalSemaSource::InitializeSema(Sema
&S
) {
206 for(size_t i
= 0; i
< Sources
.size(); ++i
)
207 Sources
[i
]->InitializeSema(S
);
210 void MultiplexExternalSemaSource::ForgetSema() {
211 for(size_t i
= 0; i
< Sources
.size(); ++i
)
212 Sources
[i
]->ForgetSema();
215 void MultiplexExternalSemaSource::ReadMethodPool(Selector Sel
) {
216 for(size_t i
= 0; i
< Sources
.size(); ++i
)
217 Sources
[i
]->ReadMethodPool(Sel
);
220 void MultiplexExternalSemaSource::updateOutOfDateSelector(Selector Sel
) {
221 for(size_t i
= 0; i
< Sources
.size(); ++i
)
222 Sources
[i
]->updateOutOfDateSelector(Sel
);
225 void MultiplexExternalSemaSource::ReadKnownNamespaces(
226 SmallVectorImpl
<NamespaceDecl
*> &Namespaces
){
227 for(size_t i
= 0; i
< Sources
.size(); ++i
)
228 Sources
[i
]->ReadKnownNamespaces(Namespaces
);
231 void MultiplexExternalSemaSource::ReadUndefinedButUsed(
232 llvm::MapVector
<NamedDecl
*, SourceLocation
> &Undefined
) {
233 for(size_t i
= 0; i
< Sources
.size(); ++i
)
234 Sources
[i
]->ReadUndefinedButUsed(Undefined
);
237 void MultiplexExternalSemaSource::ReadMismatchingDeleteExpressions(
238 llvm::MapVector
<FieldDecl
*,
239 llvm::SmallVector
<std::pair
<SourceLocation
, bool>, 4>> &
241 for (auto &Source
: Sources
)
242 Source
->ReadMismatchingDeleteExpressions(Exprs
);
245 bool MultiplexExternalSemaSource::LookupUnqualified(LookupResult
&R
, Scope
*S
){
246 for(size_t i
= 0; i
< Sources
.size(); ++i
)
247 Sources
[i
]->LookupUnqualified(R
, S
);
252 void MultiplexExternalSemaSource::ReadTentativeDefinitions(
253 SmallVectorImpl
<VarDecl
*> &TentativeDefs
) {
254 for(size_t i
= 0; i
< Sources
.size(); ++i
)
255 Sources
[i
]->ReadTentativeDefinitions(TentativeDefs
);
258 void MultiplexExternalSemaSource::ReadUnusedFileScopedDecls(
259 SmallVectorImpl
<const DeclaratorDecl
*> &Decls
) {
260 for(size_t i
= 0; i
< Sources
.size(); ++i
)
261 Sources
[i
]->ReadUnusedFileScopedDecls(Decls
);
264 void MultiplexExternalSemaSource::ReadDelegatingConstructors(
265 SmallVectorImpl
<CXXConstructorDecl
*> &Decls
) {
266 for(size_t i
= 0; i
< Sources
.size(); ++i
)
267 Sources
[i
]->ReadDelegatingConstructors(Decls
);
270 void MultiplexExternalSemaSource::ReadExtVectorDecls(
271 SmallVectorImpl
<TypedefNameDecl
*> &Decls
) {
272 for(size_t i
= 0; i
< Sources
.size(); ++i
)
273 Sources
[i
]->ReadExtVectorDecls(Decls
);
276 void MultiplexExternalSemaSource::ReadDeclsToCheckForDeferredDiags(
277 llvm::SmallSetVector
<Decl
*, 4> &Decls
) {
278 for(size_t i
= 0; i
< Sources
.size(); ++i
)
279 Sources
[i
]->ReadDeclsToCheckForDeferredDiags(Decls
);
282 void MultiplexExternalSemaSource::ReadUnusedLocalTypedefNameCandidates(
283 llvm::SmallSetVector
<const TypedefNameDecl
*, 4> &Decls
) {
284 for(size_t i
= 0; i
< Sources
.size(); ++i
)
285 Sources
[i
]->ReadUnusedLocalTypedefNameCandidates(Decls
);
288 void MultiplexExternalSemaSource::ReadReferencedSelectors(
289 SmallVectorImpl
<std::pair
<Selector
, SourceLocation
> > &Sels
) {
290 for(size_t i
= 0; i
< Sources
.size(); ++i
)
291 Sources
[i
]->ReadReferencedSelectors(Sels
);
294 void MultiplexExternalSemaSource::ReadWeakUndeclaredIdentifiers(
295 SmallVectorImpl
<std::pair
<IdentifierInfo
*, WeakInfo
> > &WI
) {
296 for(size_t i
= 0; i
< Sources
.size(); ++i
)
297 Sources
[i
]->ReadWeakUndeclaredIdentifiers(WI
);
300 void MultiplexExternalSemaSource::ReadUsedVTables(
301 SmallVectorImpl
<ExternalVTableUse
> &VTables
) {
302 for(size_t i
= 0; i
< Sources
.size(); ++i
)
303 Sources
[i
]->ReadUsedVTables(VTables
);
306 void MultiplexExternalSemaSource::ReadPendingInstantiations(
307 SmallVectorImpl
<std::pair
<ValueDecl
*,
308 SourceLocation
> > &Pending
) {
309 for(size_t i
= 0; i
< Sources
.size(); ++i
)
310 Sources
[i
]->ReadPendingInstantiations(Pending
);
313 void MultiplexExternalSemaSource::ReadLateParsedTemplates(
314 llvm::MapVector
<const FunctionDecl
*, std::unique_ptr
<LateParsedTemplate
>>
316 for (size_t i
= 0; i
< Sources
.size(); ++i
)
317 Sources
[i
]->ReadLateParsedTemplates(LPTMap
);
320 TypoCorrection
MultiplexExternalSemaSource::CorrectTypo(
321 const DeclarationNameInfo
&Typo
,
322 int LookupKind
, Scope
*S
, CXXScopeSpec
*SS
,
323 CorrectionCandidateCallback
&CCC
,
324 DeclContext
*MemberContext
,
325 bool EnteringContext
,
326 const ObjCObjectPointerType
*OPT
) {
327 for (size_t I
= 0, E
= Sources
.size(); I
< E
; ++I
) {
328 if (TypoCorrection C
= Sources
[I
]->CorrectTypo(Typo
, LookupKind
, S
, SS
, CCC
,
330 EnteringContext
, OPT
))
333 return TypoCorrection();
336 bool MultiplexExternalSemaSource::MaybeDiagnoseMissingCompleteType(
337 SourceLocation Loc
, QualType T
) {
338 for (size_t I
= 0, E
= Sources
.size(); I
< E
; ++I
) {
339 if (Sources
[I
]->MaybeDiagnoseMissingCompleteType(Loc
, T
))
345 void MultiplexExternalSemaSource::AssignedLambdaNumbering(
346 const CXXRecordDecl
*Lambda
) {
347 for (auto *Source
: Sources
)
348 Source
->AssignedLambdaNumbering(Lambda
);