blob: 9137d1ed876be531358a0336c5d63b27c2801d6d [file] [log] [blame]
//===-- ClangExternalASTSourceCallbacks.h -----------------------*- C++ -*-===//
//
// The LLVM Compiler Infrastructure
//
// This file is distributed under the University of Illinois Open Source
// License. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//
#ifndef liblldb_ClangExternalASTSourceCallbacks_h_
#define liblldb_ClangExternalASTSourceCallbacks_h_
// C Includes
// C++ Includes
#include <string>
#include <vector>
#include <memory>
#include <stdint.h>
// Other libraries and framework includes
// Clang headers like to use NDEBUG inside of them to enable/disable debug
// releated features using "#ifndef NDEBUG" preprocessor blocks to do one thing
// or another. This is bad because it means that if clang was built in release
// mode, it assumes that you are building in release mode which is not always
// the case. You can end up with functions that are defined as empty in header
// files when NDEBUG is not defined, and this can cause link errors with the
// clang .a files that you have since you might be missing functions in the .a
// file. So we have to define NDEBUG when including clang headers to avoid any
// mismatches. This is covered by rdar://problem/8691220
#ifndef NDEBUG
#define LLDB_DEFINED_NDEBUG_FOR_CLANG
#define NDEBUG
// Need to include assert.h so it is as clang would expect it to be (disabled)
#include <assert.h>
#endif
#include "clang/AST/ExternalASTSource.h"
#ifdef LLDB_DEFINED_NDEBUG_FOR_CLANG
#undef NDEBUG
#undef LLDB_DEFINED_NDEBUG_FOR_CLANG
// Need to re-include assert.h so it is as _we_ would expect it to be (enabled)
#include <assert.h>
#endif
// Project includes
#include "lldb/lldb-enumerations.h"
#include "lldb/Core/ClangForward.h"
#include "lldb/Symbol/ClangASTType.h"
namespace lldb_private {
class ClangExternalASTSourceCallbacks : public clang::ExternalASTSource
{
public:
typedef void (*CompleteTagDeclCallback)(void *baton, clang::TagDecl *);
typedef void (*CompleteObjCInterfaceDeclCallback)(void *baton, clang::ObjCInterfaceDecl *);
ClangExternalASTSourceCallbacks (CompleteTagDeclCallback tag_decl_callback,
CompleteObjCInterfaceDeclCallback objc_decl_callback,
void *callback_baton) :
m_callback_tag_decl (tag_decl_callback),
m_callback_objc_decl (objc_decl_callback),
m_callback_baton (callback_baton)
{
}
//------------------------------------------------------------------
// clang::ExternalASTSource
//------------------------------------------------------------------
virtual clang::Decl *
GetExternalDecl (uint32_t ID)
{
// This method only needs to be implemented if the AST source ever
// passes back decl sets as VisibleDeclaration objects.
return 0;
}
virtual clang::Stmt *
GetExternalDeclStmt (uint64_t Offset)
{
// This operation is meant to be used via a LazyOffsetPtr. It only
// needs to be implemented if the AST source uses methods like
// FunctionDecl::setLazyBody when building decls.
return 0;
}
virtual clang::Selector
GetExternalSelector (uint32_t ID)
{
// This operation only needs to be implemented if the AST source
// returns non-zero for GetNumKnownSelectors().
return clang::Selector();
}
virtual uint32_t
GetNumExternalSelectors()
{
return 0;
}
virtual clang::CXXBaseSpecifier *
GetExternalCXXBaseSpecifiers(uint64_t Offset)
{
return NULL;
}
virtual void
MaterializeVisibleDecls (const clang::DeclContext *decl_ctx)
{
return;
}
virtual bool
FindExternalLexicalDecls (const clang::DeclContext *decl_ctx,
bool (*isKindWeWant)(clang::Decl::Kind),
llvm::SmallVectorImpl<clang::Decl*> &decls)
{
// This is used to support iterating through an entire lexical context,
// which isn't something the debugger should ever need to do.
// true is for error, that's good enough for me
return true;
}
virtual clang::DeclContextLookupResult
FindExternalVisibleDeclsByName (const clang::DeclContext *decl_ctx,
clang::DeclarationName decl_name);
virtual void
CompleteType (clang::TagDecl *tag_decl);
virtual void
CompleteType (clang::ObjCInterfaceDecl *objc_decl);
void
SetExternalSourceCallbacks (CompleteTagDeclCallback tag_decl_callback,
CompleteObjCInterfaceDeclCallback objc_decl_callback,
void *callback_baton)
{
m_callback_tag_decl = tag_decl_callback;
m_callback_objc_decl = objc_decl_callback;
m_callback_baton = callback_baton;
}
void
RemoveExternalSourceCallbacks (void *callback_baton)
{
if (callback_baton == m_callback_baton)
{
m_callback_tag_decl = NULL;
m_callback_objc_decl = NULL;
}
}
protected:
//------------------------------------------------------------------
// Classes that inherit from ClangExternalASTSourceCallbacks can see and modify these
//------------------------------------------------------------------
CompleteTagDeclCallback m_callback_tag_decl;
CompleteObjCInterfaceDeclCallback m_callback_objc_decl;
void * m_callback_baton;
};
} // namespace lldb_private
#endif // liblldb_ClangExternalASTSourceCallbacks_h_