1 //===-- ClangExternalASTSourceCallbacks.h -----------------------*- C++ -*-===//
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-exception
7 //===----------------------------------------------------------------------===//
9 #ifndef liblldb_ClangExternalASTSourceCallbacks_h_
10 #define liblldb_ClangExternalASTSourceCallbacks_h_
14 #include "clang/AST/CharUnits.h"
15 #include "llvm/ADT/DenseMap.h"
17 #include "lldb/Core/ClangForward.h"
18 #include "lldb/Symbol/ClangExternalASTSourceCommon.h"
19 #include "lldb/Symbol/CompilerType.h"
20 #include "lldb/lldb-enumerations.h"
22 namespace lldb_private {
24 class ClangExternalASTSourceCallbacks : public ClangExternalASTSourceCommon {
26 typedef void (*CompleteTagDeclCallback)(void *baton, clang::TagDecl *);
27 typedef void (*CompleteObjCInterfaceDeclCallback)(void *baton,
28 clang::ObjCInterfaceDecl *);
29 typedef void (*FindExternalVisibleDeclsByNameCallback)(
30 void *baton, const clang::DeclContext *DC, clang::DeclarationName Name,
31 llvm::SmallVectorImpl<clang::NamedDecl *> *results);
32 typedef bool (*LayoutRecordTypeCallback)(
33 void *baton, const clang::RecordDecl *Record, uint64_t &Size,
35 llvm::DenseMap<const clang::FieldDecl *, uint64_t> &FieldOffsets,
36 llvm::DenseMap<const clang::CXXRecordDecl *, clang::CharUnits>
38 llvm::DenseMap<const clang::CXXRecordDecl *, clang::CharUnits>
41 ClangExternalASTSourceCallbacks(
42 CompleteTagDeclCallback tag_decl_callback,
43 CompleteObjCInterfaceDeclCallback objc_decl_callback,
44 FindExternalVisibleDeclsByNameCallback find_by_name_callback,
45 LayoutRecordTypeCallback layout_record_type_callback,
47 : m_callback_tag_decl(tag_decl_callback),
48 m_callback_objc_decl(objc_decl_callback),
49 m_callback_find_by_name(find_by_name_callback),
50 m_callback_layout_record_type(layout_record_type_callback),
51 m_callback_baton(callback_baton) {}
53 // clang::ExternalASTSource
55 clang::Decl *GetExternalDecl(uint32_t ID) override {
56 // This method only needs to be implemented if the AST source ever passes
57 // back decl sets as VisibleDeclaration objects.
61 clang::Stmt *GetExternalDeclStmt(uint64_t Offset) override {
62 // This operation is meant to be used via a LazyOffsetPtr. It only needs
63 // to be implemented if the AST source uses methods like
64 // FunctionDecl::setLazyBody when building decls.
68 clang::Selector GetExternalSelector(uint32_t ID) override {
69 // This operation only needs to be implemented if the AST source returns
70 // non-zero for GetNumKnownSelectors().
71 return clang::Selector();
74 uint32_t GetNumExternalSelectors() override { return 0; }
76 clang::CXXBaseSpecifier *
77 GetExternalCXXBaseSpecifiers(uint64_t Offset) override {
81 virtual void MaterializeVisibleDecls(const clang::DeclContext *decl_ctx) {}
83 void FindExternalLexicalDecls(
84 const clang::DeclContext *DC,
85 llvm::function_ref<bool(clang::Decl::Kind)> IsKindWeWant,
86 llvm::SmallVectorImpl<clang::Decl *> &Result) override;
89 FindExternalVisibleDeclsByName(const clang::DeclContext *decl_ctx,
90 clang::DeclarationName decl_name) override;
92 void CompleteType(clang::TagDecl *tag_decl) override;
94 void CompleteType(clang::ObjCInterfaceDecl *objc_decl) override;
96 bool layoutRecordType(
97 const clang::RecordDecl *Record, uint64_t &Size, uint64_t &Alignment,
98 llvm::DenseMap<const clang::FieldDecl *, uint64_t> &FieldOffsets,
99 llvm::DenseMap<const clang::CXXRecordDecl *, clang::CharUnits>
101 llvm::DenseMap<const clang::CXXRecordDecl *, clang::CharUnits>
102 &VirtualBaseOffsets) override;
104 void SetExternalSourceCallbacks(
105 CompleteTagDeclCallback tag_decl_callback,
106 CompleteObjCInterfaceDeclCallback objc_decl_callback,
107 FindExternalVisibleDeclsByNameCallback find_by_name_callback,
108 LayoutRecordTypeCallback layout_record_type_callback,
109 void *callback_baton) {
110 m_callback_tag_decl = tag_decl_callback;
111 m_callback_objc_decl = objc_decl_callback;
112 m_callback_find_by_name = find_by_name_callback;
113 m_callback_layout_record_type = layout_record_type_callback;
114 m_callback_baton = callback_baton;
117 void RemoveExternalSourceCallbacks(void *callback_baton) {
118 if (callback_baton == m_callback_baton) {
119 m_callback_tag_decl = nullptr;
120 m_callback_objc_decl = nullptr;
121 m_callback_find_by_name = nullptr;
122 m_callback_layout_record_type = nullptr;
127 // Classes that inherit from ClangExternalASTSourceCallbacks can see and
129 CompleteTagDeclCallback m_callback_tag_decl;
130 CompleteObjCInterfaceDeclCallback m_callback_objc_decl;
131 FindExternalVisibleDeclsByNameCallback m_callback_find_by_name;
132 LayoutRecordTypeCallback m_callback_layout_record_type;
133 void *m_callback_baton;
136 } // namespace lldb_private
138 #endif // liblldb_ClangExternalASTSourceCallbacks_h_