ClangExternalASTSourceCallbacks.h revision 355940
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