ClangExternalASTSourceCallbacks.h revision 3fc0c4f12b19f1e2bd276d2b6eb0fdd096a01414
1//===-- ClangExternalASTSourceCallbacks.h -----------------------*- C++ -*-===// 2// 3// The LLVM Compiler Infrastructure 4// 5// This file is distributed under the University of Illinois Open Source 6// License. See LICENSE.TXT for details. 7// 8//===----------------------------------------------------------------------===// 9 10#ifndef liblldb_ClangExternalASTSourceCallbacks_h_ 11#define liblldb_ClangExternalASTSourceCallbacks_h_ 12 13// C Includes 14// C++ Includes 15#include <string> 16#include <vector> 17#include <memory> 18#include <stdint.h> 19 20// Other libraries and framework includes 21#include "clang/AST/CharUnits.h" 22 23// Project includes 24#include "lldb/lldb-enumerations.h" 25#include "lldb/Core/ClangForward.h" 26#include "lldb/Symbol/ClangASTType.h" 27#include "lldb/Symbol/ClangExternalASTSourceCommon.h" 28 29namespace lldb_private { 30 31class ClangExternalASTSourceCallbacks : public ClangExternalASTSourceCommon 32{ 33public: 34 35 typedef void (*CompleteTagDeclCallback)(void *baton, clang::TagDecl *); 36 typedef void (*CompleteObjCInterfaceDeclCallback)(void *baton, clang::ObjCInterfaceDecl *); 37 typedef void (*FindExternalVisibleDeclsByNameCallback)(void *baton, const clang::DeclContext *DC, clang::DeclarationName Name, llvm::SmallVectorImpl <clang::NamedDecl *> *results); 38 typedef bool (*LayoutRecordTypeCallback)(void *baton, 39 const clang::RecordDecl *Record, 40 uint64_t &Size, 41 uint64_t &Alignment, 42 llvm::DenseMap <const clang::FieldDecl *, uint64_t> &FieldOffsets, 43 llvm::DenseMap <const clang::CXXRecordDecl *, clang::CharUnits> &BaseOffsets, 44 llvm::DenseMap <const clang::CXXRecordDecl *, clang::CharUnits> &VirtualBaseOffsets); 45 46 ClangExternalASTSourceCallbacks (CompleteTagDeclCallback tag_decl_callback, 47 CompleteObjCInterfaceDeclCallback objc_decl_callback, 48 FindExternalVisibleDeclsByNameCallback find_by_name_callback, 49 LayoutRecordTypeCallback layout_record_type_callback, 50 void *callback_baton) : 51 m_callback_tag_decl (tag_decl_callback), 52 m_callback_objc_decl (objc_decl_callback), 53 m_callback_find_by_name (find_by_name_callback), 54 m_callback_layout_record_type (layout_record_type_callback), 55 m_callback_baton (callback_baton) 56 { 57 } 58 59 //------------------------------------------------------------------ 60 // clang::ExternalASTSource 61 //------------------------------------------------------------------ 62 63 virtual clang::Decl * 64 GetExternalDecl (uint32_t ID) 65 { 66 // This method only needs to be implemented if the AST source ever 67 // passes back decl sets as VisibleDeclaration objects. 68 return 0; 69 } 70 71 virtual clang::Stmt * 72 GetExternalDeclStmt (uint64_t Offset) 73 { 74 // This operation is meant to be used via a LazyOffsetPtr. It only 75 // needs to be implemented if the AST source uses methods like 76 // FunctionDecl::setLazyBody when building decls. 77 return 0; 78 } 79 80 virtual clang::Selector 81 GetExternalSelector (uint32_t ID) 82 { 83 // This operation only needs to be implemented if the AST source 84 // returns non-zero for GetNumKnownSelectors(). 85 return clang::Selector(); 86 } 87 88 virtual uint32_t 89 GetNumExternalSelectors() 90 { 91 return 0; 92 } 93 94 virtual clang::CXXBaseSpecifier * 95 GetExternalCXXBaseSpecifiers(uint64_t Offset) 96 { 97 return NULL; 98 } 99 100 virtual void 101 MaterializeVisibleDecls (const clang::DeclContext *decl_ctx) 102 { 103 return; 104 } 105 106 virtual clang::ExternalLoadResult 107 FindExternalLexicalDecls (const clang::DeclContext *decl_ctx, 108 bool (*isKindWeWant)(clang::Decl::Kind), 109 llvm::SmallVectorImpl<clang::Decl*> &decls) 110 { 111 // This is used to support iterating through an entire lexical context, 112 // which isn't something the debugger should ever need to do. 113 return clang::ELR_Failure; 114 } 115 116 virtual clang::DeclContextLookupResult 117 FindExternalVisibleDeclsByName (const clang::DeclContext *decl_ctx, 118 clang::DeclarationName decl_name); 119 120 virtual void 121 CompleteType (clang::TagDecl *tag_decl); 122 123 virtual void 124 CompleteType (clang::ObjCInterfaceDecl *objc_decl); 125 126 void 127 SetExternalSourceCallbacks (CompleteTagDeclCallback tag_decl_callback, 128 CompleteObjCInterfaceDeclCallback objc_decl_callback, 129 FindExternalVisibleDeclsByNameCallback find_by_name_callback, 130 LayoutRecordTypeCallback layout_record_type_callback, 131 void *callback_baton) 132 { 133 m_callback_tag_decl = tag_decl_callback; 134 m_callback_objc_decl = objc_decl_callback; 135 m_callback_find_by_name = find_by_name_callback; 136 m_callback_layout_record_type = layout_record_type_callback; 137 m_callback_baton = callback_baton; 138 } 139 140 void 141 RemoveExternalSourceCallbacks (void *callback_baton) 142 { 143 if (callback_baton == m_callback_baton) 144 { 145 m_callback_tag_decl = NULL; 146 m_callback_objc_decl = NULL; 147 m_callback_find_by_name = NULL; 148 m_callback_layout_record_type = NULL; 149 } 150 } 151 152protected: 153 //------------------------------------------------------------------ 154 // Classes that inherit from ClangExternalASTSourceCallbacks can see and modify these 155 //------------------------------------------------------------------ 156 CompleteTagDeclCallback m_callback_tag_decl; 157 CompleteObjCInterfaceDeclCallback m_callback_objc_decl; 158 FindExternalVisibleDeclsByNameCallback m_callback_find_by_name; 159 LayoutRecordTypeCallback m_callback_layout_record_type; 160 void * m_callback_baton; 161}; 162 163} // namespace lldb_private 164 165#endif // liblldb_ClangExternalASTSourceCallbacks_h_ 166