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_
17 // Other libraries and framework includes
18 #include "clang/AST/CharUnits.h"
19 #include "llvm/ADT/DenseMap.h"
22 #include "lldb/Core/ClangForward.h"
23 #include "lldb/Symbol/ClangExternalASTSourceCommon.h"
24 #include "lldb/Symbol/CompilerType.h"
25 #include "lldb/lldb-enumerations.h"
27 namespace lldb_private {
29 class ClangExternalASTSourceCallbacks : public ClangExternalASTSourceCommon {
31 typedef void (*CompleteTagDeclCallback)(void *baton, clang::TagDecl *);
32 typedef void (*CompleteObjCInterfaceDeclCallback)(void *baton,
33 clang::ObjCInterfaceDecl *);
34 typedef void (*FindExternalVisibleDeclsByNameCallback)(
35 void *baton, const clang::DeclContext *DC, clang::DeclarationName Name,
36 llvm::SmallVectorImpl<clang::NamedDecl *> *results);
37 typedef bool (*LayoutRecordTypeCallback)(
38 void *baton, const clang::RecordDecl *Record, uint64_t &Size,
40 llvm::DenseMap<const clang::FieldDecl *, uint64_t> &FieldOffsets,
41 llvm::DenseMap<const clang::CXXRecordDecl *, clang::CharUnits>
43 llvm::DenseMap<const clang::CXXRecordDecl *, clang::CharUnits>
46 ClangExternalASTSourceCallbacks(
47 CompleteTagDeclCallback tag_decl_callback,
48 CompleteObjCInterfaceDeclCallback objc_decl_callback,
49 FindExternalVisibleDeclsByNameCallback find_by_name_callback,
50 LayoutRecordTypeCallback layout_record_type_callback,
52 : m_callback_tag_decl(tag_decl_callback),
53 m_callback_objc_decl(objc_decl_callback),
54 m_callback_find_by_name(find_by_name_callback),
55 m_callback_layout_record_type(layout_record_type_callback),
56 m_callback_baton(callback_baton) {}
58 //------------------------------------------------------------------
59 // clang::ExternalASTSource
60 //------------------------------------------------------------------
62 clang::Decl *GetExternalDecl(uint32_t ID) override {
63 // This method only needs to be implemented if the AST source ever
64 // passes back decl sets as VisibleDeclaration objects.
68 clang::Stmt *GetExternalDeclStmt(uint64_t Offset) override {
69 // This operation is meant to be used via a LazyOffsetPtr. It only
70 // needs to be implemented if the AST source uses methods like
71 // FunctionDecl::setLazyBody when building decls.
75 clang::Selector GetExternalSelector(uint32_t ID) override {
76 // This operation only needs to be implemented if the AST source
77 // returns non-zero for GetNumKnownSelectors().
78 return clang::Selector();
81 uint32_t GetNumExternalSelectors() override { return 0; }
83 clang::CXXBaseSpecifier *
84 GetExternalCXXBaseSpecifiers(uint64_t Offset) override {
88 virtual void MaterializeVisibleDecls(const clang::DeclContext *decl_ctx) {}
90 void FindExternalLexicalDecls(
91 const clang::DeclContext *DC,
92 llvm::function_ref<bool(clang::Decl::Kind)> IsKindWeWant,
93 llvm::SmallVectorImpl<clang::Decl *> &Result) override;
96 FindExternalVisibleDeclsByName(const clang::DeclContext *decl_ctx,
97 clang::DeclarationName decl_name) override;
99 void CompleteType(clang::TagDecl *tag_decl) override;
101 void CompleteType(clang::ObjCInterfaceDecl *objc_decl) override;
103 bool layoutRecordType(
104 const clang::RecordDecl *Record, uint64_t &Size, uint64_t &Alignment,
105 llvm::DenseMap<const clang::FieldDecl *, uint64_t> &FieldOffsets,
106 llvm::DenseMap<const clang::CXXRecordDecl *, clang::CharUnits>
108 llvm::DenseMap<const clang::CXXRecordDecl *, clang::CharUnits>
109 &VirtualBaseOffsets) override;
111 void SetExternalSourceCallbacks(
112 CompleteTagDeclCallback tag_decl_callback,
113 CompleteObjCInterfaceDeclCallback objc_decl_callback,
114 FindExternalVisibleDeclsByNameCallback find_by_name_callback,
115 LayoutRecordTypeCallback layout_record_type_callback,
116 void *callback_baton) {
117 m_callback_tag_decl = tag_decl_callback;
118 m_callback_objc_decl = objc_decl_callback;
119 m_callback_find_by_name = find_by_name_callback;
120 m_callback_layout_record_type = layout_record_type_callback;
121 m_callback_baton = callback_baton;
124 void RemoveExternalSourceCallbacks(void *callback_baton) {
125 if (callback_baton == m_callback_baton) {
126 m_callback_tag_decl = nullptr;
127 m_callback_objc_decl = nullptr;
128 m_callback_find_by_name = nullptr;
129 m_callback_layout_record_type = nullptr;
134 //------------------------------------------------------------------
135 // Classes that inherit from ClangExternalASTSourceCallbacks can see and
137 //------------------------------------------------------------------
138 CompleteTagDeclCallback m_callback_tag_decl;
139 CompleteObjCInterfaceDeclCallback m_callback_objc_decl;
140 FindExternalVisibleDeclsByNameCallback m_callback_find_by_name;
141 LayoutRecordTypeCallback m_callback_layout_record_type;
142 void *m_callback_baton;
145 } // namespace lldb_private
147 #endif // liblldb_ClangExternalASTSourceCallbacks_h_