//===-- 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
#include "clang/AST/CharUnits.h"

// Project includes
#include "lldb/lldb-enumerations.h"
#include "lldb/Core/ClangForward.h"
#include "lldb/Symbol/ClangASTType.h"
#include "lldb/Symbol/ClangExternalASTSourceCommon.h"

namespace lldb_private {

class ClangExternalASTSourceCallbacks : public ClangExternalASTSourceCommon
{
public:

    typedef void (*CompleteTagDeclCallback)(void *baton, clang::TagDecl *);
    typedef void (*CompleteObjCInterfaceDeclCallback)(void *baton, clang::ObjCInterfaceDecl *);
    typedef void (*FindExternalVisibleDeclsByNameCallback)(void *baton, const clang::DeclContext *DC, clang::DeclarationName Name, llvm::SmallVectorImpl <clang::NamedDecl *> *results);
    typedef bool (*LayoutRecordTypeCallback)(void *baton, 
                                             const clang::RecordDecl *Record,
                                             uint64_t &Size, 
                                             uint64_t &Alignment,
                                             llvm::DenseMap <const clang::FieldDecl *, uint64_t> &FieldOffsets,
                                             llvm::DenseMap <const clang::CXXRecordDecl *, clang::CharUnits> &BaseOffsets,
                                             llvm::DenseMap <const clang::CXXRecordDecl *, clang::CharUnits> &VirtualBaseOffsets);

    ClangExternalASTSourceCallbacks (CompleteTagDeclCallback tag_decl_callback,
                                     CompleteObjCInterfaceDeclCallback objc_decl_callback,
                                     FindExternalVisibleDeclsByNameCallback find_by_name_callback,
                                     LayoutRecordTypeCallback layout_record_type_callback,
                                     void *callback_baton) :
        m_callback_tag_decl (tag_decl_callback),
        m_callback_objc_decl (objc_decl_callback),
        m_callback_find_by_name (find_by_name_callback),
        m_callback_layout_record_type (layout_record_type_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 clang::ExternalLoadResult 
    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.
        return clang::ELR_Failure;
    }
    
    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);
    
    bool 
    layoutRecordType(const clang::RecordDecl *Record,
                     uint64_t &Size, 
                     uint64_t &Alignment,
                     llvm::DenseMap <const clang::FieldDecl *, uint64_t> &FieldOffsets,
                     llvm::DenseMap <const clang::CXXRecordDecl *, clang::CharUnits> &BaseOffsets,
                     llvm::DenseMap <const clang::CXXRecordDecl *, clang::CharUnits> &VirtualBaseOffsets);
    void
    SetExternalSourceCallbacks (CompleteTagDeclCallback tag_decl_callback,
                                CompleteObjCInterfaceDeclCallback objc_decl_callback,
                                FindExternalVisibleDeclsByNameCallback find_by_name_callback,
                                LayoutRecordTypeCallback layout_record_type_callback,
                                void *callback_baton)
    {
        m_callback_tag_decl = tag_decl_callback;
        m_callback_objc_decl = objc_decl_callback;
        m_callback_find_by_name = find_by_name_callback;
        m_callback_layout_record_type = layout_record_type_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;
            m_callback_find_by_name = NULL;
            m_callback_layout_record_type = NULL;
        }
    }

protected:
    //------------------------------------------------------------------
    // Classes that inherit from ClangExternalASTSourceCallbacks can see and modify these
    //------------------------------------------------------------------
    CompleteTagDeclCallback                 m_callback_tag_decl;
    CompleteObjCInterfaceDeclCallback       m_callback_objc_decl;
    FindExternalVisibleDeclsByNameCallback  m_callback_find_by_name;
    LayoutRecordTypeCallback                m_callback_layout_record_type;
    void *                                  m_callback_baton;
};

} // namespace lldb_private

#endif  // liblldb_ClangExternalASTSourceCallbacks_h_
