9#ifndef LLDB_SOURCE_PLUGINS_EXPRESSIONPARSER_CLANG_ASTUTILS_H
10#define LLDB_SOURCE_PLUGINS_EXPRESSIONPARSER_CLANG_ASTUTILS_H
12#include "clang/Basic/ASTSourceDescriptor.h"
13#include "clang/Sema/Lookup.h"
14#include "clang/Sema/MultiplexExternalSemaSource.h"
15#include "clang/Sema/Sema.h"
16#include "clang/Sema/SemaConsumer.h"
17#include "llvm/ADT/IntrusiveRefCntPtr.h"
18#include "llvm/Support/Casting.h"
33 llvm::IntrusiveRefCntPtr<ExternalASTSource>
m_Source;
37 llvm::IntrusiveRefCntPtr<ExternalASTSource>
Source)
39 assert(
m_Source &&
"Can't wrap nullptr ExternalASTSource");
53 return m_Source->GetNumExternalSelectors();
57 return m_Source->GetExternalDeclStmt(Offset);
60 clang::CXXCtorInitializer **
62 return m_Source->GetExternalCXXCtorInitializers(Offset);
65 clang::CXXBaseSpecifier *
67 return m_Source->GetExternalCXXBaseSpecifiers(Offset);
71 m_Source->updateOutOfDateIdentifier(II);
75 const clang::DeclContext *DC, clang::DeclarationName Name,
76 const clang::DeclContext *OriginalDC)
override {
77 return m_Source->FindExternalVisibleDeclsByName(DC, Name, OriginalDC);
81 bool OnlyPartial)
override {
82 return m_Source->LoadExternalSpecializations(D, OnlyPartial);
87 llvm::ArrayRef<clang::TemplateArgument> TemplateArgs)
override {
88 return m_Source->LoadExternalSpecializations(D, TemplateArgs);
92 m_Source->completeVisibleDeclsMap(DC);
99 std::optional<clang::ASTSourceDescriptor>
105 return m_Source->hasExternalDefinitions(D);
109 const clang::DeclContext *DC,
110 llvm::function_ref<
bool(clang::Decl::Kind)> IsKindWeWant,
112 m_Source->FindExternalLexicalDecls(DC, IsKindWeWant, Result);
118 m_Source->FindFileRegionDecls(
File, Offset, Length, Decls);
140 m_Source->StartTranslationUnit(Consumer);
146 const clang::RecordDecl *Record, uint64_t &Size, uint64_t &Alignment,
147 llvm::DenseMap<const clang::FieldDecl *, uint64_t> &FieldOffsets,
148 llvm::DenseMap<const clang::CXXRecordDecl *, clang::CharUnits>
150 llvm::DenseMap<const clang::CXXRecordDecl *, clang::CharUnits>
151 &VirtualBaseOffsets)
override {
152 return m_Source->layoutRecordType(Record, Size, Alignment, FieldOffsets,
153 BaseOffsets, VirtualBaseOffsets);
157 if (
auto *sema_source =
158 llvm::dyn_cast<clang::ExternalSemaSource>(
m_Source.get()))
159 sema_source->StartedQualifiedLookup(DC);
163 if (
auto *sema_source =
164 llvm::dyn_cast<clang::ExternalSemaSource>(
m_Source.get()))
165 sema_source->FinishedQualifiedLookup(DC);
178 llvm::MapVector<clang::NamedDecl *, clang::SourceLocation> &Undefined)
180 Undefined.remove_if([](
auto const &decl_loc_pair) {
181 const clang::NamedDecl *ND = decl_loc_pair.first;
182 return llvm::isa_and_present<clang::FunctionDecl>(ND);
196 m_sc = llvm::dyn_cast<clang::SemaConsumer>(
m_c);
202 m_c->Initialize(Context);
206 return m_c->HandleTopLevelDecl(D);
210 m_c->HandleInlineFunctionDefinition(D);
214 m_c->HandleInterestingDecl(D);
218 m_c->HandleTranslationUnit(Ctx);
222 m_c->HandleTagDeclDefinition(D);
226 m_c->HandleTagDeclRequiredDefinition(D);
230 m_c->HandleCXXImplicitFunctionInstantiation(D);
234 m_c->HandleTopLevelDeclInObjCContainer(D);
238 m_c->HandleImplicitImportDecl(D);
242 m_c->CompleteTentativeDefinition(D);
246 m_c->AssignInheritanceModel(RD);
250 m_c->HandleCXXStaticMemberVarInstantiation(D);
254 m_c->HandleVTable(RD);
258 return m_c->GetASTMutationListener();
262 return m_c->GetASTDeserializationListener();
269 m_sc->InitializeSema(S);
279 return m_c->shouldSkipFunctionBody(D);
300 llvm::SmallVector<llvm::IntrusiveRefCntPtr<clang::ExternalSemaSource>, 2>
310 llvm::IntrusiveRefCntPtr<clang::ExternalSemaSource> high_quality_source,
311 llvm::IntrusiveRefCntPtr<clang::ExternalSemaSource> low_quality_source) {
312 assert(high_quality_source);
313 assert(low_quality_source);
315 Sources.push_back(std::move(high_quality_source));
316 Sources.push_back(std::move(low_quality_source));
326 for (
size_t i = 0; i <
Sources.size(); ++i)
333 bool OnlyPartial)
override {
334 bool newDeclFound =
false;
335 for (
size_t i = 0; i <
Sources.size(); ++i)
341 const clang::Decl *D,
342 llvm::ArrayRef<clang::TemplateArgument> TemplateArgs)
override {
343 bool newDeclFound =
false;
344 for (
size_t i = 0; i <
Sources.size(); ++i)
350 for (
size_t i = 0; i <
Sources.size(); ++i)
356 for (
size_t i = 0; i <
Sources.size(); ++i) {
357 Sel =
Sources[i]->GetExternalSelector(
ID);
365 for (
size_t i = 0; i <
Sources.size(); ++i)
372 for (
size_t i = 0; i <
Sources.size(); ++i)
378 clang::CXXBaseSpecifier *
380 for (
size_t i = 0; i <
Sources.size(); ++i)
381 if (clang::CXXBaseSpecifier *R =
387 clang::CXXCtorInitializer **
390 if (
auto *R = S->GetExternalCXXCtorInitializers(Offset))
397 if (
auto EK = S->hasExternalDefinitions(D))
398 if (EK != EK_ReplyHazy)
404 const clang::DeclContext *DC, clang::DeclarationName Name,
405 const clang::DeclContext *OriginalDC)
override {
406 for (
size_t i = 0; i <
Sources.size(); ++i)
414 for (
size_t i = 0; i <
Sources.size(); ++i)
419 const clang::DeclContext *DC,
420 llvm::function_ref<
bool(clang::Decl::Kind)> IsKindWeWant,
422 for (
size_t i = 0; i <
Sources.size(); ++i) {
423 Sources[i]->FindExternalLexicalDecls(DC, IsKindWeWant, Result);
432 for (
size_t i = 0; i <
Sources.size(); ++i)
437 for (
const auto &S :
Sources) {
438 S->CompleteType(Tag);
440 if (Tag->isCompleteDefinition())
446 for (
size_t i = 0; i <
Sources.size(); ++i)
451 for (
size_t i = 0; i <
Sources.size(); ++i)
456 for (
size_t i = 0; i <
Sources.size(); ++i)
461 for (
size_t i = 0; i <
Sources.size(); ++i)
466 for (
size_t i = 0; i <
Sources.size(); ++i)
473 for (
size_t i = 0; i <
Sources.size(); ++i)
480 const clang::RecordDecl *Record, uint64_t &Size, uint64_t &Alignment,
481 llvm::DenseMap<const clang::FieldDecl *, uint64_t> &FieldOffsets,
482 llvm::DenseMap<const clang::CXXRecordDecl *, clang::CharUnits>
484 llvm::DenseMap<const clang::CXXRecordDecl *, clang::CharUnits>
485 &VirtualBaseOffsets)
override {
486 for (
size_t i = 0; i <
Sources.size(); ++i)
488 BaseOffsets, VirtualBaseOffsets))
495 Source->getMemoryBufferSizes(sizes);
504 Source->InitializeSema(S);
514 Source->ReadMethodPool(Sel);
519 Source->updateOutOfDateSelector(Sel);
525 Source->ReadKnownNamespaces(Namespaces);
529 llvm::MapVector<clang::NamedDecl *, clang::SourceLocation> &Undefined)
532 Source->ReadUndefinedButUsed(Undefined);
536 llvm::MapVector<clang::FieldDecl *,
537 llvm::SmallVector<std::pair<clang::SourceLocation, bool>,
538 4>> &Exprs)
override {
540 Source->ReadMismatchingDeleteExpressions(Exprs);
545 Source->LookupUnqualified(R, S);
556 Source->ReadTentativeDefinitions(Defs);
562 Source->ReadUnusedFileScopedDecls(Decls);
568 Source->ReadDelegatingConstructors(Decls);
574 Source->ReadExtVectorDecls(Decls);
578 llvm::SmallPtrSetImpl<const clang::TypedefNameDecl *> &Decls)
override {
580 Source->ReadUnusedLocalTypedefNameCandidates(Decls);
587 Source->ReadReferencedSelectors(Sels);
594 Source->ReadWeakUndeclaredIdentifiers(WI);
599 clang::AsmLabelAttr *>> &EI)
override {
601 Source->ReadExtnameUndeclaredIdentifiers(EI);
607 Source->ReadUsedVTables(VTables);
612 std::pair<clang::ValueDecl *, clang::SourceLocation>> &Pending)
615 Source->ReadPendingInstantiations(Pending);
619 llvm::MapVector<
const clang::FunctionDecl *,
620 std::unique_ptr<clang::LateParsedTemplate>> &LPTMap)
623 Source->ReadLateParsedTemplates(LPTMap);
626 clang::TypoCorrection
627 CorrectTypo(
const clang::DeclarationNameInfo &Typo,
int LookupKind,
628 clang::Scope *S, clang::CXXScopeSpec *SS,
629 clang::CorrectionCandidateCallback &CCC,
630 clang::DeclContext *MemberContext,
bool EnteringContext,
631 const clang::ObjCObjectPointerType *OPT)
override {
633 if (clang::TypoCorrection C =
634 Source->CorrectTypo(Typo, LookupKind, S, SS, CCC,
635 MemberContext, EnteringContext, OPT))
638 return clang::TypoCorrection();
642 clang::QualType T)
override {
644 if (
Source->MaybeDiagnoseMissingCompleteType(Loc, T))
652 Source->StartedQualifiedLookup(DC);
657 Source->FinishedQualifiedLookup(DC);
void HandleTranslationUnit(clang::ASTContext &Ctx) override
void PrintStats() override
void HandleInlineFunctionDefinition(clang::FunctionDecl *D) override
void InitializeSema(clang::Sema &S) override
void HandleInterestingDecl(clang::DeclGroupRef D) override
ASTConsumerForwarder(clang::ASTConsumer *c)
bool shouldSkipFunctionBody(clang::Decl *D) override
void HandleTagDeclDefinition(clang::TagDecl *D) override
void AssignInheritanceModel(clang::CXXRecordDecl *RD) override
~ASTConsumerForwarder() override
clang::SemaConsumer * m_sc
void HandleTopLevelDeclInObjCContainer(clang::DeclGroupRef D) override
clang::ASTDeserializationListener * GetASTDeserializationListener() override
void ForgetSema() override
Inform the semantic consumer that Sema is no longer available.
bool HandleTopLevelDecl(clang::DeclGroupRef D) override
void HandleCXXImplicitFunctionInstantiation(clang::FunctionDecl *D) override
void CompleteTentativeDefinition(clang::VarDecl *D) override
void HandleTagDeclRequiredDefinition(const clang::TagDecl *D) override
void HandleVTable(clang::CXXRecordDecl *RD) override
void HandleCXXStaticMemberVarInstantiation(clang::VarDecl *D) override
void Initialize(clang::ASTContext &Context) override
void HandleImplicitImportDecl(clang::ImportDecl *D) override
clang::ASTMutationListener * GetASTMutationListener() override
std::optional< clang::ASTSourceDescriptor > getSourceDescriptor(unsigned ID) override
~ExternalASTSourceWrapper() override
void ReadUndefinedButUsed(llvm::MapVector< clang::NamedDecl *, clang::SourceLocation > &Undefined) override
This gets called when Sema is reconciling undefined but used decls.
clang::Module * getModule(unsigned ID) override
void StartedQualifiedLookup(const clang::DeclContext *DC) override
clang::Selector GetExternalSelector(uint32_t ID) override
ExtKind hasExternalDefinitions(const clang::Decl *D) override
void StartedDeserializing() override
ExternalASTSourceWrapper(llvm::IntrusiveRefCntPtr< ExternalASTSource > Source)
clang::Stmt * GetExternalDeclStmt(uint64_t Offset) override
void completeVisibleDeclsMap(const clang::DeclContext *DC) override
llvm::IntrusiveRefCntPtr< ExternalASTSource > m_Source
void FinishedDeserializing() override
void FinishedQualifiedLookup(const clang::DeclContext *DC) override
void FindFileRegionDecls(clang::FileID File, unsigned Offset, unsigned Length, llvm::SmallVectorImpl< clang::Decl * > &Decls) override
bool FindExternalVisibleDeclsByName(const clang::DeclContext *DC, clang::DeclarationName Name, const clang::DeclContext *OriginalDC) override
void CompleteType(clang::ObjCInterfaceDecl *Class) override
void PrintStats() override
clang::Decl * GetExternalDecl(clang::GlobalDeclID ID) override
uint32_t GetNumExternalSelectors() override
void FindExternalLexicalDecls(const clang::DeclContext *DC, llvm::function_ref< bool(clang::Decl::Kind)> IsKindWeWant, llvm::SmallVectorImpl< clang::Decl * > &Result) override
clang::CXXBaseSpecifier * GetExternalCXXBaseSpecifiers(uint64_t Offset) override
void ReadComments() override
void StartTranslationUnit(clang::ASTConsumer *Consumer) override
bool LoadExternalSpecializations(const clang::Decl *D, bool OnlyPartial) override
void CompleteRedeclChain(const clang::Decl *D) override
clang::CXXCtorInitializer ** GetExternalCXXCtorInitializers(uint64_t Offset) override
bool LoadExternalSpecializations(const clang::Decl *D, llvm::ArrayRef< clang::TemplateArgument > TemplateArgs) override
void updateOutOfDateIdentifier(const clang::IdentifierInfo &II) override
bool layoutRecordType(const clang::RecordDecl *Record, uint64_t &Size, uint64_t &Alignment, llvm::DenseMap< const clang::FieldDecl *, uint64_t > &FieldOffsets, llvm::DenseMap< const clang::CXXRecordDecl *, clang::CharUnits > &BaseOffsets, llvm::DenseMap< const clang::CXXRecordDecl *, clang::CharUnits > &VirtualBaseOffsets) override
void CompleteType(clang::TagDecl *Tag) override
An abstract base class for files.
void ReadUndefinedButUsed(llvm::MapVector< clang::NamedDecl *, clang::SourceLocation > &Undefined) override
void ReadKnownNamespaces(llvm::SmallVectorImpl< clang::NamespaceDecl * > &Namespaces) override
void ReadExtVectorDecls(llvm::SmallVectorImpl< clang::TypedefNameDecl * > &Decls) override
uint32_t GetNumExternalSelectors() override
bool MaybeDiagnoseMissingCompleteType(clang::SourceLocation Loc, clang::QualType T) override
void StartedQualifiedLookup(const clang::DeclContext *DC) override
clang::Selector GetExternalSelector(uint32_t ID) override
void StartedDeserializing() override
llvm::SmallVector< llvm::IntrusiveRefCntPtr< clang::ExternalSemaSource >, 2 > Sources
The sources ordered in decreasing priority.
clang::Module * getModule(unsigned ID) override
void FindExternalLexicalDecls(const clang::DeclContext *DC, llvm::function_ref< bool(clang::Decl::Kind)> IsKindWeWant, llvm::SmallVectorImpl< clang::Decl * > &Result) override
bool FindExternalVisibleDeclsByName(const clang::DeclContext *DC, clang::DeclarationName Name, const clang::DeclContext *OriginalDC) override
void FinishedDeserializing() override
void ReadUsedVTables(llvm::SmallVectorImpl< clang::ExternalVTableUse > &VTables) override
clang::TypoCorrection CorrectTypo(const clang::DeclarationNameInfo &Typo, int LookupKind, clang::Scope *S, clang::CXXScopeSpec *SS, clang::CorrectionCandidateCallback &CCC, clang::DeclContext *MemberContext, bool EnteringContext, const clang::ObjCObjectPointerType *OPT) override
bool LoadExternalSpecializations(const clang::Decl *D, llvm::ArrayRef< clang::TemplateArgument > TemplateArgs) override
void CompleteRedeclChain(const clang::Decl *D) override
clang::Stmt * GetExternalDeclStmt(uint64_t Offset) override
void getMemoryBufferSizes(MemoryBufferSizes &sizes) const override
clang::Decl * GetExternalDecl(clang::GlobalDeclID ID) override
void ReadExtnameUndeclaredIdentifiers(llvm::SmallVectorImpl< std::pair< clang::IdentifierInfo *, clang::AsmLabelAttr * > > &EI) override
void StartTranslationUnit(clang::ASTConsumer *Consumer) override
clang::CXXCtorInitializer ** GetExternalCXXCtorInitializers(uint64_t Offset) override
void ReadTentativeDefinitions(llvm::SmallVectorImpl< clang::VarDecl * > &Defs) override
void ReadReferencedSelectors(llvm::SmallVectorImpl< std::pair< clang::Selector, clang::SourceLocation > > &Sels) override
void ReadLateParsedTemplates(llvm::MapVector< const clang::FunctionDecl *, std::unique_ptr< clang::LateParsedTemplate > > &LPTMap) override
bool layoutRecordType(const clang::RecordDecl *Record, uint64_t &Size, uint64_t &Alignment, llvm::DenseMap< const clang::FieldDecl *, uint64_t > &FieldOffsets, llvm::DenseMap< const clang::CXXRecordDecl *, clang::CharUnits > &BaseOffsets, llvm::DenseMap< const clang::CXXRecordDecl *, clang::CharUnits > &VirtualBaseOffsets) override
void FinishedQualifiedLookup(const clang::DeclContext *DC) override
void ReadMethodPool(clang::Selector Sel) override
clang::CXXBaseSpecifier * GetExternalCXXBaseSpecifiers(uint64_t Offset) override
void PrintStats() override
void CompleteType(clang::TagDecl *Tag) override
SemaSourceWithPriorities(llvm::IntrusiveRefCntPtr< clang::ExternalSemaSource > high_quality_source, llvm::IntrusiveRefCntPtr< clang::ExternalSemaSource > low_quality_source)
Construct a SemaSourceWithPriorities with a 'high quality' source that has the higher priority and a ...
void ForgetSema() override
void FindFileRegionDecls(clang::FileID File, unsigned Offset, unsigned Length, llvm::SmallVectorImpl< clang::Decl * > &Decls) override
bool LoadExternalSpecializations(const clang::Decl *D, bool OnlyPartial) override
void ReadUnusedFileScopedDecls(llvm::SmallVectorImpl< const clang::DeclaratorDecl * > &Decls) override
void CompleteType(clang::ObjCInterfaceDecl *Class) override
void completeVisibleDeclsMap(const clang::DeclContext *DC) override
void ReadPendingInstantiations(llvm::SmallVectorImpl< std::pair< clang::ValueDecl *, clang::SourceLocation > > &Pending) override
void ReadDelegatingConstructors(llvm::SmallVectorImpl< clang::CXXConstructorDecl * > &Decls) override
bool LookupUnqualified(clang::LookupResult &R, clang::Scope *S) override
void ReadUnusedLocalTypedefNameCandidates(llvm::SmallPtrSetImpl< const clang::TypedefNameDecl * > &Decls) override
void updateOutOfDateSelector(clang::Selector Sel) override
void ReadComments() override
void ReadWeakUndeclaredIdentifiers(llvm::SmallVectorImpl< std::pair< clang::IdentifierInfo *, clang::WeakInfo > > &WI) override
void ReadMismatchingDeleteExpressions(llvm::MapVector< clang::FieldDecl *, llvm::SmallVector< std::pair< clang::SourceLocation, bool >, 4 > > &Exprs) override
ExtKind hasExternalDefinitions(const clang::Decl *D) override
~SemaSourceWithPriorities() override
void InitializeSema(clang::Sema &S) override
A class that represents a running process on the host machine.