Path: blob/main/contrib/llvm-project/clang/lib/Sema/MultiplexExternalSemaSource.cpp
35234 views
//===--- MultiplexExternalSemaSource.cpp ---------------------------------===//1//2// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.3// See https://llvm.org/LICENSE.txt for license information.4// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception5//6//===----------------------------------------------------------------------===//7//8// This file implements the event dispatching to the subscribed clients.9//10//===----------------------------------------------------------------------===//11#include "clang/Sema/MultiplexExternalSemaSource.h"12#include "clang/Sema/Lookup.h"1314using namespace clang;1516char MultiplexExternalSemaSource::ID;1718/// Constructs a new multiplexing external sema source and appends the19/// given element to it.20///21MultiplexExternalSemaSource::MultiplexExternalSemaSource(22ExternalSemaSource *S1, ExternalSemaSource *S2) {23S1->Retain();24S2->Retain();25Sources.push_back(S1);26Sources.push_back(S2);27}2829// pin the vtable here.30MultiplexExternalSemaSource::~MultiplexExternalSemaSource() {31for (auto *S : Sources)32S->Release();33}3435/// Appends new source to the source list.36///37///\param[in] source - An ExternalSemaSource.38///39void MultiplexExternalSemaSource::AddSource(ExternalSemaSource *Source) {40Source->Retain();41Sources.push_back(Source);42}4344//===----------------------------------------------------------------------===//45// ExternalASTSource.46//===----------------------------------------------------------------------===//4748Decl *MultiplexExternalSemaSource::GetExternalDecl(GlobalDeclID ID) {49for(size_t i = 0; i < Sources.size(); ++i)50if (Decl *Result = Sources[i]->GetExternalDecl(ID))51return Result;52return nullptr;53}5455void MultiplexExternalSemaSource::CompleteRedeclChain(const Decl *D) {56for (size_t i = 0; i < Sources.size(); ++i)57Sources[i]->CompleteRedeclChain(D);58}5960Selector MultiplexExternalSemaSource::GetExternalSelector(uint32_t ID) {61Selector Sel;62for(size_t i = 0; i < Sources.size(); ++i) {63Sel = Sources[i]->GetExternalSelector(ID);64if (!Sel.isNull())65return Sel;66}67return Sel;68}6970uint32_t MultiplexExternalSemaSource::GetNumExternalSelectors() {71uint32_t total = 0;72for(size_t i = 0; i < Sources.size(); ++i)73total += Sources[i]->GetNumExternalSelectors();74return total;75}7677Stmt *MultiplexExternalSemaSource::GetExternalDeclStmt(uint64_t Offset) {78for(size_t i = 0; i < Sources.size(); ++i)79if (Stmt *Result = Sources[i]->GetExternalDeclStmt(Offset))80return Result;81return nullptr;82}8384CXXBaseSpecifier *MultiplexExternalSemaSource::GetExternalCXXBaseSpecifiers(85uint64_t Offset){86for(size_t i = 0; i < Sources.size(); ++i)87if (CXXBaseSpecifier *R = Sources[i]->GetExternalCXXBaseSpecifiers(Offset))88return R;89return nullptr;90}9192CXXCtorInitializer **93MultiplexExternalSemaSource::GetExternalCXXCtorInitializers(uint64_t Offset) {94for (auto *S : Sources)95if (auto *R = S->GetExternalCXXCtorInitializers(Offset))96return R;97return nullptr;98}99100ExternalASTSource::ExtKind101MultiplexExternalSemaSource::hasExternalDefinitions(const Decl *D) {102for (const auto &S : Sources)103if (auto EK = S->hasExternalDefinitions(D))104if (EK != EK_ReplyHazy)105return EK;106return EK_ReplyHazy;107}108109bool MultiplexExternalSemaSource::110FindExternalVisibleDeclsByName(const DeclContext *DC, DeclarationName Name) {111bool AnyDeclsFound = false;112for (size_t i = 0; i < Sources.size(); ++i)113AnyDeclsFound |= Sources[i]->FindExternalVisibleDeclsByName(DC, Name);114return AnyDeclsFound;115}116117void MultiplexExternalSemaSource::completeVisibleDeclsMap(const DeclContext *DC){118for(size_t i = 0; i < Sources.size(); ++i)119Sources[i]->completeVisibleDeclsMap(DC);120}121122void MultiplexExternalSemaSource::FindExternalLexicalDecls(123const DeclContext *DC, llvm::function_ref<bool(Decl::Kind)> IsKindWeWant,124SmallVectorImpl<Decl *> &Result) {125for(size_t i = 0; i < Sources.size(); ++i)126Sources[i]->FindExternalLexicalDecls(DC, IsKindWeWant, Result);127}128129void MultiplexExternalSemaSource::FindFileRegionDecls(FileID File,130unsigned Offset,131unsigned Length,132SmallVectorImpl<Decl *> &Decls){133for(size_t i = 0; i < Sources.size(); ++i)134Sources[i]->FindFileRegionDecls(File, Offset, Length, Decls);135}136137void MultiplexExternalSemaSource::CompleteType(TagDecl *Tag) {138for(size_t i = 0; i < Sources.size(); ++i)139Sources[i]->CompleteType(Tag);140}141142void MultiplexExternalSemaSource::CompleteType(ObjCInterfaceDecl *Class) {143for(size_t i = 0; i < Sources.size(); ++i)144Sources[i]->CompleteType(Class);145}146147void MultiplexExternalSemaSource::ReadComments() {148for(size_t i = 0; i < Sources.size(); ++i)149Sources[i]->ReadComments();150}151152void MultiplexExternalSemaSource::StartedDeserializing() {153for(size_t i = 0; i < Sources.size(); ++i)154Sources[i]->StartedDeserializing();155}156157void MultiplexExternalSemaSource::FinishedDeserializing() {158for(size_t i = 0; i < Sources.size(); ++i)159Sources[i]->FinishedDeserializing();160}161162void MultiplexExternalSemaSource::StartTranslationUnit(ASTConsumer *Consumer) {163for(size_t i = 0; i < Sources.size(); ++i)164Sources[i]->StartTranslationUnit(Consumer);165}166167void MultiplexExternalSemaSource::PrintStats() {168for(size_t i = 0; i < Sources.size(); ++i)169Sources[i]->PrintStats();170}171172Module *MultiplexExternalSemaSource::getModule(unsigned ID) {173for (size_t i = 0; i < Sources.size(); ++i)174if (auto M = Sources[i]->getModule(ID))175return M;176return nullptr;177}178179bool MultiplexExternalSemaSource::layoutRecordType(const RecordDecl *Record,180uint64_t &Size,181uint64_t &Alignment,182llvm::DenseMap<const FieldDecl *, uint64_t> &FieldOffsets,183llvm::DenseMap<const CXXRecordDecl *, CharUnits> &BaseOffsets,184llvm::DenseMap<const CXXRecordDecl *, CharUnits> &VirtualBaseOffsets){185for(size_t i = 0; i < Sources.size(); ++i)186if (Sources[i]->layoutRecordType(Record, Size, Alignment, FieldOffsets,187BaseOffsets, VirtualBaseOffsets))188return true;189return false;190}191192void MultiplexExternalSemaSource::193getMemoryBufferSizes(MemoryBufferSizes &sizes) const {194for(size_t i = 0; i < Sources.size(); ++i)195Sources[i]->getMemoryBufferSizes(sizes);196197}198199//===----------------------------------------------------------------------===//200// ExternalSemaSource.201//===----------------------------------------------------------------------===//202203204void MultiplexExternalSemaSource::InitializeSema(Sema &S) {205for(size_t i = 0; i < Sources.size(); ++i)206Sources[i]->InitializeSema(S);207}208209void MultiplexExternalSemaSource::ForgetSema() {210for(size_t i = 0; i < Sources.size(); ++i)211Sources[i]->ForgetSema();212}213214void MultiplexExternalSemaSource::ReadMethodPool(Selector Sel) {215for(size_t i = 0; i < Sources.size(); ++i)216Sources[i]->ReadMethodPool(Sel);217}218219void MultiplexExternalSemaSource::updateOutOfDateSelector(Selector Sel) {220for(size_t i = 0; i < Sources.size(); ++i)221Sources[i]->updateOutOfDateSelector(Sel);222}223224void MultiplexExternalSemaSource::ReadKnownNamespaces(225SmallVectorImpl<NamespaceDecl*> &Namespaces){226for(size_t i = 0; i < Sources.size(); ++i)227Sources[i]->ReadKnownNamespaces(Namespaces);228}229230void MultiplexExternalSemaSource::ReadUndefinedButUsed(231llvm::MapVector<NamedDecl *, SourceLocation> &Undefined) {232for(size_t i = 0; i < Sources.size(); ++i)233Sources[i]->ReadUndefinedButUsed(Undefined);234}235236void MultiplexExternalSemaSource::ReadMismatchingDeleteExpressions(237llvm::MapVector<FieldDecl *,238llvm::SmallVector<std::pair<SourceLocation, bool>, 4>> &239Exprs) {240for (auto &Source : Sources)241Source->ReadMismatchingDeleteExpressions(Exprs);242}243244bool MultiplexExternalSemaSource::LookupUnqualified(LookupResult &R, Scope *S){245for(size_t i = 0; i < Sources.size(); ++i)246Sources[i]->LookupUnqualified(R, S);247248return !R.empty();249}250251void MultiplexExternalSemaSource::ReadTentativeDefinitions(252SmallVectorImpl<VarDecl*> &TentativeDefs) {253for(size_t i = 0; i < Sources.size(); ++i)254Sources[i]->ReadTentativeDefinitions(TentativeDefs);255}256257void MultiplexExternalSemaSource::ReadUnusedFileScopedDecls(258SmallVectorImpl<const DeclaratorDecl*> &Decls) {259for(size_t i = 0; i < Sources.size(); ++i)260Sources[i]->ReadUnusedFileScopedDecls(Decls);261}262263void MultiplexExternalSemaSource::ReadDelegatingConstructors(264SmallVectorImpl<CXXConstructorDecl*> &Decls) {265for(size_t i = 0; i < Sources.size(); ++i)266Sources[i]->ReadDelegatingConstructors(Decls);267}268269void MultiplexExternalSemaSource::ReadExtVectorDecls(270SmallVectorImpl<TypedefNameDecl*> &Decls) {271for(size_t i = 0; i < Sources.size(); ++i)272Sources[i]->ReadExtVectorDecls(Decls);273}274275void MultiplexExternalSemaSource::ReadDeclsToCheckForDeferredDiags(276llvm::SmallSetVector<Decl *, 4> &Decls) {277for(size_t i = 0; i < Sources.size(); ++i)278Sources[i]->ReadDeclsToCheckForDeferredDiags(Decls);279}280281void MultiplexExternalSemaSource::ReadUnusedLocalTypedefNameCandidates(282llvm::SmallSetVector<const TypedefNameDecl *, 4> &Decls) {283for(size_t i = 0; i < Sources.size(); ++i)284Sources[i]->ReadUnusedLocalTypedefNameCandidates(Decls);285}286287void MultiplexExternalSemaSource::ReadReferencedSelectors(288SmallVectorImpl<std::pair<Selector, SourceLocation> > &Sels) {289for(size_t i = 0; i < Sources.size(); ++i)290Sources[i]->ReadReferencedSelectors(Sels);291}292293void MultiplexExternalSemaSource::ReadWeakUndeclaredIdentifiers(294SmallVectorImpl<std::pair<IdentifierInfo*, WeakInfo> > &WI) {295for(size_t i = 0; i < Sources.size(); ++i)296Sources[i]->ReadWeakUndeclaredIdentifiers(WI);297}298299void MultiplexExternalSemaSource::ReadUsedVTables(300SmallVectorImpl<ExternalVTableUse> &VTables) {301for(size_t i = 0; i < Sources.size(); ++i)302Sources[i]->ReadUsedVTables(VTables);303}304305void MultiplexExternalSemaSource::ReadPendingInstantiations(306SmallVectorImpl<std::pair<ValueDecl*,307SourceLocation> > &Pending) {308for(size_t i = 0; i < Sources.size(); ++i)309Sources[i]->ReadPendingInstantiations(Pending);310}311312void MultiplexExternalSemaSource::ReadLateParsedTemplates(313llvm::MapVector<const FunctionDecl *, std::unique_ptr<LateParsedTemplate>>314&LPTMap) {315for (size_t i = 0; i < Sources.size(); ++i)316Sources[i]->ReadLateParsedTemplates(LPTMap);317}318319TypoCorrection MultiplexExternalSemaSource::CorrectTypo(320const DeclarationNameInfo &Typo,321int LookupKind, Scope *S, CXXScopeSpec *SS,322CorrectionCandidateCallback &CCC,323DeclContext *MemberContext,324bool EnteringContext,325const ObjCObjectPointerType *OPT) {326for (size_t I = 0, E = Sources.size(); I < E; ++I) {327if (TypoCorrection C = Sources[I]->CorrectTypo(Typo, LookupKind, S, SS, CCC,328MemberContext,329EnteringContext, OPT))330return C;331}332return TypoCorrection();333}334335bool MultiplexExternalSemaSource::MaybeDiagnoseMissingCompleteType(336SourceLocation Loc, QualType T) {337for (size_t I = 0, E = Sources.size(); I < E; ++I) {338if (Sources[I]->MaybeDiagnoseMissingCompleteType(Loc, T))339return true;340}341return false;342}343344void MultiplexExternalSemaSource::AssignedLambdaNumbering(345const CXXRecordDecl *Lambda) {346for (auto *Source : Sources)347Source->AssignedLambdaNumbering(Lambda);348}349350351