clang  3.7.0
MultiplexExternalSemaSource.cpp
Go to the documentation of this file.
1 //===--- MultiplexExternalSemaSource.cpp ---------------------------------===//
2 //
3 // The LLVM Compiler Infrastructure
4 //
5 // This file is distributed under the University of Illinois Open Source
6 // License. See LICENSE.TXT for details.
7 //
8 //===----------------------------------------------------------------------===//
9 //
10 // This file implements the event dispatching to the subscribed clients.
11 //
12 //===----------------------------------------------------------------------===//
15 #include "clang/Sema/Lookup.h"
16 
17 using namespace clang;
18 
19 ///\brief Constructs a new multiplexing external sema source and appends the
20 /// given element to it.
21 ///
22 ///\param[in] source - An ExternalSemaSource.
23 ///
25  ExternalSemaSource &s2){
26  Sources.push_back(&s1);
27  Sources.push_back(&s2);
28 }
29 
30 // pin the vtable here.
32 
33 ///\brief Appends new source to the source list.
34 ///
35 ///\param[in] source - An ExternalSemaSource.
36 ///
38  Sources.push_back(&source);
39 }
40 
41 //===----------------------------------------------------------------------===//
42 // ExternalASTSource.
43 //===----------------------------------------------------------------------===//
44 
46  for(size_t i = 0; i < Sources.size(); ++i)
47  if (Decl *Result = Sources[i]->GetExternalDecl(ID))
48  return Result;
49  return nullptr;
50 }
51 
53  for (size_t i = 0; i < Sources.size(); ++i)
54  Sources[i]->CompleteRedeclChain(D);
55 }
56 
58  Selector Sel;
59  for(size_t i = 0; i < Sources.size(); ++i) {
60  Sel = Sources[i]->GetExternalSelector(ID);
61  if (!Sel.isNull())
62  return Sel;
63  }
64  return Sel;
65 }
66 
68  uint32_t total = 0;
69  for(size_t i = 0; i < Sources.size(); ++i)
70  total += Sources[i]->GetNumExternalSelectors();
71  return total;
72 }
73 
75  for(size_t i = 0; i < Sources.size(); ++i)
76  if (Stmt *Result = Sources[i]->GetExternalDeclStmt(Offset))
77  return Result;
78  return nullptr;
79 }
80 
82  uint64_t Offset){
83  for(size_t i = 0; i < Sources.size(); ++i)
84  if (CXXBaseSpecifier *R = Sources[i]->GetExternalCXXBaseSpecifiers(Offset))
85  return R;
86  return nullptr;
87 }
88 
91  for (auto *S : Sources)
92  if (auto *R = S->GetExternalCXXCtorInitializers(Offset))
93  return R;
94  return nullptr;
95 }
96 
99  bool AnyDeclsFound = false;
100  for (size_t i = 0; i < Sources.size(); ++i)
101  AnyDeclsFound |= Sources[i]->FindExternalVisibleDeclsByName(DC, Name);
102  return AnyDeclsFound;
103 }
104 
106  for(size_t i = 0; i < Sources.size(); ++i)
107  Sources[i]->completeVisibleDeclsMap(DC);
108 }
109 
112  bool (*isKindWeWant)(Decl::Kind),
113  SmallVectorImpl<Decl*> &Result) {
114  for(size_t i = 0; i < Sources.size(); ++i)
115  // FIXME: The semantics of the return result is unclear to me...
116  Sources[i]->FindExternalLexicalDecls(DC, isKindWeWant, Result);
117 
118  return ELR_Success;
119 }
120 
122  unsigned Offset,
123  unsigned Length,
124  SmallVectorImpl<Decl *> &Decls){
125  for(size_t i = 0; i < Sources.size(); ++i)
126  Sources[i]->FindFileRegionDecls(File, Offset, Length, Decls);
127 }
128 
130  for(size_t i = 0; i < Sources.size(); ++i)
131  Sources[i]->CompleteType(Tag);
132 }
133 
135  for(size_t i = 0; i < Sources.size(); ++i)
136  Sources[i]->CompleteType(Class);
137 }
138 
140  for(size_t i = 0; i < Sources.size(); ++i)
141  Sources[i]->ReadComments();
142 }
143 
145  for(size_t i = 0; i < Sources.size(); ++i)
146  Sources[i]->StartedDeserializing();
147 }
148 
150  for(size_t i = 0; i < Sources.size(); ++i)
151  Sources[i]->FinishedDeserializing();
152 }
153 
155  for(size_t i = 0; i < Sources.size(); ++i)
156  Sources[i]->StartTranslationUnit(Consumer);
157 }
158 
160  for(size_t i = 0; i < Sources.size(); ++i)
161  Sources[i]->PrintStats();
162 }
163 
165  uint64_t &Size,
166  uint64_t &Alignment,
167  llvm::DenseMap<const FieldDecl *, uint64_t> &FieldOffsets,
168  llvm::DenseMap<const CXXRecordDecl *, CharUnits> &BaseOffsets,
169  llvm::DenseMap<const CXXRecordDecl *, CharUnits> &VirtualBaseOffsets){
170  for(size_t i = 0; i < Sources.size(); ++i)
171  if (Sources[i]->layoutRecordType(Record, Size, Alignment, FieldOffsets,
172  BaseOffsets, VirtualBaseOffsets))
173  return true;
174  return false;
175 }
176 
179  for(size_t i = 0; i < Sources.size(); ++i)
180  Sources[i]->getMemoryBufferSizes(sizes);
181 
182 }
183 
184 //===----------------------------------------------------------------------===//
185 // ExternalSemaSource.
186 //===----------------------------------------------------------------------===//
187 
188 
190  for(size_t i = 0; i < Sources.size(); ++i)
191  Sources[i]->InitializeSema(S);
192 }
193 
195  for(size_t i = 0; i < Sources.size(); ++i)
196  Sources[i]->ForgetSema();
197 }
198 
200  for(size_t i = 0; i < Sources.size(); ++i)
201  Sources[i]->ReadMethodPool(Sel);
202 }
203 
205  SmallVectorImpl<NamespaceDecl*> &Namespaces){
206  for(size_t i = 0; i < Sources.size(); ++i)
207  Sources[i]->ReadKnownNamespaces(Namespaces);
208 }
209 
211  llvm::DenseMap<NamedDecl*, SourceLocation> &Undefined){
212  for(size_t i = 0; i < Sources.size(); ++i)
213  Sources[i]->ReadUndefinedButUsed(Undefined);
214 }
215 
217  llvm::MapVector<FieldDecl *,
218  llvm::SmallVector<std::pair<SourceLocation, bool>, 4>> &
219  Exprs) {
220  for (auto &Source : Sources)
221  Source->ReadMismatchingDeleteExpressions(Exprs);
222 }
223 
225  for(size_t i = 0; i < Sources.size(); ++i)
226  Sources[i]->LookupUnqualified(R, S);
227 
228  return !R.empty();
229 }
230 
232  SmallVectorImpl<VarDecl*> &TentativeDefs) {
233  for(size_t i = 0; i < Sources.size(); ++i)
234  Sources[i]->ReadTentativeDefinitions(TentativeDefs);
235 }
236 
239  for(size_t i = 0; i < Sources.size(); ++i)
240  Sources[i]->ReadUnusedFileScopedDecls(Decls);
241 }
242 
245  for(size_t i = 0; i < Sources.size(); ++i)
246  Sources[i]->ReadDelegatingConstructors(Decls);
247 }
248 
251  for(size_t i = 0; i < Sources.size(); ++i)
252  Sources[i]->ReadExtVectorDecls(Decls);
253 }
254 
257  for(size_t i = 0; i < Sources.size(); ++i)
258  Sources[i]->ReadUnusedLocalTypedefNameCandidates(Decls);
259 }
260 
262  SmallVectorImpl<std::pair<Selector, SourceLocation> > &Sels) {
263  for(size_t i = 0; i < Sources.size(); ++i)
264  Sources[i]->ReadReferencedSelectors(Sels);
265 }
266 
268  SmallVectorImpl<std::pair<IdentifierInfo*, WeakInfo> > &WI) {
269  for(size_t i = 0; i < Sources.size(); ++i)
270  Sources[i]->ReadWeakUndeclaredIdentifiers(WI);
271 }
272 
275  for(size_t i = 0; i < Sources.size(); ++i)
276  Sources[i]->ReadUsedVTables(VTables);
277 }
278 
280  SmallVectorImpl<std::pair<ValueDecl*,
281  SourceLocation> > &Pending) {
282  for(size_t i = 0; i < Sources.size(); ++i)
283  Sources[i]->ReadPendingInstantiations(Pending);
284 }
285 
287  llvm::MapVector<const FunctionDecl *, LateParsedTemplate *> &LPTMap) {
288  for (size_t i = 0; i < Sources.size(); ++i)
289  Sources[i]->ReadLateParsedTemplates(LPTMap);
290 }
291 
293  const DeclarationNameInfo &Typo,
294  int LookupKind, Scope *S, CXXScopeSpec *SS,
296  DeclContext *MemberContext,
297  bool EnteringContext,
298  const ObjCObjectPointerType *OPT) {
299  for (size_t I = 0, E = Sources.size(); I < E; ++I) {
300  if (TypoCorrection C = Sources[I]->CorrectTypo(Typo, LookupKind, S, SS, CCC,
301  MemberContext,
302  EnteringContext, OPT))
303  return C;
304  }
305  return TypoCorrection();
306 }
307 
309  SourceLocation Loc, QualType T) {
310  for (size_t I = 0, E = Sources.size(); I < E; ++I) {
311  if (Sources[I]->MaybeDiagnoseMissingCompleteType(Loc, T))
312  return true;
313  }
314  return false;
315 }
Smart pointer class that efficiently represents Objective-C method names.
Simple class containing the result of Sema::CorrectTypo.
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...
void completeVisibleDeclsMap(const DeclContext *DC) override
Ensures that the table of all visible declarations inside this context is up to date.
void StartTranslationUnit(ASTConsumer *Consumer) override
Function that will be invoked when we begin parsing a new translation unit involving this external AS...
void StartedDeserializing() override
Notify ExternalASTSource that we started deserialization of a decl or type so until FinishedDeseriali...
void ReadMethodPool(Selector Sel) override
Load the contents of the global method pool for a given selector.
void CompleteRedeclChain(const Decl *D) override
Complete the redeclaration chain if it's been extended since the previous generation of the AST sourc...
bool FindExternalVisibleDeclsByName(const DeclContext *DC, DeclarationName Name) override
Find all declarations with the given name in the given context.
MemoryBufferSizes getMemoryBufferSizes() const
bool LookupUnqualified(LookupResult &R, Scope *S) override
Do last resort, unqualified lookup on a LookupResult that Sema cannot find.
Base class for callback objects used by Sema::CorrectTypo to check the validity of a potential typo c...
void InitializeSema(Sema &S) override
Initialize the semantic source with the Sema instance being used to perform semantic analysis on the ...
bool isNull() const
Determine whether this is the empty selector.
void ReadWeakUndeclaredIdentifiers(SmallVectorImpl< std::pair< IdentifierInfo *, WeakInfo > > &WI) override
Read the set of weak, undeclared identifiers known to the external Sema source.
Represents the results of name lookup.
Definition: Lookup.h:30
Stmt * GetExternalDeclStmt(uint64_t Offset) override
Resolve the offset of a statement in the decl stream into a statement.
void ReadTentativeDefinitions(SmallVectorImpl< VarDecl * > &Defs) override
Read the set of tentative definitions known to the external Sema source.
uint32_t Offset
Definition: CacheTokens.cpp:43
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.
uint32_t GetNumExternalSelectors() override
Returns the number of selectors known to the external AST source.
Represents a C++ nested-name-specifier or a global scope specifier.
Definition: DeclSpec.h:68
Decl * GetExternalDecl(uint32_t ID) override
Resolve a declaration ID into a declaration, potentially building a new declaration.
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...
Represents an ObjC class declaration.
Definition: DeclObjC.h:851
Sema - This implements semantic analysis and AST building for C.
Definition: Sema.h:258
void ForgetSema() override
Inform the semantic consumer that Sema is no longer available.
ID
Defines the set of possible language-specific address spaces.
Definition: AddressSpaces.h:27
ExternalLoadResult
Enumeration describing the result of loading information from an external source. ...
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. Length can be 0 to indicate a ...
void FinishedDeserializing() override
Notify ExternalASTSource that we finished the deserialization of a decl or type. Must be paired with ...
void CompleteType(TagDecl *Tag) override
Gives the external AST source an opportunity to complete an incomplete type.
Loading the external information has succeeded.
void PrintStats() override
Print any statistics that have been gathered regarding the external AST source.
void ReadUsedVTables(SmallVectorImpl< ExternalVTableUse > &VTables) override
Read the set of used vtables 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.
The result type of a method or function.
void ReadPendingInstantiations(SmallVectorImpl< std::pair< ValueDecl *, SourceLocation > > &Pending) override
Read the set of pending instantiations known to the external Sema source.
void ReadMismatchingDeleteExpressions(llvm::MapVector< FieldDecl *, llvm::SmallVector< std::pair< SourceLocation, bool >, 4 >> &Exprs) override
An abstract interface that should be implemented by external AST sources that also provide informatio...
void ReadUnusedLocalTypedefNameCandidates(llvm::SmallSetVector< const TypedefNameDecl *, 4 > &Decls) override
Read the set of potentially unused typedefs known to the source.
ExternalLoadResult FindExternalLexicalDecls(const DeclContext *DC, bool(*isKindWeWant)(Decl::Kind), SmallVectorImpl< Decl * > &Result) override
Finds all declarations lexically contained within the given DeclContext, after applying an optional f...
Encodes a location in the source. The SourceManager can decode this to get at the full include stack...
TagDecl - Represents the declaration of a struct/union/class/enum.
Definition: Decl.h:2694
void ReadReferencedSelectors(SmallVectorImpl< std::pair< Selector, SourceLocation > > &Sels) override
Read the set of referenced selectors known to the external Sema source.
void ReadDelegatingConstructors(SmallVectorImpl< CXXConstructorDecl * > &Decls) override
Read the set of delegating constructors known to the external Sema source.
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...
MultiplexExternalSemaSource(ExternalSemaSource &s1, ExternalSemaSource &s2)
Constructs a new multiplexing external sema source and appends the given element to it...
An opaque identifier used by SourceManager which refers to a source file (MemoryBuffer) along with it...
StringRef Typo
bool empty() const
Return true if no decls were found.
Definition: Lookup.h:279
void ReadUndefinedButUsed(llvm::DenseMap< NamedDecl *, SourceLocation > &Undefined) override
Load the set of used but not defined functions or variables with internal linkage, or used but not defined inline functions.
Represents a C++ base or member initializer.
Definition: DeclCXX.h:1901
void addSource(ExternalSemaSource &source)
Appends new source to the source list.
Represents a base class of a C++ class.
Definition: DeclCXX.h:157
void ReadComments() override
Loads comment ranges.
Selector GetExternalSelector(uint32_t ID) override
Resolve a selector ID into a selector.
Kind
Lists the kind of concrete classes of Decl.
Definition: DeclBase.h:76
void ReadExtVectorDecls(SmallVectorImpl< TypedefNameDecl * > &Decls) override
Read the set of ext_vector type declarations known to the external Sema source.
bool MaybeDiagnoseMissingCompleteType(SourceLocation Loc, QualType T) override
Produces a diagnostic note if one of the attached sources contains a complete definition for T...
void ReadUnusedFileScopedDecls(SmallVectorImpl< const DeclaratorDecl * > &Decls) override
Read the set of unused file-scope declarations known to the external Sema source. ...
void ReadLateParsedTemplates(llvm::MapVector< const FunctionDecl *, LateParsedTemplate * > &LPTMap) override
Read the set of late parsed template functions for this source.