1 //===-- ClangExternalASTSourceCallbacks.h -----------------------*- C++ -*-===//
3 // The LLVM Compiler Infrastructure
5 // This file is distributed under the University of Illinois Open Source
6 // License. See LICENSE.TXT for details.
8 //===----------------------------------------------------------------------===//
10 #ifndef liblldb_ClangExternalASTSourceCallbacks_h_
11 #define liblldb_ClangExternalASTSourceCallbacks_h_
15 #include "clang/AST/CharUnits.h"
16 #include "llvm/ADT/DenseMap.h"
18 #include "lldb/Core/ClangForward.h"
19 #include "lldb/Symbol/ClangExternalASTSourceCommon.h"
20 #include "lldb/Symbol/CompilerType.h"
21 #include "lldb/lldb-enumerations.h"
23 namespace lldb_private {
25 class ClangExternalASTSourceCallbacks : public ClangExternalASTSourceCommon {
27 typedef void (*CompleteTagDeclCallback)(void *baton, clang::TagDecl *);
28 typedef void (*CompleteObjCInterfaceDeclCallback)(void *baton,
29 clang::ObjCInterfaceDecl *);
30 typedef void (*FindExternalVisibleDeclsByNameCallback)(
31 void *baton, const clang::DeclContext *DC, clang::DeclarationName Name,
32 llvm::SmallVectorImpl<clang::NamedDecl *> *results);
33 typedef bool (*LayoutRecordTypeCallback)(
34 void *baton, const clang::RecordDecl *Record, uint64_t &Size,
36 llvm::DenseMap<const clang::FieldDecl *, uint64_t> &FieldOffsets,
37 llvm::DenseMap<const clang::CXXRecordDecl *, clang::CharUnits>
39 llvm::DenseMap<const clang::CXXRecordDecl *, clang::CharUnits>
42 ClangExternalASTSourceCallbacks(
43 CompleteTagDeclCallback tag_decl_callback,
44 CompleteObjCInterfaceDeclCallback objc_decl_callback,
45 FindExternalVisibleDeclsByNameCallback find_by_name_callback,
46 LayoutRecordTypeCallback layout_record_type_callback,
48 : m_callback_tag_decl(tag_decl_callback),
49 m_callback_objc_decl(objc_decl_callback),
50 m_callback_find_by_name(find_by_name_callback),
51 m_callback_layout_record_type(layout_record_type_callback),
52 m_callback_baton(callback_baton) {}
54 //------------------------------------------------------------------
55 // clang::ExternalASTSource
56 //------------------------------------------------------------------
58 clang::Decl *GetExternalDecl(uint32_t ID) override {
59 // This method only needs to be implemented if the AST source ever passes
60 // back decl sets as VisibleDeclaration objects.
64 clang::Stmt *GetExternalDeclStmt(uint64_t Offset) override {
65 // This operation is meant to be used via a LazyOffsetPtr. It only needs
66 // to be implemented if the AST source uses methods like
67 // FunctionDecl::setLazyBody when building decls.
71 clang::Selector GetExternalSelector(uint32_t ID) override {
72 // This operation only needs to be implemented if the AST source returns
73 // non-zero for GetNumKnownSelectors().
74 return clang::Selector();
77 uint32_t GetNumExternalSelectors() override { return 0; }
79 clang::CXXBaseSpecifier *
80 GetExternalCXXBaseSpecifiers(uint64_t Offset) override {
84 virtual void MaterializeVisibleDecls(const clang::DeclContext *decl_ctx) {}
86 void FindExternalLexicalDecls(
87 const clang::DeclContext *DC,
88 llvm::function_ref<bool(clang::Decl::Kind)> IsKindWeWant,
89 llvm::SmallVectorImpl<clang::Decl *> &Result) override;
92 FindExternalVisibleDeclsByName(const clang::DeclContext *decl_ctx,
93 clang::DeclarationName decl_name) override;
95 void CompleteType(clang::TagDecl *tag_decl) override;
97 void CompleteType(clang::ObjCInterfaceDecl *objc_decl) override;
99 bool layoutRecordType(
100 const clang::RecordDecl *Record, uint64_t &Size, uint64_t &Alignment,
101 llvm::DenseMap<const clang::FieldDecl *, uint64_t> &FieldOffsets,
102 llvm::DenseMap<const clang::CXXRecordDecl *, clang::CharUnits>
104 llvm::DenseMap<const clang::CXXRecordDecl *, clang::CharUnits>
105 &VirtualBaseOffsets) override;
107 void SetExternalSourceCallbacks(
108 CompleteTagDeclCallback tag_decl_callback,
109 CompleteObjCInterfaceDeclCallback objc_decl_callback,
110 FindExternalVisibleDeclsByNameCallback find_by_name_callback,
111 LayoutRecordTypeCallback layout_record_type_callback,
112 void *callback_baton) {
113 m_callback_tag_decl = tag_decl_callback;
114 m_callback_objc_decl = objc_decl_callback;
115 m_callback_find_by_name = find_by_name_callback;
116 m_callback_layout_record_type = layout_record_type_callback;
117 m_callback_baton = callback_baton;
120 void RemoveExternalSourceCallbacks(void *callback_baton) {
121 if (callback_baton == m_callback_baton) {
122 m_callback_tag_decl = nullptr;
123 m_callback_objc_decl = nullptr;
124 m_callback_find_by_name = nullptr;
125 m_callback_layout_record_type = nullptr;
130 //------------------------------------------------------------------
131 // Classes that inherit from ClangExternalASTSourceCallbacks can see and
133 //------------------------------------------------------------------
134 CompleteTagDeclCallback m_callback_tag_decl;
135 CompleteObjCInterfaceDeclCallback m_callback_objc_decl;
136 FindExternalVisibleDeclsByNameCallback m_callback_find_by_name;
137 LayoutRecordTypeCallback m_callback_layout_record_type;
138 void *m_callback_baton;
141 } // namespace lldb_private
143 #endif // liblldb_ClangExternalASTSourceCallbacks_h_