ClangExternalASTSourceCallbacks.h revision d8b65024a03833688b487535d6b8710bc2ffdd51
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 <memory>
18d8b65024a03833688b487535d6b8710bc2ffdd51Greg Clayton#include <stdint.h>
19d8b65024a03833688b487535d6b8710bc2ffdd51Greg Clayton
20d8b65024a03833688b487535d6b8710bc2ffdd51Greg Clayton// Other libraries and framework includes
21d8b65024a03833688b487535d6b8710bc2ffdd51Greg Clayton
22d8b65024a03833688b487535d6b8710bc2ffdd51Greg Clayton// Clang headers like to use NDEBUG inside of them to enable/disable debug
23d8b65024a03833688b487535d6b8710bc2ffdd51Greg Clayton// releated features using "#ifndef NDEBUG" preprocessor blocks to do one thing
24d8b65024a03833688b487535d6b8710bc2ffdd51Greg Clayton// or another. This is bad because it means that if clang was built in release
25d8b65024a03833688b487535d6b8710bc2ffdd51Greg Clayton// mode, it assumes that you are building in release mode which is not always
26d8b65024a03833688b487535d6b8710bc2ffdd51Greg Clayton// the case. You can end up with functions that are defined as empty in header
27d8b65024a03833688b487535d6b8710bc2ffdd51Greg Clayton// files when NDEBUG is not defined, and this can cause link errors with the
28d8b65024a03833688b487535d6b8710bc2ffdd51Greg Clayton// clang .a files that you have since you might be missing functions in the .a
29d8b65024a03833688b487535d6b8710bc2ffdd51Greg Clayton// file. So we have to define NDEBUG when including clang headers to avoid any
30d8b65024a03833688b487535d6b8710bc2ffdd51Greg Clayton// mismatches. This is covered by rdar://problem/8691220
31d8b65024a03833688b487535d6b8710bc2ffdd51Greg Clayton
32d8b65024a03833688b487535d6b8710bc2ffdd51Greg Clayton#ifndef NDEBUG
33d8b65024a03833688b487535d6b8710bc2ffdd51Greg Clayton#define LLDB_DEFINED_NDEBUG_FOR_CLANG
34d8b65024a03833688b487535d6b8710bc2ffdd51Greg Clayton#define NDEBUG
35d8b65024a03833688b487535d6b8710bc2ffdd51Greg Clayton// Need to include assert.h so it is as clang would expect it to be (disabled)
36d8b65024a03833688b487535d6b8710bc2ffdd51Greg Clayton#include <assert.h>
37d8b65024a03833688b487535d6b8710bc2ffdd51Greg Clayton#endif
38d8b65024a03833688b487535d6b8710bc2ffdd51Greg Clayton
39d8b65024a03833688b487535d6b8710bc2ffdd51Greg Clayton#include "clang/AST/ExternalASTSource.h"
40d8b65024a03833688b487535d6b8710bc2ffdd51Greg Clayton
41d8b65024a03833688b487535d6b8710bc2ffdd51Greg Clayton#ifdef LLDB_DEFINED_NDEBUG_FOR_CLANG
42d8b65024a03833688b487535d6b8710bc2ffdd51Greg Clayton#undef NDEBUG
43d8b65024a03833688b487535d6b8710bc2ffdd51Greg Clayton#undef LLDB_DEFINED_NDEBUG_FOR_CLANG
44d8b65024a03833688b487535d6b8710bc2ffdd51Greg Clayton// Need to re-include assert.h so it is as _we_ would expect it to be (enabled)
45d8b65024a03833688b487535d6b8710bc2ffdd51Greg Clayton#include <assert.h>
46d8b65024a03833688b487535d6b8710bc2ffdd51Greg Clayton#endif
47d8b65024a03833688b487535d6b8710bc2ffdd51Greg Clayton
48d8b65024a03833688b487535d6b8710bc2ffdd51Greg Clayton// Project includes
49d8b65024a03833688b487535d6b8710bc2ffdd51Greg Clayton#include "lldb/lldb-enumerations.h"
50d8b65024a03833688b487535d6b8710bc2ffdd51Greg Clayton#include "lldb/Core/ClangForward.h"
51d8b65024a03833688b487535d6b8710bc2ffdd51Greg Clayton#include "lldb/Symbol/ClangASTType.h"
52d8b65024a03833688b487535d6b8710bc2ffdd51Greg Clayton
53d8b65024a03833688b487535d6b8710bc2ffdd51Greg Claytonnamespace lldb_private {
54d8b65024a03833688b487535d6b8710bc2ffdd51Greg Clayton
55d8b65024a03833688b487535d6b8710bc2ffdd51Greg Claytonclass ClangExternalASTSourceCallbacks : public clang::ExternalASTSource
56d8b65024a03833688b487535d6b8710bc2ffdd51Greg Clayton{
57d8b65024a03833688b487535d6b8710bc2ffdd51Greg Claytonpublic:
58d8b65024a03833688b487535d6b8710bc2ffdd51Greg Clayton
59d8b65024a03833688b487535d6b8710bc2ffdd51Greg Clayton    typedef void (*CompleteTagDeclCallback)(void *baton, clang::TagDecl *);
60d8b65024a03833688b487535d6b8710bc2ffdd51Greg Clayton    typedef void (*CompleteObjCInterfaceDeclCallback)(void *baton, clang::ObjCInterfaceDecl *);
61d8b65024a03833688b487535d6b8710bc2ffdd51Greg Clayton
62d8b65024a03833688b487535d6b8710bc2ffdd51Greg Clayton
63d8b65024a03833688b487535d6b8710bc2ffdd51Greg Clayton    ClangExternalASTSourceCallbacks (CompleteTagDeclCallback tag_decl_callback,
64d8b65024a03833688b487535d6b8710bc2ffdd51Greg Clayton                                     CompleteObjCInterfaceDeclCallback objc_decl_callback,
65d8b65024a03833688b487535d6b8710bc2ffdd51Greg Clayton                                     void *callback_baton) :
66d8b65024a03833688b487535d6b8710bc2ffdd51Greg Clayton        m_callback_tag_decl (tag_decl_callback),
67d8b65024a03833688b487535d6b8710bc2ffdd51Greg Clayton        m_callback_objc_decl (objc_decl_callback),
68d8b65024a03833688b487535d6b8710bc2ffdd51Greg Clayton        m_callback_baton (callback_baton)
69d8b65024a03833688b487535d6b8710bc2ffdd51Greg Clayton    {
70d8b65024a03833688b487535d6b8710bc2ffdd51Greg Clayton    }
71d8b65024a03833688b487535d6b8710bc2ffdd51Greg Clayton
72d8b65024a03833688b487535d6b8710bc2ffdd51Greg Clayton    //------------------------------------------------------------------
73d8b65024a03833688b487535d6b8710bc2ffdd51Greg Clayton    // clang::ExternalASTSource
74d8b65024a03833688b487535d6b8710bc2ffdd51Greg Clayton    //------------------------------------------------------------------
75d8b65024a03833688b487535d6b8710bc2ffdd51Greg Clayton
76d8b65024a03833688b487535d6b8710bc2ffdd51Greg Clayton    virtual clang::Decl *
77d8b65024a03833688b487535d6b8710bc2ffdd51Greg Clayton    GetExternalDecl (uint32_t ID)
78d8b65024a03833688b487535d6b8710bc2ffdd51Greg Clayton    {
79d8b65024a03833688b487535d6b8710bc2ffdd51Greg Clayton        // This method only needs to be implemented if the AST source ever
80d8b65024a03833688b487535d6b8710bc2ffdd51Greg Clayton        // passes back decl sets as VisibleDeclaration objects.
81d8b65024a03833688b487535d6b8710bc2ffdd51Greg Clayton        return 0;
82d8b65024a03833688b487535d6b8710bc2ffdd51Greg Clayton    }
83d8b65024a03833688b487535d6b8710bc2ffdd51Greg Clayton
84d8b65024a03833688b487535d6b8710bc2ffdd51Greg Clayton    virtual clang::Stmt *
85d8b65024a03833688b487535d6b8710bc2ffdd51Greg Clayton    GetExternalDeclStmt (uint64_t Offset)
86d8b65024a03833688b487535d6b8710bc2ffdd51Greg Clayton    {
87d8b65024a03833688b487535d6b8710bc2ffdd51Greg Clayton        // This operation is meant to be used via a LazyOffsetPtr.  It only
88d8b65024a03833688b487535d6b8710bc2ffdd51Greg Clayton        // needs to be implemented if the AST source uses methods like
89d8b65024a03833688b487535d6b8710bc2ffdd51Greg Clayton        // FunctionDecl::setLazyBody when building decls.
90d8b65024a03833688b487535d6b8710bc2ffdd51Greg Clayton        return 0;
91d8b65024a03833688b487535d6b8710bc2ffdd51Greg Clayton    }
92d8b65024a03833688b487535d6b8710bc2ffdd51Greg Clayton
93d8b65024a03833688b487535d6b8710bc2ffdd51Greg Clayton    virtual clang::Selector
94d8b65024a03833688b487535d6b8710bc2ffdd51Greg Clayton    GetExternalSelector (uint32_t ID)
95d8b65024a03833688b487535d6b8710bc2ffdd51Greg Clayton    {
96d8b65024a03833688b487535d6b8710bc2ffdd51Greg Clayton        // This operation only needs to be implemented if the AST source
97d8b65024a03833688b487535d6b8710bc2ffdd51Greg Clayton        // returns non-zero for GetNumKnownSelectors().
98d8b65024a03833688b487535d6b8710bc2ffdd51Greg Clayton        return clang::Selector();
99d8b65024a03833688b487535d6b8710bc2ffdd51Greg Clayton    }
100d8b65024a03833688b487535d6b8710bc2ffdd51Greg Clayton
101d8b65024a03833688b487535d6b8710bc2ffdd51Greg Clayton	virtual uint32_t
102d8b65024a03833688b487535d6b8710bc2ffdd51Greg Clayton    GetNumExternalSelectors()
103d8b65024a03833688b487535d6b8710bc2ffdd51Greg Clayton    {
104d8b65024a03833688b487535d6b8710bc2ffdd51Greg Clayton        return 0;
105d8b65024a03833688b487535d6b8710bc2ffdd51Greg Clayton    }
106d8b65024a03833688b487535d6b8710bc2ffdd51Greg Clayton
107d8b65024a03833688b487535d6b8710bc2ffdd51Greg Clayton    virtual clang::CXXBaseSpecifier *
108d8b65024a03833688b487535d6b8710bc2ffdd51Greg Clayton    GetExternalCXXBaseSpecifiers(uint64_t Offset)
109d8b65024a03833688b487535d6b8710bc2ffdd51Greg Clayton    {
110d8b65024a03833688b487535d6b8710bc2ffdd51Greg Clayton        return NULL;
111d8b65024a03833688b487535d6b8710bc2ffdd51Greg Clayton    }
112d8b65024a03833688b487535d6b8710bc2ffdd51Greg Clayton
113d8b65024a03833688b487535d6b8710bc2ffdd51Greg Clayton    virtual void
114d8b65024a03833688b487535d6b8710bc2ffdd51Greg Clayton    MaterializeVisibleDecls (const clang::DeclContext *decl_ctx)
115d8b65024a03833688b487535d6b8710bc2ffdd51Greg Clayton    {
116d8b65024a03833688b487535d6b8710bc2ffdd51Greg Clayton        return;
117d8b65024a03833688b487535d6b8710bc2ffdd51Greg Clayton    }
118d8b65024a03833688b487535d6b8710bc2ffdd51Greg Clayton
119d8b65024a03833688b487535d6b8710bc2ffdd51Greg Clayton	virtual bool
120d8b65024a03833688b487535d6b8710bc2ffdd51Greg Clayton    FindExternalLexicalDecls (const clang::DeclContext *decl_ctx,
121d8b65024a03833688b487535d6b8710bc2ffdd51Greg Clayton                              bool (*isKindWeWant)(clang::Decl::Kind),
122d8b65024a03833688b487535d6b8710bc2ffdd51Greg Clayton                              llvm::SmallVectorImpl<clang::Decl*> &decls)
123d8b65024a03833688b487535d6b8710bc2ffdd51Greg Clayton    {
124d8b65024a03833688b487535d6b8710bc2ffdd51Greg Clayton        // This is used to support iterating through an entire lexical context,
125d8b65024a03833688b487535d6b8710bc2ffdd51Greg Clayton        // which isn't something the debugger should ever need to do.
126d8b65024a03833688b487535d6b8710bc2ffdd51Greg Clayton        // true is for error, that's good enough for me
127d8b65024a03833688b487535d6b8710bc2ffdd51Greg Clayton        return true;
128d8b65024a03833688b487535d6b8710bc2ffdd51Greg Clayton    }
129d8b65024a03833688b487535d6b8710bc2ffdd51Greg Clayton
130d8b65024a03833688b487535d6b8710bc2ffdd51Greg Clayton    virtual clang::DeclContextLookupResult
131d8b65024a03833688b487535d6b8710bc2ffdd51Greg Clayton    FindExternalVisibleDeclsByName (const clang::DeclContext *decl_ctx,
132d8b65024a03833688b487535d6b8710bc2ffdd51Greg Clayton                                    clang::DeclarationName decl_name);
133d8b65024a03833688b487535d6b8710bc2ffdd51Greg Clayton
134d8b65024a03833688b487535d6b8710bc2ffdd51Greg Clayton    virtual void
135d8b65024a03833688b487535d6b8710bc2ffdd51Greg Clayton    CompleteType (clang::TagDecl *tag_decl);
136d8b65024a03833688b487535d6b8710bc2ffdd51Greg Clayton
137d8b65024a03833688b487535d6b8710bc2ffdd51Greg Clayton    virtual void
138d8b65024a03833688b487535d6b8710bc2ffdd51Greg Clayton    CompleteType (clang::ObjCInterfaceDecl *objc_decl);
139d8b65024a03833688b487535d6b8710bc2ffdd51Greg Clayton
140d8b65024a03833688b487535d6b8710bc2ffdd51Greg Clayton    void
141d8b65024a03833688b487535d6b8710bc2ffdd51Greg Clayton    SetExternalSourceCallbacks (CompleteTagDeclCallback tag_decl_callback,
142d8b65024a03833688b487535d6b8710bc2ffdd51Greg Clayton                                CompleteObjCInterfaceDeclCallback objc_decl_callback,
143d8b65024a03833688b487535d6b8710bc2ffdd51Greg Clayton                                void *callback_baton)
144d8b65024a03833688b487535d6b8710bc2ffdd51Greg Clayton    {
145d8b65024a03833688b487535d6b8710bc2ffdd51Greg Clayton        m_callback_tag_decl = tag_decl_callback;
146d8b65024a03833688b487535d6b8710bc2ffdd51Greg Clayton        m_callback_objc_decl = objc_decl_callback;
147d8b65024a03833688b487535d6b8710bc2ffdd51Greg Clayton        m_callback_baton = callback_baton;
148d8b65024a03833688b487535d6b8710bc2ffdd51Greg Clayton    }
149d8b65024a03833688b487535d6b8710bc2ffdd51Greg Clayton
150d8b65024a03833688b487535d6b8710bc2ffdd51Greg Clayton    void
151d8b65024a03833688b487535d6b8710bc2ffdd51Greg Clayton    RemoveExternalSourceCallbacks (void *callback_baton)
152d8b65024a03833688b487535d6b8710bc2ffdd51Greg Clayton    {
153d8b65024a03833688b487535d6b8710bc2ffdd51Greg Clayton        if (callback_baton == m_callback_baton)
154d8b65024a03833688b487535d6b8710bc2ffdd51Greg Clayton        {
155d8b65024a03833688b487535d6b8710bc2ffdd51Greg Clayton            m_callback_tag_decl = NULL;
156d8b65024a03833688b487535d6b8710bc2ffdd51Greg Clayton            m_callback_objc_decl = NULL;
157d8b65024a03833688b487535d6b8710bc2ffdd51Greg Clayton        }
158d8b65024a03833688b487535d6b8710bc2ffdd51Greg Clayton    }
159d8b65024a03833688b487535d6b8710bc2ffdd51Greg Clayton
160d8b65024a03833688b487535d6b8710bc2ffdd51Greg Claytonprotected:
161d8b65024a03833688b487535d6b8710bc2ffdd51Greg Clayton    //------------------------------------------------------------------
162d8b65024a03833688b487535d6b8710bc2ffdd51Greg Clayton    // Classes that inherit from ClangExternalASTSourceCallbacks can see and modify these
163d8b65024a03833688b487535d6b8710bc2ffdd51Greg Clayton    //------------------------------------------------------------------
164d8b65024a03833688b487535d6b8710bc2ffdd51Greg Clayton    CompleteTagDeclCallback                 m_callback_tag_decl;
165d8b65024a03833688b487535d6b8710bc2ffdd51Greg Clayton    CompleteObjCInterfaceDeclCallback       m_callback_objc_decl;
166d8b65024a03833688b487535d6b8710bc2ffdd51Greg Clayton    void *                                  m_callback_baton;
167d8b65024a03833688b487535d6b8710bc2ffdd51Greg Clayton};
168d8b65024a03833688b487535d6b8710bc2ffdd51Greg Clayton
169d8b65024a03833688b487535d6b8710bc2ffdd51Greg Clayton} // namespace lldb_private
170d8b65024a03833688b487535d6b8710bc2ffdd51Greg Clayton
171d8b65024a03833688b487535d6b8710bc2ffdd51Greg Clayton#endif  // liblldb_ClangExternalASTSourceCallbacks_h_
172