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