clang  19.0.0git
MultiplexExternalSemaSource.cpp
Go to the documentation of this file.
1 //===--- MultiplexExternalSemaSource.cpp ---------------------------------===//
2 //
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
6 //
7 //===----------------------------------------------------------------------===//
8 //
9 // This file implements the event dispatching to the subscribed clients.
10 //
11 //===----------------------------------------------------------------------===//
13 #include "clang/Sema/Lookup.h"
14 
15 using namespace clang;
16 
17 char MultiplexExternalSemaSource::ID;
18 
19 /// Constructs a new multiplexing external sema source and appends the
20 /// given element to it.
21 ///
24  S1->Retain();
25  S2->Retain();
26  Sources.push_back(S1);
27  Sources.push_back(S2);
28 }
29 
30 // pin the vtable here.
32  for (auto *S : Sources)
33  S->Release();
34 }
35 
36 /// Appends new source to the source list.
37 ///
38 ///\param[in] source - An ExternalSemaSource.
39 ///
41  Source->Retain();
42  Sources.push_back(Source);
43 }
44 
45 //===----------------------------------------------------------------------===//
46 // ExternalASTSource.
47 //===----------------------------------------------------------------------===//
48 
50  for(size_t i = 0; i < Sources.size(); ++i)
51  if (Decl *Result = Sources[i]->GetExternalDecl(ID))
52  return Result;
53  return nullptr;
54 }
55 
57  for (size_t i = 0; i < Sources.size(); ++i)
58  Sources[i]->CompleteRedeclChain(D);
59 }
60 
62  Selector Sel;
63  for(size_t i = 0; i < Sources.size(); ++i) {
64  Sel = Sources[i]->GetExternalSelector(ID);
65  if (!Sel.isNull())
66  return Sel;
67  }
68  return Sel;
69 }
70 
72  uint32_t total = 0;
73  for(size_t i = 0; i < Sources.size(); ++i)
74  total += Sources[i]->GetNumExternalSelectors();
75  return total;
76 }
77 
79  for(size_t i = 0; i < Sources.size(); ++i)
80  if (Stmt *Result = Sources[i]->GetExternalDeclStmt(Offset))
81  return Result;
82  return nullptr;
83 }
84 
87  for(size_t i = 0; i < Sources.size(); ++i)
89  return R;
90  return nullptr;
91 }
92 
95  for (auto *S : Sources)
96  if (auto *R = S->GetExternalCXXCtorInitializers(Offset))
97  return R;
98  return nullptr;
99 }
100 
103  for (const auto &S : Sources)
104  if (auto EK = S->hasExternalDefinitions(D))
105  if (EK != EK_ReplyHazy)
106  return EK;
107  return EK_ReplyHazy;
108 }
109 
112  bool AnyDeclsFound = false;
113  for (size_t i = 0; i < Sources.size(); ++i)
114  AnyDeclsFound |= Sources[i]->FindExternalVisibleDeclsByName(DC, Name);
115  return AnyDeclsFound;
116 }
117 
119  for(size_t i = 0; i < Sources.size(); ++i)
120  Sources[i]->completeVisibleDeclsMap(DC);
121 }
122 
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);
128 }
129 
131  unsigned Offset,
132  unsigned Length,
133  SmallVectorImpl<Decl *> &Decls){
134  for(size_t i = 0; i < Sources.size(); ++i)
135  Sources[i]->FindFileRegionDecls(File, Offset, Length, Decls);
136 }
137 
139  for(size_t i = 0; i < Sources.size(); ++i)
140  Sources[i]->CompleteType(Tag);
141 }
142 
144  for(size_t i = 0; i < Sources.size(); ++i)
145  Sources[i]->CompleteType(Class);
146 }
147 
149  for(size_t i = 0; i < Sources.size(); ++i)
150  Sources[i]->ReadComments();
151 }
152 
154  for(size_t i = 0; i < Sources.size(); ++i)
155  Sources[i]->StartedDeserializing();
156 }
157 
159  for(size_t i = 0; i < Sources.size(); ++i)
160  Sources[i]->FinishedDeserializing();
161 }
162 
164  for(size_t i = 0; i < Sources.size(); ++i)
165  Sources[i]->StartTranslationUnit(Consumer);
166 }
167 
169  for(size_t i = 0; i < Sources.size(); ++i)
170  Sources[i]->PrintStats();
171 }
172 
174  for (size_t i = 0; i < Sources.size(); ++i)
175  if (auto M = Sources[i]->getModule(ID))
176  return M;
177  return nullptr;
178 }
179 
181  uint64_t &Size,
182  uint64_t &Alignment,
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))
189  return true;
190  return false;
191 }
192 
195  for(size_t i = 0; i < Sources.size(); ++i)
196  Sources[i]->getMemoryBufferSizes(sizes);
197 
198 }
199 
200 //===----------------------------------------------------------------------===//
201 // ExternalSemaSource.
202 //===----------------------------------------------------------------------===//
203 
204 
206  for(size_t i = 0; i < Sources.size(); ++i)
207  Sources[i]->InitializeSema(S);
208 }
209 
211  for(size_t i = 0; i < Sources.size(); ++i)
212  Sources[i]->ForgetSema();
213 }
214 
216  for(size_t i = 0; i < Sources.size(); ++i)
217  Sources[i]->ReadMethodPool(Sel);
218 }
219 
221  for(size_t i = 0; i < Sources.size(); ++i)
222  Sources[i]->updateOutOfDateSelector(Sel);
223 }
224 
226  SmallVectorImpl<NamespaceDecl*> &Namespaces){
227  for(size_t i = 0; i < Sources.size(); ++i)
228  Sources[i]->ReadKnownNamespaces(Namespaces);
229 }
230 
232  llvm::MapVector<NamedDecl *, SourceLocation> &Undefined) {
233  for(size_t i = 0; i < Sources.size(); ++i)
234  Sources[i]->ReadUndefinedButUsed(Undefined);
235 }
236 
238  llvm::MapVector<FieldDecl *,
239  llvm::SmallVector<std::pair<SourceLocation, bool>, 4>> &
240  Exprs) {
241  for (auto &Source : Sources)
242  Source->ReadMismatchingDeleteExpressions(Exprs);
243 }
244 
246  for(size_t i = 0; i < Sources.size(); ++i)
247  Sources[i]->LookupUnqualified(R, S);
248 
249  return !R.empty();
250 }
251 
253  SmallVectorImpl<VarDecl*> &TentativeDefs) {
254  for(size_t i = 0; i < Sources.size(); ++i)
255  Sources[i]->ReadTentativeDefinitions(TentativeDefs);
256 }
257 
260  for(size_t i = 0; i < Sources.size(); ++i)
261  Sources[i]->ReadUnusedFileScopedDecls(Decls);
262 }
263 
266  for(size_t i = 0; i < Sources.size(); ++i)
267  Sources[i]->ReadDelegatingConstructors(Decls);
268 }
269 
272  for(size_t i = 0; i < Sources.size(); ++i)
273  Sources[i]->ReadExtVectorDecls(Decls);
274 }
275 
278  for(size_t i = 0; i < Sources.size(); ++i)
279  Sources[i]->ReadDeclsToCheckForDeferredDiags(Decls);
280 }
281 
284  for(size_t i = 0; i < Sources.size(); ++i)
285  Sources[i]->ReadUnusedLocalTypedefNameCandidates(Decls);
286 }
287 
289  SmallVectorImpl<std::pair<Selector, SourceLocation> > &Sels) {
290  for(size_t i = 0; i < Sources.size(); ++i)
291  Sources[i]->ReadReferencedSelectors(Sels);
292 }
293 
295  SmallVectorImpl<std::pair<IdentifierInfo*, WeakInfo> > &WI) {
296  for(size_t i = 0; i < Sources.size(); ++i)
297  Sources[i]->ReadWeakUndeclaredIdentifiers(WI);
298 }
299 
302  for(size_t i = 0; i < Sources.size(); ++i)
303  Sources[i]->ReadUsedVTables(VTables);
304 }
305 
307  SmallVectorImpl<std::pair<ValueDecl*,
308  SourceLocation> > &Pending) {
309  for(size_t i = 0; i < Sources.size(); ++i)
310  Sources[i]->ReadPendingInstantiations(Pending);
311 }
312 
314  llvm::MapVector<const FunctionDecl *, std::unique_ptr<LateParsedTemplate>>
315  &LPTMap) {
316  for (size_t i = 0; i < Sources.size(); ++i)
317  Sources[i]->ReadLateParsedTemplates(LPTMap);
318 }
319 
321  const DeclarationNameInfo &Typo,
322  int LookupKind, Scope *S, CXXScopeSpec *SS,
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,
329  MemberContext,
330  EnteringContext, OPT))
331  return C;
332  }
333  return TypoCorrection();
334 }
335 
338  for (size_t I = 0, E = Sources.size(); I < E; ++I) {
339  if (Sources[I]->MaybeDiagnoseMissingCompleteType(Loc, T))
340  return true;
341  }
342  return false;
343 }
344 
346  const CXXRecordDecl *Lambda) {
347  for (auto *Source : Sources)
348  Source->AssignedLambdaNumbering(Lambda);
349 }
static char ID
Definition: Arena.cpp:183
unsigned Offset
Definition: Format.cpp:2978
llvm::MachO::Record Record
Definition: MachO.h:31
SourceLocation Loc
Definition: SemaObjC.cpp:755
ASTConsumer - This is an abstract interface that should be implemented by clients that read ASTs.
Definition: ASTConsumer.h:33
Represents a base class of a C++ class.
Definition: DeclCXX.h:146
Represents a C++ base or member initializer.
Definition: DeclCXX.h:2300
Represents a C++ struct/union/class.
Definition: DeclCXX.h:258
Represents a C++ nested-name-specifier or a global scope specifier.
Definition: DeclSpec.h:74
Base class for callback objects used by Sema::CorrectTypo to check the validity of a potential typo c...
DeclContext - This is used only as base class of specific decl types that can act as declaration cont...
Definition: DeclBase.h:1436
Decl - This represents one declaration (or definition), e.g.
Definition: DeclBase.h:86
Kind
Lists the kind of concrete classes of Decl.
Definition: DeclBase.h:89
The name of a declaration.
MemoryBufferSizes getMemoryBufferSizes() const
Return the amount of memory used by memory buffers, breaking down by heap-backed versus mmap'ed memor...
An abstract interface that should be implemented by external AST sources that also provide informatio...
Represents a member of a struct/union/class.
Definition: Decl.h:3060
An opaque identifier used by SourceManager which refers to a source file (MemoryBuffer) along with it...
Represents a function declaration or definition.
Definition: Decl.h:1972
Represents the results of name lookup.
Definition: Lookup.h:46
bool empty() const
Return true if no decls were found.
Definition: Lookup.h:362
Describes a module or submodule.
Definition: Module.h:105
void FindFileRegionDecls(FileID File, unsigned Offset, unsigned Length, SmallVectorImpl< Decl * > &Decls) override
Get the decls that are contained in a file in the Offset/Length range.
void updateOutOfDateSelector(Selector Sel) override
Load the contents of the global method pool for a given selector if necessary.
Stmt * GetExternalDeclStmt(uint64_t Offset) override
Resolve the offset of a statement in the decl stream into a statement.
TypoCorrection CorrectTypo(const DeclarationNameInfo &Typo, int LookupKind, Scope *S, CXXScopeSpec *SS, CorrectionCandidateCallback &CCC, DeclContext *MemberContext, bool EnteringContext, const ObjCObjectPointerType *OPT) override
Try to "correct" a typo in the source code by finding visible declarations whose names are similar to...
bool LookupUnqualified(LookupResult &R, Scope *S) override
Do last resort, unqualified lookup on a LookupResult that Sema cannot find.
void ReadDelegatingConstructors(SmallVectorImpl< CXXConstructorDecl * > &Decls) override
Read the set of delegating constructors known to the external Sema source.
ExtKind hasExternalDefinitions(const Decl *D) override
void ReadUnusedFileScopedDecls(SmallVectorImpl< const DeclaratorDecl * > &Decls) override
Read the set of unused file-scope declarations known to the external Sema source.
void ReadDeclsToCheckForDeferredDiags(llvm::SmallSetVector< Decl *, 4 > &Decls) override
Read the set of decls to be checked for deferred diags.
Selector GetExternalSelector(uint32_t ID) override
Resolve a selector ID into a selector.
CXXBaseSpecifier * GetExternalCXXBaseSpecifiers(uint64_t Offset) override
Resolve the offset of a set of C++ base specifiers in the decl stream into an array of specifiers.
void ReadTentativeDefinitions(SmallVectorImpl< VarDecl * > &Defs) override
Read the set of tentative definitions known to the external Sema source.
void ReadUndefinedButUsed(llvm::MapVector< NamedDecl *, SourceLocation > &Undefined) override
Load the set of used but not defined functions or variables with internal linkage,...
void ReadComments() override
Loads comment ranges.
void FindExternalLexicalDecls(const DeclContext *DC, llvm::function_ref< bool(Decl::Kind)> IsKindWeWant, SmallVectorImpl< Decl * > &Result) override
Finds all declarations lexically contained within the given DeclContext, after applying an optional f...
void PrintStats() override
Print any statistics that have been gathered regarding the external AST source.
void ReadExtVectorDecls(SmallVectorImpl< TypedefNameDecl * > &Decls) override
Read the set of ext_vector type declarations known to the external Sema source.
void ReadUnusedLocalTypedefNameCandidates(llvm::SmallSetVector< const TypedefNameDecl *, 4 > &Decls) override
Read the set of potentially unused typedefs known to the source.
void ReadWeakUndeclaredIdentifiers(SmallVectorImpl< std::pair< IdentifierInfo *, WeakInfo > > &WI) override
Read the set of weak, undeclared identifiers known to the external Sema source.
CXXCtorInitializer ** GetExternalCXXCtorInitializers(uint64_t Offset) override
Resolve a handle to a list of ctor initializers into the list of initializers themselves.
void CompleteType(TagDecl *Tag) override
Gives the external AST source an opportunity to complete an incomplete type.
void ReadMismatchingDeleteExpressions(llvm::MapVector< FieldDecl *, llvm::SmallVector< std::pair< SourceLocation, bool >, 4 >> &Exprs) override
void ReadUsedVTables(SmallVectorImpl< ExternalVTableUse > &VTables) override
Read the set of used vtables known to the external Sema source.
MultiplexExternalSemaSource(ExternalSemaSource *S1, ExternalSemaSource *S2)
Constructs a new multiplexing external sema source and appends the given element to it.
void StartedDeserializing() override
Notify ExternalASTSource that we started deserialization of a decl or type so until FinishedDeseriali...
void ReadLateParsedTemplates(llvm::MapVector< const FunctionDecl *, std::unique_ptr< LateParsedTemplate >> &LPTMap) override
Read the set of late parsed template functions for this source.
void FinishedDeserializing() override
Notify ExternalASTSource that we finished the deserialization of a decl or type.
bool MaybeDiagnoseMissingCompleteType(SourceLocation Loc, QualType T) override
Produces a diagnostic note if one of the attached sources contains a complete definition for T.
bool FindExternalVisibleDeclsByName(const DeclContext *DC, DeclarationName Name) override
Find all declarations with the given name in the given context.
void AssignedLambdaNumbering(const CXXRecordDecl *Lambda) override
Notify the external source that a lambda was assigned a mangling number.
void ReadMethodPool(Selector Sel) override
Load the contents of the global method pool for a given selector.
void InitializeSema(Sema &S) override
Initialize the semantic source with the Sema instance being used to perform semantic analysis on the ...
void CompleteRedeclChain(const Decl *D) override
Complete the redeclaration chain if it's been extended since the previous generation of the AST sourc...
Decl * GetExternalDecl(GlobalDeclID ID) override
Resolve a declaration ID into a declaration, potentially building a new declaration.
void completeVisibleDeclsMap(const DeclContext *DC) override
Ensures that the table of all visible declarations inside this context is up to date.
uint32_t GetNumExternalSelectors() override
Returns the number of selectors known to the external AST source.
void ReadReferencedSelectors(SmallVectorImpl< std::pair< Selector, SourceLocation > > &Sels) override
Read the set of referenced selectors known to the external Sema source.
void StartTranslationUnit(ASTConsumer *Consumer) override
Function that will be invoked when we begin parsing a new translation unit involving this external AS...
bool 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) override
Perform layout on the given record.
void ReadKnownNamespaces(SmallVectorImpl< NamespaceDecl * > &Namespaces) override
Load the set of namespaces that are known to the external source, which will be used during typo corr...
Module * getModule(unsigned ID) override
Retrieve the module that corresponds to the given module ID.
void ReadPendingInstantiations(SmallVectorImpl< std::pair< ValueDecl *, SourceLocation > > &Pending) override
Read the set of pending instantiations known to the external Sema source.
void AddSource(ExternalSemaSource *Source)
Appends new source to the source list.
void ForgetSema() override
Inform the semantic consumer that Sema is no longer available.
Represents an ObjC class declaration.
Definition: DeclObjC.h:1153
Represents a pointer to an Objective C object.
Definition: Type.h:7020
A (possibly-)qualified type.
Definition: Type.h:940
Represents a struct/union/class.
Definition: Decl.h:4171
Scope - A scope is a transient data structure that is used while parsing the program.
Definition: Scope.h:41
Smart pointer class that efficiently represents Objective-C method names.
bool isNull() const
Determine whether this is the empty selector.
Sema - This implements semantic analysis and AST building for C.
Definition: Sema.h:462
Encodes a location in the source.
Stmt - This represents one statement.
Definition: Stmt.h:84
Represents the declaration of a struct/union/class/enum.
Definition: Decl.h:3587
Simple class containing the result of Sema::CorrectTypo.
Represent the declaration of a variable (in which case it is an lvalue) a function (in which case it ...
Definition: Decl.h:707
The JSON file list parser is used to communicate input to InstallAPI.
const FunctionProtoType * T
@ Class
The "class" keyword introduces the elaborated-type-specifier.
unsigned long uint64_t
DeclarationNameInfo - A collector data type for bundling together a DeclarationName and the correspon...