ClangExternalASTSourceCallbacks.h revision 79e9f965938ec5766b9caedfa85262ecb603c453
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 bool
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    bool
127    layoutRecordType(const clang::RecordDecl *Record,
128                     uint64_t &Size,
129                     uint64_t &Alignment,
130                     llvm::DenseMap <const clang::FieldDecl *, uint64_t> &FieldOffsets,
131                     llvm::DenseMap <const clang::CXXRecordDecl *, clang::CharUnits> &BaseOffsets,
132                     llvm::DenseMap <const clang::CXXRecordDecl *, clang::CharUnits> &VirtualBaseOffsets);
133    void
134    SetExternalSourceCallbacks (CompleteTagDeclCallback tag_decl_callback,
135                                CompleteObjCInterfaceDeclCallback objc_decl_callback,
136                                FindExternalVisibleDeclsByNameCallback find_by_name_callback,
137                                LayoutRecordTypeCallback layout_record_type_callback,
138                                void *callback_baton)
139    {
140        m_callback_tag_decl = tag_decl_callback;
141        m_callback_objc_decl = objc_decl_callback;
142        m_callback_find_by_name = find_by_name_callback;
143        m_callback_layout_record_type = layout_record_type_callback;
144        m_callback_baton = callback_baton;
145    }
146
147    void
148    RemoveExternalSourceCallbacks (void *callback_baton)
149    {
150        if (callback_baton == m_callback_baton)
151        {
152            m_callback_tag_decl = NULL;
153            m_callback_objc_decl = NULL;
154            m_callback_find_by_name = NULL;
155            m_callback_layout_record_type = NULL;
156        }
157    }
158
159protected:
160    //------------------------------------------------------------------
161    // Classes that inherit from ClangExternalASTSourceCallbacks can see and modify these
162    //------------------------------------------------------------------
163    CompleteTagDeclCallback                 m_callback_tag_decl;
164    CompleteObjCInterfaceDeclCallback       m_callback_objc_decl;
165    FindExternalVisibleDeclsByNameCallback  m_callback_find_by_name;
166    LayoutRecordTypeCallback                m_callback_layout_record_type;
167    void *                                  m_callback_baton;
168};
169
170} // namespace lldb_private
171
172#endif  // liblldb_ClangExternalASTSourceCallbacks_h_
173