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_
19 // Other libraries and framework includes
20 #include "clang/AST/CharUnits.h"
23 #include "lldb/lldb-enumerations.h"
24 #include "lldb/Core/ClangForward.h"
25 #include "lldb/Symbol/ClangASTType.h"
26 #include "lldb/Symbol/ClangExternalASTSourceCommon.h"
28 namespace lldb_private {
30 class ClangExternalASTSourceCallbacks : public ClangExternalASTSourceCommon
34 typedef void (*CompleteTagDeclCallback)(void *baton, clang::TagDecl *);
35 typedef void (*CompleteObjCInterfaceDeclCallback)(void *baton, clang::ObjCInterfaceDecl *);
36 typedef void (*FindExternalVisibleDeclsByNameCallback)(void *baton, const clang::DeclContext *DC, clang::DeclarationName Name, llvm::SmallVectorImpl <clang::NamedDecl *> *results);
37 typedef bool (*LayoutRecordTypeCallback)(void *baton,
38 const clang::RecordDecl *Record,
41 llvm::DenseMap <const clang::FieldDecl *, uint64_t> &FieldOffsets,
42 llvm::DenseMap <const clang::CXXRecordDecl *, clang::CharUnits> &BaseOffsets,
43 llvm::DenseMap <const clang::CXXRecordDecl *, clang::CharUnits> &VirtualBaseOffsets);
45 ClangExternalASTSourceCallbacks (CompleteTagDeclCallback tag_decl_callback,
46 CompleteObjCInterfaceDeclCallback objc_decl_callback,
47 FindExternalVisibleDeclsByNameCallback find_by_name_callback,
48 LayoutRecordTypeCallback layout_record_type_callback,
49 void *callback_baton) :
50 m_callback_tag_decl (tag_decl_callback),
51 m_callback_objc_decl (objc_decl_callback),
52 m_callback_find_by_name (find_by_name_callback),
53 m_callback_layout_record_type (layout_record_type_callback),
54 m_callback_baton (callback_baton)
58 //------------------------------------------------------------------
59 // clang::ExternalASTSource
60 //------------------------------------------------------------------
63 GetExternalDecl (uint32_t ID)
65 // This method only needs to be implemented if the AST source ever
66 // passes back decl sets as VisibleDeclaration objects.
71 GetExternalDeclStmt (uint64_t Offset)
73 // This operation is meant to be used via a LazyOffsetPtr. It only
74 // needs to be implemented if the AST source uses methods like
75 // FunctionDecl::setLazyBody when building decls.
79 virtual clang::Selector
80 GetExternalSelector (uint32_t ID)
82 // This operation only needs to be implemented if the AST source
83 // returns non-zero for GetNumKnownSelectors().
84 return clang::Selector();
88 GetNumExternalSelectors()
93 virtual clang::CXXBaseSpecifier *
94 GetExternalCXXBaseSpecifiers(uint64_t Offset)
100 MaterializeVisibleDecls (const clang::DeclContext *decl_ctx)
105 virtual clang::ExternalLoadResult
106 FindExternalLexicalDecls (const clang::DeclContext *decl_ctx,
107 bool (*isKindWeWant)(clang::Decl::Kind),
108 llvm::SmallVectorImpl<clang::Decl*> &decls)
110 // This is used to support iterating through an entire lexical context,
111 // which isn't something the debugger should ever need to do.
112 return clang::ELR_Failure;
116 FindExternalVisibleDeclsByName (const clang::DeclContext *decl_ctx,
117 clang::DeclarationName decl_name);
120 CompleteType (clang::TagDecl *tag_decl);
123 CompleteType (clang::ObjCInterfaceDecl *objc_decl);
126 layoutRecordType(const clang::RecordDecl *Record,
129 llvm::DenseMap <const clang::FieldDecl *, uint64_t> &FieldOffsets,
130 llvm::DenseMap <const clang::CXXRecordDecl *, clang::CharUnits> &BaseOffsets,
131 llvm::DenseMap <const clang::CXXRecordDecl *, clang::CharUnits> &VirtualBaseOffsets);
133 SetExternalSourceCallbacks (CompleteTagDeclCallback tag_decl_callback,
134 CompleteObjCInterfaceDeclCallback objc_decl_callback,
135 FindExternalVisibleDeclsByNameCallback find_by_name_callback,
136 LayoutRecordTypeCallback layout_record_type_callback,
137 void *callback_baton)
139 m_callback_tag_decl = tag_decl_callback;
140 m_callback_objc_decl = objc_decl_callback;
141 m_callback_find_by_name = find_by_name_callback;
142 m_callback_layout_record_type = layout_record_type_callback;
143 m_callback_baton = callback_baton;
147 RemoveExternalSourceCallbacks (void *callback_baton)
149 if (callback_baton == m_callback_baton)
151 m_callback_tag_decl = NULL;
152 m_callback_objc_decl = NULL;
153 m_callback_find_by_name = NULL;
154 m_callback_layout_record_type = NULL;
159 //------------------------------------------------------------------
160 // Classes that inherit from ClangExternalASTSourceCallbacks can see and modify these
161 //------------------------------------------------------------------
162 CompleteTagDeclCallback m_callback_tag_decl;
163 CompleteObjCInterfaceDeclCallback m_callback_objc_decl;
164 FindExternalVisibleDeclsByNameCallback m_callback_find_by_name;
165 LayoutRecordTypeCallback m_callback_layout_record_type;
166 void * m_callback_baton;
169 } // namespace lldb_private
171 #endif // liblldb_ClangExternalASTSourceCallbacks_h_