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