brintos

brintos / llvm-project-archived public Read only

0
0
Text · 12.7 KiB · 1f040c8 Raw
370 lines · cpp
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-exception6//7//===----------------------------------------------------------------------===//8//9// This file implements the event dispatching to the subscribed clients.10//11//===----------------------------------------------------------------------===//12#include "clang/Sema/MultiplexExternalSemaSource.h"13#include "clang/Sema/Lookup.h"14 15using namespace clang;16 17char MultiplexExternalSemaSource::ID;18 19/// Constructs a new multiplexing external sema source and appends the20/// given element to it.21///22MultiplexExternalSemaSource::MultiplexExternalSemaSource(23    llvm::IntrusiveRefCntPtr<ExternalSemaSource> S1,24    llvm::IntrusiveRefCntPtr<ExternalSemaSource> S2) {25  Sources.push_back(std::move(S1));26  Sources.push_back(std::move(S2));27}28 29/// Appends new source to the source list.30///31///\param[in] source - An ExternalSemaSource.32///33void MultiplexExternalSemaSource::AddSource(34    llvm::IntrusiveRefCntPtr<ExternalSemaSource> Source) {35  Sources.push_back(std::move(Source));36}37 38//===----------------------------------------------------------------------===//39// ExternalASTSource.40//===----------------------------------------------------------------------===//41 42Decl *MultiplexExternalSemaSource::GetExternalDecl(GlobalDeclID ID) {43  for(size_t i = 0; i < Sources.size(); ++i)44    if (Decl *Result = Sources[i]->GetExternalDecl(ID))45      return Result;46  return nullptr;47}48 49void MultiplexExternalSemaSource::CompleteRedeclChain(const Decl *D) {50  for (size_t i = 0; i < Sources.size(); ++i)51    Sources[i]->CompleteRedeclChain(D);52}53 54Selector MultiplexExternalSemaSource::GetExternalSelector(uint32_t ID) {55  Selector Sel;56  for(size_t i = 0; i < Sources.size(); ++i) {57    Sel = Sources[i]->GetExternalSelector(ID);58    if (!Sel.isNull())59      return Sel;60  }61  return Sel;62}63 64uint32_t MultiplexExternalSemaSource::GetNumExternalSelectors() {65  uint32_t total = 0;66  for(size_t i = 0; i < Sources.size(); ++i)67    total += Sources[i]->GetNumExternalSelectors();68  return total;69}70 71Stmt *MultiplexExternalSemaSource::GetExternalDeclStmt(uint64_t Offset) {72  for(size_t i = 0; i < Sources.size(); ++i)73    if (Stmt *Result = Sources[i]->GetExternalDeclStmt(Offset))74      return Result;75  return nullptr;76}77 78CXXBaseSpecifier *MultiplexExternalSemaSource::GetExternalCXXBaseSpecifiers(79                                                               uint64_t Offset){80  for(size_t i = 0; i < Sources.size(); ++i)81    if (CXXBaseSpecifier *R = Sources[i]->GetExternalCXXBaseSpecifiers(Offset))82      return R;83  return nullptr;84}85 86CXXCtorInitializer **87MultiplexExternalSemaSource::GetExternalCXXCtorInitializers(uint64_t Offset) {88  for (auto &S : Sources)89    if (auto *R = S->GetExternalCXXCtorInitializers(Offset))90      return R;91  return nullptr;92}93 94ExternalASTSource::ExtKind95MultiplexExternalSemaSource::hasExternalDefinitions(const Decl *D) {96  for (const auto &S : Sources)97    if (auto EK = S->hasExternalDefinitions(D))98      if (EK != EK_ReplyHazy)99        return EK;100  return EK_ReplyHazy;101}102 103bool MultiplexExternalSemaSource::wasThisDeclarationADefinition(104    const FunctionDecl *FD) {105  for (const auto &S : Sources)106    if (S->wasThisDeclarationADefinition(FD))107      return true;108  return false;109}110 111bool MultiplexExternalSemaSource::FindExternalVisibleDeclsByName(112    const DeclContext *DC, DeclarationName Name,113    const DeclContext *OriginalDC) {114  bool AnyDeclsFound = false;115  for (size_t i = 0; i < Sources.size(); ++i)116    AnyDeclsFound |=117        Sources[i]->FindExternalVisibleDeclsByName(DC, Name, OriginalDC);118  return AnyDeclsFound;119}120 121bool MultiplexExternalSemaSource::LoadExternalSpecializations(122    const Decl *D, bool OnlyPartial) {123  bool Loaded = false;124  for (size_t i = 0; i < Sources.size(); ++i)125    Loaded |= Sources[i]->LoadExternalSpecializations(D, OnlyPartial);126  return Loaded;127}128 129bool MultiplexExternalSemaSource::LoadExternalSpecializations(130    const Decl *D, ArrayRef<TemplateArgument> TemplateArgs) {131  bool AnyNewSpecsLoaded = false;132  for (size_t i = 0; i < Sources.size(); ++i)133    AnyNewSpecsLoaded |=134        Sources[i]->LoadExternalSpecializations(D, TemplateArgs);135  return AnyNewSpecsLoaded;136}137 138void MultiplexExternalSemaSource::completeVisibleDeclsMap(const DeclContext *DC){139  for(size_t i = 0; i < Sources.size(); ++i)140    Sources[i]->completeVisibleDeclsMap(DC);141}142 143void MultiplexExternalSemaSource::FindExternalLexicalDecls(144    const DeclContext *DC, llvm::function_ref<bool(Decl::Kind)> IsKindWeWant,145    SmallVectorImpl<Decl *> &Result) {146  for(size_t i = 0; i < Sources.size(); ++i)147    Sources[i]->FindExternalLexicalDecls(DC, IsKindWeWant, Result);148}149 150void MultiplexExternalSemaSource::FindFileRegionDecls(FileID File,151                                                      unsigned Offset,152                                                      unsigned Length,153                                                SmallVectorImpl<Decl *> &Decls){154  for(size_t i = 0; i < Sources.size(); ++i)155    Sources[i]->FindFileRegionDecls(File, Offset, Length, Decls);156}157 158void MultiplexExternalSemaSource::CompleteType(TagDecl *Tag) {159  for(size_t i = 0; i < Sources.size(); ++i)160    Sources[i]->CompleteType(Tag);161}162 163void MultiplexExternalSemaSource::CompleteType(ObjCInterfaceDecl *Class) {164  for(size_t i = 0; i < Sources.size(); ++i)165    Sources[i]->CompleteType(Class);166}167 168void MultiplexExternalSemaSource::ReadComments() {169  for(size_t i = 0; i < Sources.size(); ++i)170    Sources[i]->ReadComments();171}172 173void MultiplexExternalSemaSource::StartedDeserializing() {174  for(size_t i = 0; i < Sources.size(); ++i)175    Sources[i]->StartedDeserializing();176}177 178void MultiplexExternalSemaSource::FinishedDeserializing() {179  for(size_t i = 0; i < Sources.size(); ++i)180    Sources[i]->FinishedDeserializing();181}182 183void MultiplexExternalSemaSource::StartTranslationUnit(ASTConsumer *Consumer) {184  for(size_t i = 0; i < Sources.size(); ++i)185    Sources[i]->StartTranslationUnit(Consumer);186}187 188void MultiplexExternalSemaSource::PrintStats() {189  for(size_t i = 0; i < Sources.size(); ++i)190    Sources[i]->PrintStats();191}192 193Module *MultiplexExternalSemaSource::getModule(unsigned ID) {194  for (size_t i = 0; i < Sources.size(); ++i)195    if (auto M = Sources[i]->getModule(ID))196      return M;197  return nullptr;198}199 200bool MultiplexExternalSemaSource::layoutRecordType(const RecordDecl *Record,201                                                   uint64_t &Size,202                                                   uint64_t &Alignment,203                      llvm::DenseMap<const FieldDecl *, uint64_t> &FieldOffsets,204                  llvm::DenseMap<const CXXRecordDecl *, CharUnits> &BaseOffsets,205          llvm::DenseMap<const CXXRecordDecl *, CharUnits> &VirtualBaseOffsets){206  for(size_t i = 0; i < Sources.size(); ++i)207    if (Sources[i]->layoutRecordType(Record, Size, Alignment, FieldOffsets,208                                     BaseOffsets, VirtualBaseOffsets))209      return true;210  return false;211}212 213void MultiplexExternalSemaSource::214getMemoryBufferSizes(MemoryBufferSizes &sizes) const {215  for(size_t i = 0; i < Sources.size(); ++i)216    Sources[i]->getMemoryBufferSizes(sizes);217 218}219 220//===----------------------------------------------------------------------===//221// ExternalSemaSource.222//===----------------------------------------------------------------------===//223 224 225void MultiplexExternalSemaSource::InitializeSema(Sema &S) {226  for(size_t i = 0; i < Sources.size(); ++i)227    Sources[i]->InitializeSema(S);228}229 230void MultiplexExternalSemaSource::ForgetSema() {231  for(size_t i = 0; i < Sources.size(); ++i)232    Sources[i]->ForgetSema();233}234 235void MultiplexExternalSemaSource::ReadMethodPool(Selector Sel) {236  for(size_t i = 0; i < Sources.size(); ++i)237    Sources[i]->ReadMethodPool(Sel);238}239 240void MultiplexExternalSemaSource::updateOutOfDateSelector(Selector Sel) {241  for(size_t i = 0; i < Sources.size(); ++i)242    Sources[i]->updateOutOfDateSelector(Sel);243}244 245void MultiplexExternalSemaSource::ReadKnownNamespaces(246                                   SmallVectorImpl<NamespaceDecl*> &Namespaces){247  for(size_t i = 0; i < Sources.size(); ++i)248    Sources[i]->ReadKnownNamespaces(Namespaces);249}250 251void MultiplexExternalSemaSource::ReadUndefinedButUsed(252    llvm::MapVector<NamedDecl *, SourceLocation> &Undefined) {253  for(size_t i = 0; i < Sources.size(); ++i)254    Sources[i]->ReadUndefinedButUsed(Undefined);255}256 257void MultiplexExternalSemaSource::ReadMismatchingDeleteExpressions(258    llvm::MapVector<FieldDecl *,259                    llvm::SmallVector<std::pair<SourceLocation, bool>, 4>> &260        Exprs) {261  for (auto &Source : Sources)262    Source->ReadMismatchingDeleteExpressions(Exprs);263}264 265bool MultiplexExternalSemaSource::LookupUnqualified(LookupResult &R, Scope *S){266  for(size_t i = 0; i < Sources.size(); ++i)267    Sources[i]->LookupUnqualified(R, S);268 269  return !R.empty();270}271 272void MultiplexExternalSemaSource::ReadTentativeDefinitions(273                                     SmallVectorImpl<VarDecl*> &TentativeDefs) {274  for(size_t i = 0; i < Sources.size(); ++i)275    Sources[i]->ReadTentativeDefinitions(TentativeDefs);276}277 278void MultiplexExternalSemaSource::ReadUnusedFileScopedDecls(279                                SmallVectorImpl<const DeclaratorDecl*> &Decls) {280  for(size_t i = 0; i < Sources.size(); ++i)281    Sources[i]->ReadUnusedFileScopedDecls(Decls);282}283 284void MultiplexExternalSemaSource::ReadDelegatingConstructors(285                                  SmallVectorImpl<CXXConstructorDecl*> &Decls) {286  for(size_t i = 0; i < Sources.size(); ++i)287    Sources[i]->ReadDelegatingConstructors(Decls);288}289 290void MultiplexExternalSemaSource::ReadExtVectorDecls(291                                     SmallVectorImpl<TypedefNameDecl*> &Decls) {292  for(size_t i = 0; i < Sources.size(); ++i)293    Sources[i]->ReadExtVectorDecls(Decls);294}295 296void MultiplexExternalSemaSource::ReadDeclsToCheckForDeferredDiags(297    llvm::SmallSetVector<Decl *, 4> &Decls) {298  for(size_t i = 0; i < Sources.size(); ++i)299    Sources[i]->ReadDeclsToCheckForDeferredDiags(Decls);300}301 302void MultiplexExternalSemaSource::ReadUnusedLocalTypedefNameCandidates(303    llvm::SmallSetVector<const TypedefNameDecl *, 4> &Decls) {304  for(size_t i = 0; i < Sources.size(); ++i)305    Sources[i]->ReadUnusedLocalTypedefNameCandidates(Decls);306}307 308void MultiplexExternalSemaSource::ReadReferencedSelectors(309                  SmallVectorImpl<std::pair<Selector, SourceLocation> > &Sels) {310  for(size_t i = 0; i < Sources.size(); ++i)311    Sources[i]->ReadReferencedSelectors(Sels);312}313 314void MultiplexExternalSemaSource::ReadWeakUndeclaredIdentifiers(315                   SmallVectorImpl<std::pair<IdentifierInfo*, WeakInfo> > &WI) {316  for(size_t i = 0; i < Sources.size(); ++i)317    Sources[i]->ReadWeakUndeclaredIdentifiers(WI);318}319 320void MultiplexExternalSemaSource::ReadUsedVTables(321                                  SmallVectorImpl<ExternalVTableUse> &VTables) {322  for(size_t i = 0; i < Sources.size(); ++i)323    Sources[i]->ReadUsedVTables(VTables);324}325 326void MultiplexExternalSemaSource::ReadPendingInstantiations(327                                           SmallVectorImpl<std::pair<ValueDecl*,328                                                   SourceLocation> > &Pending) {329  for(size_t i = 0; i < Sources.size(); ++i)330    Sources[i]->ReadPendingInstantiations(Pending);331}332 333void MultiplexExternalSemaSource::ReadLateParsedTemplates(334    llvm::MapVector<const FunctionDecl *, std::unique_ptr<LateParsedTemplate>>335        &LPTMap) {336  for (size_t i = 0; i < Sources.size(); ++i)337    Sources[i]->ReadLateParsedTemplates(LPTMap);338}339 340TypoCorrection MultiplexExternalSemaSource::CorrectTypo(341                                     const DeclarationNameInfo &Typo,342                                     int LookupKind, Scope *S, CXXScopeSpec *SS,343                                     CorrectionCandidateCallback &CCC,344                                     DeclContext *MemberContext,345                                     bool EnteringContext,346                                     const ObjCObjectPointerType *OPT) {347  for (size_t I = 0, E = Sources.size(); I < E; ++I) {348    if (TypoCorrection C = Sources[I]->CorrectTypo(Typo, LookupKind, S, SS, CCC,349                                                   MemberContext,350                                                   EnteringContext, OPT))351      return C;352  }353  return TypoCorrection();354}355 356bool MultiplexExternalSemaSource::MaybeDiagnoseMissingCompleteType(357    SourceLocation Loc, QualType T) {358  for (size_t I = 0, E = Sources.size(); I < E; ++I) {359    if (Sources[I]->MaybeDiagnoseMissingCompleteType(Loc, T))360      return true;361  }362  return false;363}364 365void MultiplexExternalSemaSource::AssignedLambdaNumbering(366    CXXRecordDecl *Lambda) {367  for (auto &Source : Sources)368    Source->AssignedLambdaNumbering(Lambda);369}370