ClangExternalASTSourceCallbacks.h revision 360660
1//===-- ClangExternalASTSourceCallbacks.h -----------------------*- C++ -*-===// 2// 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 6// 7//===----------------------------------------------------------------------===// 8 9#ifndef liblldb_ClangExternalASTSourceCallbacks_h_ 10#define liblldb_ClangExternalASTSourceCallbacks_h_ 11 12#include <stdint.h> 13 14#include "clang/AST/CharUnits.h" 15#include "llvm/ADT/DenseMap.h" 16 17#include "lldb/Core/ClangForward.h" 18#include "lldb/Symbol/ClangExternalASTSourceCommon.h" 19#include "lldb/Symbol/CompilerType.h" 20#include "lldb/lldb-enumerations.h" 21 22namespace lldb_private { 23 24class ClangExternalASTSourceCallbacks : public ClangExternalASTSourceCommon { 25public: 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, 34 uint64_t &Alignment, 35 llvm::DenseMap<const clang::FieldDecl *, uint64_t> &FieldOffsets, 36 llvm::DenseMap<const clang::CXXRecordDecl *, clang::CharUnits> 37 &BaseOffsets, 38 llvm::DenseMap<const clang::CXXRecordDecl *, clang::CharUnits> 39 &VirtualBaseOffsets); 40 41 ClangExternalASTSourceCallbacks( 42 CompleteTagDeclCallback tag_decl_callback, 43 CompleteObjCInterfaceDeclCallback objc_decl_callback, 44 FindExternalVisibleDeclsByNameCallback find_by_name_callback, 45 LayoutRecordTypeCallback layout_record_type_callback, 46 void *callback_baton) 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) {} 52 53 // clang::ExternalASTSource 54 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. 58 return nullptr; 59 } 60 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. 65 return nullptr; 66 } 67 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(); 72 } 73 74 uint32_t GetNumExternalSelectors() override { return 0; } 75 76 clang::CXXBaseSpecifier * 77 GetExternalCXXBaseSpecifiers(uint64_t Offset) override { 78 return nullptr; 79 } 80 81 virtual void MaterializeVisibleDecls(const clang::DeclContext *decl_ctx) {} 82 83 void FindExternalLexicalDecls( 84 const clang::DeclContext *DC, 85 llvm::function_ref<bool(clang::Decl::Kind)> IsKindWeWant, 86 llvm::SmallVectorImpl<clang::Decl *> &Result) override; 87 88 bool 89 FindExternalVisibleDeclsByName(const clang::DeclContext *decl_ctx, 90 clang::DeclarationName decl_name) override; 91 92 void CompleteType(clang::TagDecl *tag_decl) override; 93 94 void CompleteType(clang::ObjCInterfaceDecl *objc_decl) override; 95 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> 100 &BaseOffsets, 101 llvm::DenseMap<const clang::CXXRecordDecl *, clang::CharUnits> 102 &VirtualBaseOffsets) override; 103 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; 115 } 116 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; 123 } 124 } 125 126protected: 127 // Classes that inherit from ClangExternalASTSourceCallbacks can see and 128 // modify these 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; 134}; 135 136} // namespace lldb_private 137 138#endif // liblldb_ClangExternalASTSourceCallbacks_h_ 139