MultiplexExternalSemaSource.cpp 11 KB

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