9 #ifndef LLDB_SOURCE_PLUGINS_EXPRESSIONPARSER_CLANG_ASTUTILS_H
10 #define LLDB_SOURCE_PLUGINS_EXPRESSIONPARSER_CLANG_ASTUTILS_H
12 #include "clang/Basic/Module.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"
27 assert(
m_Source &&
"Can't wrap nullptr ExternalASTSource");
41 return m_Source->GetNumExternalSelectors();
45 return m_Source->GetExternalDeclStmt(Offset);
48 clang::CXXCtorInitializer **
50 return m_Source->GetExternalCXXCtorInitializers(Offset);
53 clang::CXXBaseSpecifier *
55 return m_Source->GetExternalCXXBaseSpecifiers(Offset);
59 m_Source->updateOutOfDateIdentifier(II);
63 clang::DeclarationName Name)
override {
64 return m_Source->FindExternalVisibleDeclsByName(DC, Name);
68 m_Source->completeVisibleDeclsMap(DC);
75 llvm::Optional<clang::ASTSourceDescriptor>
81 return m_Source->hasExternalDefinitions(D);
85 const clang::DeclContext *DC,
86 llvm::function_ref<
bool(clang::Decl::Kind)> IsKindWeWant,
88 m_Source->FindExternalLexicalDecls(DC, IsKindWeWant, Result);
94 m_Source->FindFileRegionDecls(
File, Offset, Length, Decls);
116 m_Source->StartTranslationUnit(Consumer);
122 const clang::RecordDecl *Record, uint64_t &Size, uint64_t &Alignment,
123 llvm::DenseMap<const clang::FieldDecl *, uint64_t> &FieldOffsets,
124 llvm::DenseMap<const clang::CXXRecordDecl *, clang::CharUnits>
126 llvm::DenseMap<const clang::CXXRecordDecl *, clang::CharUnits>
127 &VirtualBaseOffsets)
override {
128 return m_Source->layoutRecordType(Record, Size, Alignment, FieldOffsets,
129 BaseOffsets, VirtualBaseOffsets);
142 m_sc = llvm::dyn_cast<clang::SemaConsumer>(
m_c);
148 m_c->Initialize(Context);
152 return m_c->HandleTopLevelDecl(D);
156 m_c->HandleInlineFunctionDefinition(D);
160 m_c->HandleInterestingDecl(D);
164 m_c->HandleTranslationUnit(Ctx);
168 m_c->HandleTagDeclDefinition(D);
172 m_c->HandleTagDeclRequiredDefinition(D);
176 m_c->HandleCXXImplicitFunctionInstantiation(D);
180 m_c->HandleTopLevelDeclInObjCContainer(D);
184 m_c->HandleImplicitImportDecl(D);
188 m_c->CompleteTentativeDefinition(D);
192 m_c->AssignInheritanceModel(RD);
196 m_c->HandleCXXStaticMemberVarInstantiation(D);
200 m_c->HandleVTable(RD);
204 return m_c->GetASTMutationListener();
208 return m_c->GetASTDeserializationListener();
215 m_sc->InitializeSema(S);
225 return m_c->shouldSkipFunctionBody(D);
246 llvm::SmallVector<clang::ExternalSemaSource *, 2>
Sources;
253 clang::ExternalSemaSource &low_quality_source) {
254 Sources.push_back(&high_quality_source);
255 Sources.push_back(&low_quality_source);
269 for (
size_t i = 0; i <
Sources.size(); ++i)
276 for (
size_t i = 0; i <
Sources.size(); ++i)
282 for (
size_t i = 0; i <
Sources.size(); ++i) {
283 Sel =
Sources[i]->GetExternalSelector(
ID);
291 for (
size_t i = 0; i <
Sources.size(); ++i)
298 for (
size_t i = 0; i <
Sources.size(); ++i)
304 clang::CXXBaseSpecifier *
306 for (
size_t i = 0; i <
Sources.size(); ++i)
307 if (clang::CXXBaseSpecifier *R =
313 clang::CXXCtorInitializer **
316 if (
auto *R = S->GetExternalCXXCtorInitializers(Offset))
323 if (
auto EK = S->hasExternalDefinitions(D))
324 if (EK != EK_ReplyHazy)
330 clang::DeclarationName Name)
override {
331 for (
size_t i = 0; i <
Sources.size(); ++i)
339 for (
size_t i = 0; i <
Sources.size(); ++i)
344 const clang::DeclContext *DC,
345 llvm::function_ref<
bool(clang::Decl::Kind)> IsKindWeWant,
347 for (
size_t i = 0; i <
Sources.size(); ++i) {
348 Sources[i]->FindExternalLexicalDecls(DC, IsKindWeWant, Result);
357 for (
size_t i = 0; i <
Sources.size(); ++i)
362 for (clang::ExternalSemaSource *S :
Sources) {
363 S->CompleteType(Tag);
365 if (Tag->isCompleteDefinition())
371 for (
size_t i = 0; i <
Sources.size(); ++i)
376 for (
size_t i = 0; i <
Sources.size(); ++i)
381 for (
size_t i = 0; i <
Sources.size(); ++i)
386 for (
size_t i = 0; i <
Sources.size(); ++i)
391 for (
size_t i = 0; i <
Sources.size(); ++i)
398 for (
size_t i = 0; i <
Sources.size(); ++i)
405 const clang::RecordDecl *Record, uint64_t &Size, uint64_t &Alignment,
406 llvm::DenseMap<const clang::FieldDecl *, uint64_t> &FieldOffsets,
407 llvm::DenseMap<const clang::CXXRecordDecl *, clang::CharUnits>
409 llvm::DenseMap<const clang::CXXRecordDecl *, clang::CharUnits>
410 &VirtualBaseOffsets)
override {
411 for (
size_t i = 0; i <
Sources.size(); ++i)
413 BaseOffsets, VirtualBaseOffsets))
420 Source->getMemoryBufferSizes(sizes);
429 Source->InitializeSema(S);
434 Source->ForgetSema();
439 Source->ReadMethodPool(Sel);
444 Source->updateOutOfDateSelector(Sel);
450 Source->ReadKnownNamespaces(Namespaces);
454 llvm::MapVector<clang::NamedDecl *, clang::SourceLocation> &Undefined)
457 Source->ReadUndefinedButUsed(Undefined);
461 llvm::MapVector<clang::FieldDecl *,
462 llvm::SmallVector<std::pair<clang::SourceLocation, bool>,
463 4>> &Exprs)
override {
465 Source->ReadMismatchingDeleteExpressions(Exprs);
470 Source->LookupUnqualified(R, S);
481 Source->ReadTentativeDefinitions(Defs);
487 Source->ReadUnusedFileScopedDecls(Decls);
493 Source->ReadDelegatingConstructors(Decls);
499 Source->ReadExtVectorDecls(Decls);
503 llvm::SmallSetVector<const clang::TypedefNameDecl *, 4> &Decls)
override {
505 Source->ReadUnusedLocalTypedefNameCandidates(Decls);
512 Source->ReadReferencedSelectors(Sels);
519 Source->ReadWeakUndeclaredIdentifiers(WI);
525 Source->ReadUsedVTables(VTables);
530 std::pair<clang::ValueDecl *, clang::SourceLocation>> &Pending)
533 Source->ReadPendingInstantiations(Pending);
537 llvm::MapVector<
const clang::FunctionDecl *,
538 std::unique_ptr<clang::LateParsedTemplate>> &LPTMap)
541 Source->ReadLateParsedTemplates(LPTMap);
544 clang::TypoCorrection
545 CorrectTypo(
const clang::DeclarationNameInfo &Typo,
int LookupKind,
546 clang::Scope *S, clang::CXXScopeSpec *SS,
547 clang::CorrectionCandidateCallback &CCC,
548 clang::DeclContext *MemberContext,
bool EnteringContext,
549 const clang::ObjCObjectPointerType *OPT)
override {
551 if (clang::TypoCorrection C =
552 Source->CorrectTypo(Typo, LookupKind, S, SS, CCC,
553 MemberContext, EnteringContext, OPT))
556 return clang::TypoCorrection();
560 clang::QualType T)
override {
562 if (Source->MaybeDiagnoseMissingCompleteType(Loc, T))
570 #endif // LLDB_SOURCE_PLUGINS_EXPRESSIONPARSER_CLANG_ASTUTILS_H