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